首页
社区
课程
招聘
[求助]为什么我往IE中用CreateRemoteThread方法注入我的DLL总是失败??
2008-4-17 18:25 13323

[求助]为什么我往IE中用CreateRemoteThread方法注入我的DLL总是失败??

2008-4-17 18:25
13323
我的程序开始往Wscript.exe中注入,可以很正常的将我的DLL注入进去,但是:
如果往IE里面注入的话,总是失败,用LoadPE或ImportREC看不到我的DLL。


我跟踪的时候发现,VirtualAllocEx申请的空间,往里面写DLL名的时候,好像根本没有写进去……
主要代码如下:
    PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
      GetProcAddress(GetModuleHandle("Kernel32.dll"), "LoadLibraryA");
	
    //在目标进程申请空间,并将“TargetDll.dll”写入到目标进程空间中
    LPVOID proAddr = ::VirtualAllocEx(hPro, proAddr, strlen(dllName)+1, MEM_COMMIT, PAGE_READWRITE);

    if (!WriteProcessMemory(hPro, proAddr, (LPVOID)dllName, strlen(dllName)+1, NULL))
    {
		//写进程失败,不再对本进程操作
		return FALSE;
    }

    //将目标DLL注入到目标进程中
    HANDLE hThread = ::CreateRemoteThread(hPro, NULL, 0, pfnThreadRtn, (char *)proAddr, 0, NULL);
    if (hThread == NULL)
    {
		return FALSE;
    }
    ::WaitForSingleObject(hThread, INFINITE);



不知道大家有没有什么比较好什么软件可以动态的查看进程的内存,我用OD和WinDbg都无法打开这时候的iexplore.exe。

3Q

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞0
打赏
分享
最新回复 (19)
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
救世猪 1 2008-4-17 18:38
2
0
晕,刚用WinHex查看了一下
写进去了……
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
救世猪 1 2008-4-17 18:45
3
0
CreateRemoteThread执行后,返回的句柄是0x744
说明执行应该正常吧

但到后面:
WaitForSingleObject那儿就停那儿了……

再单步就单步不过去了~~~
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
busy 2008-4-17 19:25
4
0
貌似这个WaitForSingleObject 是等你那个线程结束时才返回的吧...
雪    币: 437
活跃值: (243)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
bzhkl 5 2008-4-17 19:32
5
0
dllName 全路径?

你可以在 IE中下断 LoadLibrary 看看哪里问题
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
救世猪 1 2008-4-17 19:47
6
0

dllName是全路经名
WaitForSingleObject是等待线程结束的,不过线程应该会很快结束的,因为我往Wscript.exe里面注入的时候,就很轻易的注入进去了~。
但现在实际上,线程没有结束,因为我将INFINITE改为3000之后,3秒之后就会将IE启动起来,但是,IE里面没有我的DLL

在IE中下断??
应该怎么操作?
这时候用OD也没法附加到IE上~,提示无法附加到进程
难道用SoftICE???
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
busy 2008-4-17 20:22
7
0
WaitForSingleObject 不返回说明的你线程肯定没有结束,检查你的DllMain函数是不是有问题
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
救世猪 1 2008-4-17 20:47
8
0
应该没有问题的
我的另一个程序,用了相同的方法,也用了同一个DLL
往Wscript.exe(脚本宿主)中注入,可以正常注入~
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caocunt 2008-4-17 20:53
9
0
楼主,最近写木马发了不少财吧?小心为妙
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
救世猪 1 2008-4-18 07:28
10
0
晕,呵呵,做毕业设计呢,我可不会写马
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
救世猪 1 2008-4-18 10:25
11
0
对了,还是有点区别的

我往Wscript.exe里面注入的时候,因为是在我的程序里面创建的Wscript.exe进程,所以创建进程的时候使用了CREATE_SUSPEND标志,以暂停进程,然后往里面注入就可以。

但是,用相同的方法,我启动IE进程的话,IE就不会出现~
运行之后没有任务反应。

所以我用了调试API,用了DEBUG_PROCESS标志,然后当进程刚启动之时,产生异常,转到我的程序,我在程序中,将入口点的代码设为0xcc,然后再运行程序,捕获断点异常,捕获到之后,就说明到了入口点,这样保证程序能进行完必要的初始化。从而再将DLL注入。然后我再将Eip-1,继续运行。

但是,就是这个时候,DLL注入不进去,这时候查看IE进程,有两个线程在执行,一个是我的线程,一个是主线程,我的线程好像就根本没法结束…………
雪    币: 299
活跃值: (25)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
zjjmjtoot 4 2008-4-18 10:42
12
0
有可能是编译器知道你想写马。
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
justlovemm 2008-4-19 14:18
13
0
超级智能编译器啊,可以从根本上解决马的问题啊,你这可是原创啊,把这个思想卖给编译器厂商,呵呵,发达了以后别忘了我,可是我提醒你这个有商业价值的。正所谓苟富贵,勿相忘
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wolfzhu 2008-4-21 10:10
14
0
是不是注入之前IE进程的LoadLibraryA已经被HOOK了?
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
救世猪 1 2008-4-21 14:04
15
0
具体的原因我还不太清楚
不过昨天晚上突然想到的:
当用Debug API的时候,如果父进程得到某个异常的发生,这时候,父进程得到通知后,子进程里面的全程应该全部是停止的,此时即使你用CreateRemoteThread,创建了线程也不能运行。
但是,今天早上我又改了一下,即:
得到CREATE_PROCESS_DEBUG_EVENT后,进行一些处理
然后,调用ContinueDebugEvent函数,继续执行被调试进程
调用完ConTinueDebugEvent函数后,立刻暂停主线程,即:
::SuspendThread(pi.hThread);
然后将DLL注入,此时用CreateRemoteThread后,该线程应该可以在被调试进程中执行,当注入完之后,我再ResumeThread

但事实证明,这样做还是不行……
单步的时候发现,还是CreateRemoteThread后,WaitForSingleObject函数一直无法返回……
貌视LoadLibrary函数还是执行不成功……

代码:
		if (dbgEvent.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT)
		{
			//继续执行进程
			::ContinueDebugEvent(dbgEvent.dwProcessId, dbgEvent.dwThreadId, DBG_CONTINUE);

			//将主线程停止,等待DLL注入成功之后再恢复		
			::SuspendThread(pi.hThread);

			//将目标DLL注入到子进程中
			CInjectDll	injDll;
			injDll.InjectDll(pi.hProcess, myDllName);

			::ResumeThread(pi.hThread);
			continue;
		}
雪    币: 8057
活跃值: (4345)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sunsjw 1 2008-4-21 14:43
16
0
楼猪:参考下这段代码,或许对你有帮助.
http://bbs.pediy.com/showthread.php?t=63344
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
救世猪 1 2008-4-21 14:57
17
0
刚刚知道:
CREATE_PROCESS_DEBUG_EVENT发生时,DLL一般还未加载……
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
救世猪 1 2008-4-21 18:30
18
0
哇哈哈!!!
注入DLL的问题终于解决了!!!!
用了Tls CallBack,激动…………
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ghostyp 2008-8-23 08:30
19
0
两种解决方法:
一将参数改为dll的全路径名;
二将dll放在环境变量path路径中
雪    币: 225
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rock 2008-8-29 11:13
20
0
不要调 WaitForSingleObject ,直接返回
游客
登录 | 注册 方可回帖
返回