免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: li574000
打印 上一主题 下一主题

我这段hook代码有什么问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-03-25 12:48 |只看该作者
#if 0
        *(unsigned char*)addfirst=(unsigned char)0xff;
        *(((unsigned char*)addfirst) +1)=(unsigned char)0x25;
                //下面是把second函数的地址写入到jmp指令后面
        DWORD lpnew=(DWORD)&second;
        memcpy((void*)(addfirst+2),(const void *)&lpnew,sizeof(DWORD));
#else
//mov eax, XXXXXXXX
//jmp eax
                *(unsigned char*)addfirst     = 0xb8;
                *(unsigned int *)(addfirst+1) = (DWORD)&second;
                *(unsigned short *)(addfirst+5) = 0xe0ff;
#endif

论坛徽章:
0
12 [报告]
发表于 2010-03-25 16:12 |只看该作者
本帖最后由 li574000 于 2010-03-25 16:27 编辑
#if 0
        *(unsigned char*)addfirst=(unsigned char)0xff;
        *(((unsigned char*)addfirst)  ...
prc 发表于 2010-03-25 12:48



    谢谢,试验了下,可以执行。代码的意思是mov eax  second的地址,然后jmp [eax],这样确实可以执行。但是为什么我以前的代码却不能够执行哪

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
13 [报告]
发表于 2010-03-25 16:23 |只看该作者
这里应该是near jmp, 0xe9。

  1. #include <stddef.h>
  2. #include <stdio.h>
  3. #include <string.h>

  4. #include <windows.h>

  5. void victim(int i) {
  6.       printf("victim(%d);\n", i);
  7. }

  8. void hack(int i) {
  9.       printf("hack(%d);\n", i);
  10. }

  11. int main()
  12. {
  13.       void (* victim_)(int) = victim;
  14.       void (* hack_)(int) = hack;

  15.       printf("enter victim\n");
  16.       victim_(1212);
  17.       printf("leave victim\n\n");
  18.       printf("enter hack\n");
  19.       hack_(1212);
  20.       printf("leave hack\n\n");

  21.       DWORD old = 0;
  22.       VirtualProtect(victim, 5, PAGE_EXECUTE_READWRITE, &old);
  23.       *reinterpret_cast<unsigned char*>(victim_) = 0xe9;
  24.       ptrdiff_t offset = reinterpret_cast<ptrdiff_t>(hack_)
  25.                          - reinterpret_cast<ptrdiff_t>(victim_)
  26.                          - 5;
  27.       memcpy( reinterpret_cast<char*>(victim)+1, &offset, 4);
  28.       printf("enter victim\n");
  29.       victim_(1212);
  30.       printf("leave victim\n\n");
  31. }
复制代码
如果victim入口是 jmp victim_impl或者 call victim_impl, 那就可以将这5个字节修改, 使得其跳转到hack, hack再跳转到victim_impl。

但这是没有保证的(至少在上述代码中), 有可能victim的入口之后, 就直接是真正的代码, 没有那一层多余的跳转。
所以victim被修改之后, 就不能执行victim原来的代码了。
不能 victim -> hack -> victim_impl。

我大概知道你想干什么……
Windows下的dll好像会留一个stub, 就是jmp victim_impl的形式, 就可以victim -> hack -> victim_impl。

论坛徽章:
0
14 [报告]
发表于 2010-03-25 16:29 |只看该作者
谢谢各位,我再思考下

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
15 [报告]
发表于 2010-03-25 16:38 |只看该作者
回复 12# li574000

  1. b8 xx xx xx xx, mov eax xx xx xx xx
  2. ff e0, jmp eax
复制代码
懂了吧?

  1. #include <stddef.h>
  2. #include <stdio.h>
  3. #include <string.h>

  4. #include <windows.h>

  5. void victim(int i) {
  6.       printf("victim(%d);\n", i);
  7. }

  8. void hack(int i) {
  9.       printf("hack(%d);\n", i);
  10. }

  11. int main()
  12. {
  13.       void (* victim_)(int) = victim;
  14.       void (* hack_)(int) = hack;
  15.       unsigned char* victim_p = reinterpret_cast<unsigned char*>(victim);

  16.       printf("enter victim\n");
  17.       victim_(1212);
  18.       printf("leave victim\n\n");
  19.       printf("enter hack\n");
  20.       hack_(1212);
  21.       printf("leave hack\n\n");

  22.       DWORD old = 0;
  23.       VirtualProtect(victim_p, 7, PAGE_EXECUTE_READWRITE, &old);

  24.       victim_p[0] = 0xb8;
  25.       ptrdiff_t hack_p = reinterpret_cast<ptrdiff_t>(hack);
  26.       memcpy(victim_p+1, &hack_p, 4);
  27.       victim_p[5] = 0xff;
  28.       victim_p[6] = 0xe0;

  29.       printf("enter victim\n");
  30.       victim_(1212);
  31.       printf("leave victim\n\n");
  32. }
复制代码

论坛徽章:
0
16 [报告]
发表于 2010-03-25 16:46 |只看该作者
楼上的代码我清楚了,不清楚的是我从书上抄的那段代码为什么不行,看上去没什么本质区别oxff25也是一个
跳转指令

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
17 [报告]
发表于 2010-03-25 16:56 |只看该作者
回复 16# li574000

操作数的寻址方式不同呗。

  1. #include <stddef.h>
  2. #include <stdio.h>
  3. #include <string.h>

  4. #include <windows.h>

  5. void victim(int i) {
  6.       printf("victim(%d);\n", i);
  7. }

  8. void hack(int i) {
  9.       printf("hack(%d);\n", i);
  10. }

  11. int main()
  12. {
  13.       void (* victim_)(int) = victim;
  14.       void (* hack_)(int) = hack;
  15.       unsigned char* victim_p = reinterpret_cast<unsigned char*>(victim);

  16.       printf("enter victim\n");
  17.       victim_(1212);
  18.       printf("leave victim\n\n");
  19.       printf("enter hack\n");
  20.       hack_(1212);
  21.       printf("leave hack\n\n");

  22.       DWORD old = 0;
  23.       VirtualProtect(victim_p, 6, PAGE_EXECUTE_READWRITE, &old);

  24.       victim_p[0] = 0xff;
  25.       victim_p[1] = 0x25;
  26.       ptrdiff_t hack_p = reinterpret_cast<ptrdiff_t>(&hack_);
  27.       memcpy(victim_p+2, &hack_p, 4);

  28.       printf("enter victim\n");
  29.       victim_(1212);
  30.       printf("leave victim\n\n");
  31. }
复制代码
清楚了没?

论坛徽章:
0
18 [报告]
发表于 2010-03-25 17:05 |只看该作者
0041124E FF 25 5A 10 41 00 jmp         dword ptr [second (41105Ah)]
从反汇编来看,这条指令的意思是从绝对地址41105A处取出一个32位的跳转地址,然后再跳转到该地址
而不是直接跳转到41105A

论坛徽章:
0
19 [报告]
发表于 2010-03-25 17:25 |只看该作者
哦,明白了,知道了,原始代码这样写就行了
DWORD lpnew=(DWORD)&second;
DWORD lpnnn=(DWORD)&lpnew;
memcpy((void*)(addfirst+2),(const void *)&lpnnn,sizeof(DWORD));

这么多加一个DWORD lpnnn=(DWORD)&lpnew;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP