首页
社区
课程
招聘
[求助]关于inlinehook的几个疑问?
发表于: 2008-8-1 13:31 3956

[求助]关于inlinehook的几个疑问?

2008-8-1 13:31
3956
void Hook()
{
        DWORD dwOldProtect;  
        OldFuncAddr = (ULONG)MessageBoxA;

        // MyFuncAddr = MyMessageBoxA的实际地址

   
      //疑问一:(BYTE *)MyMessageBoxA+1 这个作何解释?
      //疑问二: 为什么第二个参数是10呢?
        VirtualProtect((LPVOID)jmp_backAddr, 10, PAGE_EXECUTE_READWRITE, &dwOldProtect);

        MyFuncAddr = *(ULONG *)((BYTE *)MyMessageBoxA+1) + (ULONG)MyMessageBoxA + 5;
        // jmp_backAddr = jmp_back的实际地址
        jmp_backAddr = *(ULONG *)((BYTE *)jmp_back+1) + (ULONG)jmp_back + 5;
        //修改内存为PAGE_EXECUTE_READWRITE
        VirtualProtect((LPVOID)jmp_backAddr, 10, PAGE_EXECUTE_READWRITE, &dwOldProtect);

        VirtualProtect((LPVOID)OldFuncAddr, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect);
        //计算跳转地址
        *((ULONG*)(hook_code+1)) = (ULONG)MyFuncAddr - (ULONG)OldFuncAddr - 5;

        memcpy(orig_code,(BYTE *)OldFuncAddr, 5);

        memcpy((BYTE*)OldFuncAddr, hook_code, 5);
        //计算返回地址
        *((ULONG*)(jmp_org_code+1)) = (ULONG)OldFuncAddr - (ULONG)jmp_backAddr - 5;

        memcpy((BYTE *)jmp_backAddr, orig_code, 5);

        memcpy((BYTE *)jmp_backAddr + 5, jmp_org_code, 5);
}

__declspec(naked) int jmp_back()
{
        __asm
        {
                _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
        }
}

//MyMessageBoxA:在函数执行前进行自己的处理
__declspec(naked) int MyMessageBoxA(
                                                                        HWND hWnd,          // handle to owner window
                                                                        LPCTSTR lpText,     // text in message box
                                                                        LPCTSTR lpCaption,  // message box title
                                                                        UINT uType          // message box style
                                                                        )
{   
        printf("MyMessageBoxA is called\r\n");
        __asm
        {
                pop head
                        pop hWnd
                        pop lpText
                        pop lpCaption
                        pop uType
        }
        MyFunc();////可以加入函数过程
        __asm
        {
                //压栈过程
                push uType
                        push lpCaption
                        push lpText
                        push hWnd
                        push head
                        //跳回MessageBoxA入口点
                        jmp jmp_back;
                ret;
        }
}

//MyMessageBoxA:在函数执行后进行自己的处理
__declspec(naked) int MyMessageBoxAA(
                                                                         HWND hWnd,          // handle to owner window
                                                                         LPCTSTR lpText,     // text in message box
                                                                         LPCTSTR lpCaption,  // message box title
                                                                         UINT uType          // message box style
                                                                         )
{   
        printf("MyMessageBoxAA is called\r\n");
        __asm
        {
                pop head
                        push offset s1;//返回地址为S1:
                //跳回MessageBoxA入口点
                jmp jmp_back;
s1:    nop  
        }

        MyFunc();

        __asm
        {
                ;//将原返回地址压栈
                mov eax, 0;////演示:将返回结果改为0,也可由MyFunc返回
                push head
                        ret;
        }
}

int MyFunc()
{
        printf("Hello World\r\n");
        return 1;
}

   
      //疑问一:(BYTE *)MyMessageBoxA+1 这个作何解释?
        MyFuncAddr = *(ULONG *)((BYTE *)MyMessageBoxA+1) + (ULONG)MyMessageBoxA + 5;

      //疑问二: 为什么第二个参数是10呢?
        VirtualProtect((LPVOID)jmp_backAddr, 10, PAGE_EXECUTE_READWRITE, &dwOldProtect);

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
//疑问一:(BYTE *)MyMessageBoxA+1 这个作何解释?
  MyFuncAddr = *(ULONG *)((BYTE *)MyMessageBoxA+1) + (ULONG)MyMessageBoxA + 5;
作用是跳过JMP指令的第一个字节“E9”指令来获取JMP指令后面四个字节函数地址偏移量。

      //疑问二: 为什么第二个参数是10呢?
  VirtualProtect((LPVOID)jmp_backAddr, 10, PAGE_EXECUTE_READWRITE, &dwOldProtect);
VirtualProtect的第二参数是要修改内存属性的容量的大小,并没有规定是10,用20甚至更大的数都可以。
2008-8-1 14:28
0
雪    币: 21
活跃值: (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
楼上正解!!
2008-8-2 00:19
0
游客
登录 | 注册 方可回帖
返回
//