挂接API~ 高手请进~ 在线等
我写了一个可执行模块DataSpy.exe, 在这个可执行模块中我调用了API函数::TextOutA(),这样gdi32.dll就出现在了可执行模块的输入节中;并且,我用WriteProcessMemory函数成功的改写了可执行模块的IAT的中TextOutA项,实现了对API函数::TextOutA()的挂接。
现在我不直接调用API函数::TextOutA(),转而调用CDC::TextOut()进行输出。我们知道MFC42D.dll是通过调用API函数::TextOutA()来实现CDC::TextOut()的,当我想再用WriteProcessMemory函数修改MFC42D.dll的输入节来挂接::TextOutA()时,问题出现了!函数WriteProcessMemory没有成功的修改掉MFC42D.dll的IAT,返回FALSE,调用GetLastError()得到998 - !我就纳闷了,难道MFC42d.dll的输入节不允许改写吗,MFC42d.dll在进程中的加载地址是0x5f400000啊?
我是这样调用的,
WriteProcessMemory(GetCurrentProcess(),
&(pThunk->u1.Function),//我已成功找到了::TextOutA对应的项
&pfnNew,
sizeof(pfnNew),
NULL);
高手请指点小第一二,不胜感激,先谢了~
问题点数:20、回复次数:10Top
1 楼singlerace(独行者)回复于 2006-01-17 11:17:52 得分 20
1,看一下pThunk->u1.Function的值是多少,确定不是forward funtion;
2,看一下pThunk->u1.Ordinal,确定是ordinal还是name pointer。Top
2 楼Joe_Cai(超级小强)回复于 2006-01-17 11:21:17 得分 0
我看下Top
3 楼Joe_Cai(超级小强)回复于 2006-01-17 11:30:17 得分 0
Debug时的值如下:
pThunk 0x5f4ab008 __imp__TextOutA@20
|
- u1 {...}
|
+ ForwarderString 0x77efbc0c "(乱码)"
+ Function 0x77efbc0c
Ordinal 0x77efbc0c
+ AddressOfData 0x77efbc0cTop
4 楼Joe_Cai(超级小强)回复于 2006-01-17 11:31:54 得分 0
能看出什么吗?Top
5 楼singlerace(独行者)回复于 2006-01-17 12:00:36 得分 0
1,&(pThunk->u1.Function)--这个值是否在MFC42d.dll中?
2,你的thunk是指向OriginalFirstThunk还是FirstThunk?
Top
6 楼Joe_Cai(超级小强)回复于 2006-01-17 12:34:38 得分 0
1.MFC42D.dll的加载地址是 0x5f4ab000
pThunk->u1.Function的地址是 0x5f4ab008, 它应该是第3个
2.OriginalFirstThunk的值是 0x000c3b98
FirstThunk的值是 0x000ab000Top
7 楼Joe_Cai(超级小强)回复于 2006-01-17 12:43:25 得分 0
说错了,MFC42d.dll的加载地址是 0x5f400000Top
8 楼Joe_Cai(超级小强)回复于 2006-01-17 12:56:15 得分 0
我知道怎么回事了!
&pThunk->u1.Function所在的页面的属性是PAGE_READONLY~
靠,MS为什么要把MFC库的IAT设成PAGE_READONLY啊!我看能不能把它改成PAGE_READWRITE :)Top
9 楼amei2000go(浪子)回复于 2006-01-18 13:40:10 得分 0
Windows2000 的系统已经都是调用 W 函数了,调用 A 函数是早期的系统吧!Top
10 楼jwt3003()回复于 2006-01-21 13:38:03 得分 0
我做了基本跟你一样的东西不过我改写MFC42.DLL的IAT时非常成功,只是当我枚举所有加载模块逐个改写以后就出现了问题。Top




