首页
社区
课程
招聘
[原创]Windows系统程序设计之插入DLL和挂接API
发表于: 2006-6-12 03:47 29963

[原创]Windows系统程序设计之插入DLL和挂接API

2006-6-12 03:47
29963
收藏
免费 7
支持
分享
最新回复 (58)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
太好了,好文一定要顶
2006-6-14 13:50
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
楼主为啥子?
我下 下来的代码运行不起,还报错:cannot open include file 'res\IPPack,rc2'

而且软件运行的也不理想
2006-6-15 11:16
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
28
最初由 我爱罗 发布
楼主为啥子?
我下 下来的代码运行不起,还报错:cannot open include file 'res\IPPack,rc2'

而且软件运行的也不理想


在上传附件的时候不小心把图标资源res文件夹删了,
编译报错,一直按F4,把对应行注释掉就行了,不影响程序执行

运行不理想很正常,
这个小软件的目标是演示HOOK API 及插入DLL的实际应用,
仅仅HOOK了send, sendto, recv, recvfrom四个函数,如果目标进程用其他的函数进行数据传输的话,就根本不起作用
真正要效果好的话,要在驱动级别实现
2006-6-15 11:51
0
雪    币: 538
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
回完贴,然后开始仔细看
2006-6-15 22:08
0
雪    币: 241
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
顶一下,收藏慢慢学习!
2006-6-15 23:42
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
不错

如果论坛多几个北极

就好了
2006-6-16 15:36
0
雪    币: 431
活跃值: (442)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
32
作得想个毕业设计,恐怕真是毕业设计的话老师没几个看得懂的。
2006-6-18 10:19
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
好象,不能截获数据包
2006-6-20 15:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
学习之中...............
2006-6-21 05:42
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
版主:好象,不能截获数据包,我都调试了两天了,
我都快疯了.你能把调试好的,能截获数据包的程序发给我吗?
我的把它搞明白啊.
我的EMAIL:monk0123456@126.com
2006-6-21 17:18
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
36
最初由 我爱罗 发布
版主:好象,不能截获数据包,我都调试了两天了,
我都快疯了.你能把调试好的,能截获数据包的程序发给我吗?
我的把它搞明白啊.
我的EMAIL:monk0123456@126.com


已经给你发了
这个帖子的附件里也有
2006-6-21 22:29
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
我写了一个简单的通讯程序,为什么不能捕获数据包了?
为什么我运行这个程序的时候,并不是像你在贴子上演示的呢?
我的邮箱不能发邮件了,你可以加我的QQ吗?
QQ:279405290
2006-6-22 11:11
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
不错,顶一下先。
2006-6-22 11:26
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
39
最初由 我爱罗 发布
我写了一个简单的通讯程序,为什么不能捕获数据包了?
为什么我运行这个程序的时候,并不是像你在贴子上演示的呢?
我的邮箱不能发邮件了,你可以加我的QQ吗?
QQ:279405290


HOOK_send.Hook                ( "wsock32.dll", "send",                (FARPROC)MY_send ) ;
HOOK_recv.Hook                ( "wsock32.dll", "recv",                (FARPROC)MY_recv ) ;
HOOK_sendto.Hook        ( "wsock32.dll", "sendto",                (FARPROC)MY_sendto ) ;
HOOK_recvfrom.Hook        ( "wsock32.dll", "recvfrom",        (FARPROC)MY_recvfrom ) ;
注意这里,我HOOK的是wsock32.dll

而你的TcpServer用PE打开后没有wsock32.dll,只有win2_32.dll,函数库不同,所以也就是说HOOK失败
这里我的软件写的也有漏洞,在CFEAHook失败时没抱错

你的软件我这里不能编译
#include "../common/InitSock.h"
估计你在这里导入了win2_32.dll

试着让他导入wsock32.dll
#include "winsock2.h"
#pragma comment ( lib, "ws2_32.lib" )

HOOK_send.Hook                ( "wsock32.dll", "send",        (FARPROC)MY_send ) ;
HOOK_recv.Hook                ( "wsock32.dll", "recv",        (FARPROC)MY_recv ) ;
HOOK_sendto.Hook        ( "wsock32.dll", "sendto",        (FARPROC)MY_sendto ) ;
HOOK_recvfrom.Hook        ( "wsock32.dll", "recvfrom",        (FARPROC)MY_recvfrom ) ;
或者你可以直接把wsock32.dll直接改成win2_32.dll

总之问题就在这里,知道了原因,至于怎么改都无所谓了

由于我的失误,对你在学习时造成不必要的麻烦,深感谦意
2006-6-22 12:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
好文章,学了很多东西
2006-7-1 13:57
0
雪    币: 214
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
41
支持一下
2006-7-1 15:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
真是强人呀
我要是会就好了
2006-7-1 23:23
0
雪    币: 214
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
43
强烈支持学习中...
2006-7-3 10:46
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
44
支持楼主,好铁
2006-7-6 22:32
0
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
45
第一次看的时候,没看明白,所以没回贴
今天看明白了点,所以回贴,做个记录点,嘻嘻
2006-7-7 14:30
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
46
最初由 sbright 发布

大哥如果写文章太累,可以把自己可以发的代码发出来,写个大概说明就好.
其他牛b的大虾们也支持一下啊,多发发你们的程序.强烈支持北极星,来,亲一个.....

2006-7-7 15:49
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
47
最初由 prince 发布
北极星辛苦!
2006-7-15 17:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
支持!下载学习学习
2006-7-22 05:40
0
雪    币: 139
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
49
1。一般的方法使用CreateRemoteThread()在目标进程中创建一个thread,让该thread来LoadLibrary(你的DLL)。

到目前为止我在网上看到的该方法的实现代码都基本上雷同,一个共同的大前提是假定在你的process和目标process里,LoadLibrary(A/W)的entry point是一样的。因为LoadLibraryA/LoadLibraryW是kernel32.dll输出的,而该DLL一般而言在不同的进程的virtual memory space里是在同样的地方(不同的Windows版本倒是有可能不同),不太会被rebase。所以看看你自己的进程里LoadLibrary的起始地址,就可以假定目标进程的LoadLibrary也是同样的起始地址。

2。用GetProcAddress()可以得到API的起始地址。但kernel32.dll是可以被rebase的,如果你的进程或者目标进程里的该DLL ImageBase变了,你的代码插入程序不会有事情,创建的远程线程倒是会垮掉。

3。这里作者的代码,比如(5)封装HOOK API入口地址覆盖到CFEAHook类,是有bug的。你怎么知道要patch的函数入口点的头5个字节一定是一个指令?万一它的第一个指令是1个到4个字节呢?你要使你的方法尽量通用化,就不能作这个假定。可以参考微软的Detours (http://research.microsoft.com/sn/detours/),看看它的entry point patching是如何做的。

4。API hook(SetWindowsHookEx):该方法的前提是进程有UI,或者说有user32.DLL。对Console program是白搭。

5。Hook的方法很多,可以参考

http://www.codeproject.com/system/hooksys.asp

6。原文:
“2、  存在的难点
由于IAT信息是在可执行文件初始化时经过PE加载器改写的,而不是原本的磁盘文件中的数据。问题就在这里,什么时候才是对IAT进行操作的最佳时机?PE加载器对IAT部分的改写是在什么时候完成的?如果仅仅创建挂起的进程,此时的加载器是否写入IAT信息?“

PE加载器在创建一个进程的时候,CreateProcess(...,CREATE_SUSPENDED, ...),它会遍历程序的import table,把相关的DLL加载进来,更新IAT,然后先是运行该DLL的CRTDllMain(),接着是它的DllMain()。如果该DLL依赖其它的DLL,就先载入其它的DLL,有些类似C++里对象的创建,先做父类的工作(constructor),然后是子类。IAT就是这个时候更新的。一直等到主要的thread context等等资源分配完毕,然后PE Loader就ResumeThread(你的主线程的threadid)。到这个时候DLL里的export table基本上没有用了,因为主程序的IAT里已经有了具体的地址。以后程序运行过程中也不会去看DLL的Export Table,直接到Import Table里去查去了,然后jump。
2006-8-3 06:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
50
下载来看看,还是源码好点
2006-8-15 20:29
0
游客
登录 | 注册 方可回帖
返回
//