首页
社区
课程
招聘
高手们, 来帮我看看这个函数,郁闷死我了! 谢谢
2006-6-2 21:33 4424

高手们, 来帮我看看这个函数,郁闷死我了! 谢谢

2006-6-2 21:33
4424
DWORD WINAPI HookAPI(LPVOID lpParam)
{
        HMODULE                        hMod;
        TEXTOUTA                           lpfnTextOutA;
        EXTTEXTOUTA                lpfnExtTextOutA;
        DWORD                        dwProtectA;
        DWORD                        dwProtectB;

        MEMORY_BASIC_INFORMATION        mbiA;
        MEMORY_BASIC_INFORMATION        mbiB;

        hMod = GetModuleHandle("GDI32.dll");
        lpfnTextOutA = (TEXTOUTA)GetProcAddress(hMod, "TextOutA");
        lpfnExtTextOutA = (EXTTEXTOUTA)GetProcAddres(hMod, "ExtTextOutA");

        VirtualQuery(lpfnTextOutA, &mbiA, sizeof(mbiA));
        VirtualQuery(lpfnExtTextOutA, &mbiB, sizeof(mbiB));

        VirtualProtect(
                lpfnTextOutA, 5,
                PAGE_READWRITE, &dwProtectA
        );

        VirtualProtect(
                lpfnExtTextOutA, 5,
                PAGE_READWRITE, &dwProtectB
        );

        WriteProcessMemory(
                GetCurrentProcess(),
                byTextOutAOldEntry,
                &lpfnTextOutA,
                5,
                NULL
        );
       

        WriteProcessMemory(
                GetCurrentProcess(),
                byExtTextOutAOldEntry,
                &lpfnExtTextOutA,   
                5,
                NULL
        );
       

        byTextOutANewEntry[0] = 0xE9;
        *((PDWORD)(byTextOutANewEntry + 1)) = (DWORD)(TextOutAProxy);   //改写原函数的入口地址

        byExtTextOutANewEntry[0] = 0xE9;
        *((PDWORD)(byExtTextOutANewEntry + 1)) = (DWORD)(ExtTextOutAProxy);   //注意这里, 改写原函数的入口地址

        WriteProcessMemory(
                GetCurrentProcess(),
                lpfnTextOutA,
                byTextOutANewEntry,       
                5,
                NULL
        );
        //MessageBox(NULL, "A", NULL, MB_OK);

        WriteProcessMemory(
                GetCurrentProcess(),
                lpfnExtTextOutA,
                byExtTextOutANewEntry,
                5,
                NULL
        );
        //MessageBox(NULL, "B", NULL, MB_OK);

        VirtualProtect(
                lpfnTextOutA, 5,
                dwProtectA, NULL
        );

        VirtualProtect(
                lpfnExtTextOutA, 5,
                dwProtectB, NULL
        );

        return 0;
}

以上是一个挂接API的函数,它被放在一个DLL中, 而这个DLL将被插如到一个远程进程空间里。这个函数通过将TextOutA, ExtTextOutA函数的前5个字节改成一条
JMP XXXXXXXX指令来实现对TextOutA和ExtTextOutA函数的挂接.朋友请看那个两个注释有“改写原函数入口地址”的地方。 这个函数执行后, 确实改变了原函数的前5个字节, 但是JMP后面的地址却很是奇怪,变成了8XXXXXXX, 而在这个位置根本没有任何指令。 为什么在我的函数中我赋的值是我自己的函数地址, 而改写后却是个无效的指令地址呢? 是不是这个地址的东东我还没搞懂啊? 朋友帮我看看。 谢谢了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (8)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-6-2 22:25
2
0
你用了4个WriteProcessMemory,没必要
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-6-2 22:39
3
0
谢谢 北极星, 这个我会改正, 但是我提的问题你能给我讲讲吗?
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-6-4 10:14
4
0
要7个字节,例如:
0x12345678
==>
mov eax, 0x12345678 ==> B8 78 56 34 12
jmp eax             ==> FF EO
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-6-5 14:15
5
0
谢谢了。 我已经找到我哪儿错了。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bates 2006-6-5 21:46
6
0
最初由 北极星2003 发布
要7个字节,例如:
0x12345678
==>
mov eax, 0x12345678 ==> B8 78 56 34 12
jmp eax ==> FF EO


发现你回答错不只一个问题了
Hook只要5个字节就足够。
jmp xxxxx
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-6-6 08:54
7
0
我在VC中5个字节也出现了问题,但用7个字节却可以实现
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-6-6 09:01
8
0
最初由 bates 发布
发现你回答错不只一个问题了
Hook只要5个字节就足够。
jmp xxxxx


版主也不是全才,不可能全对
如果我在问答过程出现了问题,感谢你及时的给我指出来
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-6-6 10:51
9
0
只要5个字节就可以了 但是要注意jmp 后面的地址应该是相对地址 对于我那段代码 jmp后面的地址就应该是 TextOutAProxy - TextOutA - 5 即你自己的函数相对于要挂接的函数的地址再减去jmp指令的长度5  即为jmp后面的地址.
游客
登录 | 注册 方可回帖
返回