Chinaunix首页 | 论坛 | 博客
  • 博客访问: 505382
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-21 13:40
个人简介

技术改变命运

文章分类

全部博文(184)

文章存档

2020年(16)

2017年(12)

2016年(156)

我的朋友

分类: C/C++

2016-05-19 10:38:45


  1. static int replace_fun(unsigned long handle, unsigned long old_fun, unsigned long new_fun)  
  2. {  
  3.     unsigned char *p = (unsigned char *)handle;  
  4.     int i = 0;  
  5.     while(1)  
  6.     {  
  7.         if(i++ > 128)  
  8.             return 0;  
  9.         if(*p == 0xe8)  
  10.         {//e8是GCC编译出来的普通函数调用的call,当然也可能是某个立即数里面的一个字节  
  11.             if((*(int *)(p+1) + (unsigned long)p + 5) == old_fun)  
  12.             {//so需要看下看e8后面是不是老地址的偏移值,是的话替换掉  
  13.                 *(int *)(p+1) = new_fun - (unsigned long)p - 5;  
  14.                 return 1;  
  15.             }  
  16.         }  
  17.         p++;  
  18.     }  
  19. }  
  20. 这段代码是linux下hook API常用的代码,难点在其中的注释部分
  21. 例如下:
    1. #include <stdio.h>
    2. void print(int i){
    3.     printf("%d\n",i);
    4. }
    5. int main()
    6. {
    7.     int i = 0;
    8.     print(i);
    9.     return 0;
    10. }
    通过objdump反汇编
  22. /… 省略部分不相关代码

    80483bd: e8 c2 ff ff ff     call 8048384
    80483c2: b8 00 00 00 00     move $0x0,%eax
     80483bd: e8 c2 ff ff ff     call 8048384        以这句话为例

    显然call的操作码是e8,print函数的地址是0x8048384。后面的反序可得ff ff ff c2(貌似是小端法的原因),由于是补码表示,显然是负数,转化得-62
    下一条指令地址是0x80483bd,与print函数地址相减恰好是-62.


阅读(3724) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~