首页
社区
课程
招聘
[原创]关于远程注入
发表于: 2009-1-21 00:10 13978

[原创]关于远程注入

2009-1-21 00:10
13978

注入 DLL 之远程线程
大家都知道,在 Win32 中每个进程都拥有一个独立的 40 亿字节的内存空间,也就是 4 GB ,这个 4 GB 的内存空间相对于进程来说是独立的,也就是说,你不能在你的进程空间内直接操作别的进程的空间,因为内存相对于进程来说独立的,这样做的好处其实很多,比如,一个进程出现错误,不会影响到整个系统,还有就是可以防止一个进程破坏另一个进程,这些对于编程来说是非常有利的,因为自己的进程出错,并不会影响到其他的进程。
独立的进程空间虽然可以使进程之间不受影响,但是,当我们要想操作,或想控制别的进程就变得困难了。
前面说过,每个进程进程都有一个独立的 4 GB 空间,无论你在这块空间里乱写乱画,都不会影响到其他进程,最多就是自己的进程会死掉。独立的 4 GB  空间,似乎阻断了进程之间的通道了吗?不是的,虽然 Win32 里说不可以操作别的进程内存,但是仍然可以的。
Microsoft 并没有使这条路变成死路,在 Win32 API 中提供了 2 个函数,WriteProcessMemory 和 ReadProcessMemory,这两个函数可以在指定的进程的内存里做读写操作,有了这 2 个函数,我们就可以读写其他进程的内存了,进程之间的界限也就被打破,那么,我上面写的不就是废话了吗,呵呵,不是的,他们的毕竟还是 NT 架构和非 NT 架构的属性,在 NT 架构中打开进程是要权限的,不过仍然可以绕过?
有了 WriteProcessMemory 和 ReadProcessMemory函数,我们就可以读写其他进程的内存,不过呢,我们并不满足单纯的读与写,我们可能希望别的进程我们的代码,呵呵,你没有看错,我也没有写错,你可能会说,怎么可以让别的进程执行我们自己的代码的呢?莫非是把代码写到别的进程里吗?呵呵,当然可以的了,不过,如果是把代码写到别的进程的内存空间里的话,会很困难的,因为目标进程不可能也没必要知道你代码的入口点,设想一下,如果我们把自己的代码写到某个进程的内存空间里的话,再让那个进程来执行写入的代码,会发生什么呢,首先,不存在访问违规,第 2 ,因为你已经把代码写到别的进程去了,即使你的进程已经退出,只要那个进程不退出,那么你写入的代码句可以一直执行,也就是可以实现无进程,当然,如果那个进程退出了,那么写入的代码也就会退出。
那么现在的问题就是,如何写入代码到别的进程里和如何让别的进程执行我们写入的代码了,要解决这两个问题,有必要说说进程和线程。
进程,就是一个程序的执行实例,一个程序没有运行的时候,是保存在磁盘里的,此时他仅仅是一个 2 进制文件而已,但是如果你双击它的图标的时候,系统就会运行它,记住,是系统去运行它,而不是它自己运行,运行以后,系统就会为它创建一个映像(用 CreateProcess),也就是它的进程,也称为实例,不过进程是不可以做任何事情的,因为进程只是一个容器而已,一个被创建了的进程,系统会为它分配内存空间,分配句柄,分配 ID ,分配权限,还会为它加载需要的 DLL 文件,前面说过,进程不能做任何事情,是的,进程只是一个容器,它里面装着至少一个线程,而线程就是程序的执行单元,是用来做各种事情的。
线程,就是程序的执行单元,一个进程至少有一个线程,这是系统自动创建的,不过线程和子线程都可以创建线程。线程才是一个真正的程序,而进程只是组织这些线程的,还有线程之间是可以互相操作的,因为他们在同一个内存空间里,一般来说,当进程被结束时,系统会在该进程的每个线程中插入一段代码,这段代码会调用 ExitThread 函数来退出自己的线程,也就是说,线程是自己退出的,当最后一个线程退出后,进程也就退出了。
好了,理解了进程和线程后,我们就来把自己的代码写到别的进程空间里和让其执行吧!
首先呢,在 Win32 API 中,有一个叫做 CreateRemoteThread 的函数,这个函数可以在别的进程中创建一个线程,…可是不要高兴得太早,首先呢,线程是作为一个函数出现的,而且这个线程的函数一定要是在目标进程的内存空间中,因为指针不可能跨进程,其次,就是如何写入自己代码,说到写入代码,通常就是在目标进程中写入 LoadLiraryA ,让其来加载我们的 DLL 文件,也就是说,我们在目标进程中写入的代码,也就是创建的线程,功能仅仅是加载一个 DLL 文件而已,当加载完后,这个线程就会自动退出,而那个加载进来的 DLL 文件的 DllMain 函数就开始运行了,通常也是在 DllMain 中创建一个线程,用 CreateThread ,记住,这个线程是在目标进程中创建的了,因为这个 DLL 文件已经被加载到了目标进程中,这就叫做远程线程注入。
好了,也许你会问,既然指针不能跨进程,那么 LoadLiraryA 的参数就是一个指针字符,那么用 CreateRemoteThread 创建远线程时,传给LoadLibraryA 的参数是在本进程中的,那在目标进程中的 LoadLibraryA 又怎么可以找到传给自己的参数呢,是的,这确实找不到,因为指针在本进程中有效存到目标进程中就不再有效了,也就是说在目标进程创建的线程LoadLibraryA 将会失效,因为指针传到过来后就指到另一个地方了,传给 LoadLibraryA 的根本就不是一个 DLL 路径。
要解决这个问题,首先就先将 DLL 的路径名写到目标进程中,然后再创建远线程,传给 LoadLibraryA 的参数就是目标进程中存放 DLL 路径的地址,因为指针本来就是传地址的。好了,这个问题真的这么容易就解决了吗?当然不是,因为把 DLL 的路径名写到目标进程中,那么,因该写到那里去呢?呵呵,首先用 VirtualAllocEx 来在目标进程中分配一个内存空间,然后再在这个空间中把 DLL 的路径名写到目标进程中,然后创建远线程,把这个空间的地址传给LoadLibraryA ,因为这样 DLL 的路径名就在目标进程里了,LoadLibraryA 也就可以正确加载 DLL 了,然后 DLL 就可以响应 DLL_PROCESS_ATTACH,然后就可以创建线程了,然后那个 EXE 就可以退出了,只要被注入的进程不退出,那么 DLL 文件将一直运行。
呵,打中文打到手都累了,下面再折磨下自己,把实现代码也写出来吧!

 const DWORD THREADSIZE=1024*4;
 HANDLE pRemoteThread,hRemoteProcess;
 PTHREAD_START_ROUTINE pfnAddr;
 DWORD pId;
 void *pFileRemote;
 
 HWND hWinPro=::FindWindow("ProgMan",NULL);                                                 
if(!hWinPro)
  return 0;
 else
 {
  ::GetWindowThreadProcessId(hWinPro,&pId);  
  hRemoteProcess=::OpenProcess(PROCESS_ALL_ACCESS,false,pId);   
pFileRemote=::VirtualAllocEx(hRemoteProcess,0,THREADSIZE,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
  if(!::WriteProcessMemory(hRemoteProcess,pFileRemote,"d:\\RemoteDll.dll",THREADSIZE,NULL))
   return;
  pfnAddr=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryA");
  pRemoteThread=::CreateRemoteThread(hRemoteProcess,NULL,0,pfnAddr,pFileRemote,0,NULL);
  if(pRemoteThread==NULL)
   return;
  else MessageBox("success!");
}
}

好了,远程线程注入就说到这里,在开头我从进程内存空间,一直说到把 DLL 注入到进程的内存,也可以是比较详细的吧。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (32)
雪    币: 311
活跃值: (124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
路过,学习ing...
2009-1-21 02:20
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
做个板凳吧。
2009-1-21 09:22
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
请排版把 看的眼花
2009-1-21 09:34
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
现在应该考虑保护方面的。
2009-1-21 12:02
0
雪    币: 233
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我是新手,学习中......
2009-1-22 06:33
0
雪    币: 77
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我是新手,学习中......
2009-1-28 18:34
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
是否有其他方法起到HOOK的作用,感谢

因CreateRemoteThread函数,大都被杀毒软件监控的

如我自己的进程A, 调用B.exe, 启动进程BB, 是否有方法Hook进程BB, 感谢
不是做坏事,麻烦指教
2009-2-3 19:41
0
雪    币: 141
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mol
9
路过,学习ing...
2009-2-3 20:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
路过,学习ing...
2009-2-3 20:24
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
要是把相关的知识整理下,做个电子书。就更爽了!
2009-2-5 11:52
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习中...
2009-2-9 16:52
0
雪    币: 297
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
13
writeprocessmemory
setthreadcontext
2009-2-12 21:45
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
刚好在学这个  不过还看得懂
2009-3-23 00:21
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
请问楼主,被DEBUG的进程,也就是类似
使用DEBUG_PROCESS参数CreateProcess出来的进程能远程注入么?
2009-3-23 09:46
0
雪    币: 299
活跃值: (25)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
16
WriteProcessMemory做啥??

把你那个DLL改成32.dll名copy过去,难道那什么进程里面连32.dll这么几个字符都找不出来??
2009-3-23 09:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
挺详细的,顶了!!我正要学这方面的知识呢
2009-3-27 13:03
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
超级潜水艇,你的处女帖被我发现了。
上传的附件:
2009-3-28 11:57
0
雪    币: 75
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学习中,谢谢楼主

还想请教一下,对于调试来说,怎么样才能够下断找到注入的数据
2009-5-12 10:34
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
       必须WriteProcessMemory,跨进程的指针是无意义的
      还有LZ,其实不用注入DLL也是可以将线程注入的,呵呵
2009-5-13 00:42
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
提供思想具体可能还是自己去实现
2009-5-20 17:13
0
雪    币: 155
活跃值: (29)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
22
顶个
学习类似程序中
2009-5-21 01:05
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
23
能,OD加载运行的进程,可以用其它工具注入DLL,我这么干过
2009-5-21 09:40
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
24
楼主文采不错嘛~~~
DLL注入这东西,几句话就可以说清楚的事,写了这么大一篇,不过,知识面挺广的,介绍得挺全面的
终于知道什么叫写书了,值得学习
2009-5-21 09:43
0
雪    币: 983
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
学习学习 先谢了 ..............
2009-5-21 12:21
0
游客
登录 | 注册 方可回帖
返回
//