首页
社区
课程
招聘
[求助]Ring3 Inline Hook 堆栈问题
发表于: 2010-4-11 15:26 5625

[求助]Ring3 Inline Hook 堆栈问题

2010-4-11 15:26
5625
利用在函数头写jmp,实现跳转到我的处理函数。为什么堆栈不平衡?恳请各位大牛帮助!
PS:按晕菜菜大牛修改后,esp是不出错了,但会出现两次MessageBox。在反汇编窗口调试时,第一次Call MessageBoxA 后参数错了,MessageBox的内容也错了。第二次出现时则正常
希望大家帮忙!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <windows.h>
#include <stdio.h>
 
#define CODELEN 7
 
typedef struct _HOOKDATA_
{
    BYTE OriCode[CODELEN];
    BYTE HookCode[CODELEN];
    PVOID OriAddr;
    PVOID FakeAddr;
    HANDLE hProc;
}HOOKDATA, *PHOOKDATA;
 
int InitHook(PHOOKDATA HookData, char *DllName, char *ExportName, PVOID FakeAddr)
{
    // Set OriAddr
    HookData->OriAddr = GetProcAddress(GetModuleHandle(DllName), ExportName);
    if (HookData->OriAddr == 0)
    {
        return 1;
    }
     
    // Set hProc
    HookData->hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, GetCurrentProcessId());
    if (!HookData->hProc)
    {
        return 2;
    }
     
    // Set FakeAddr
    HookData->FakeAddr = FakeAddr;
     
    // Set HookCode
    HookData->HookCode[0] = 0xb8;
    HookData->HookCode[5] = 0xff;
    HookData->HookCode[6] = 0xe0;
    memcpy((PVOID)(HookData->HookCode + 1), &(HookData->FakeAddr), 4);
     
    return 0;
}
 
int SetHook(PHOOKDATA HookData)
{
    DWORD dwTmp;
     
    // Set the attribute of memory
    if (!VirtualProtect(HookData->OriAddr, CODELEN, PAGE_EXECUTE_READWRITE, &dwTmp))
    {
        return 1;
    }
     
    // Return the original data
    if (!ReadProcessMemory(HookData->hProc, HookData->OriAddr, HookData->OriCode, CODELEN, NULL))
    {
        return 2;
    }
     
    // Write the head of function
    if (!WriteProcessMemory(HookData->hProc, HookData->OriAddr, HookData->HookCode, CODELEN, NULL))
    {
        return 3;
    }
     
    return 0;
}
 
int RemoveHook(PHOOKDATA HookData)
{
    if (!WriteProcessMemory(HookData->hProc, HookData->OriAddr, HookData->OriCode, CODELEN, NULL))
    {
        return 1;
    }
     
    return 0;
}
 
// WINAPI 已按晕菜菜大牛的要求添加
HANDLE [COLOR="Red"]WINAPI [/COLOR]MyOpenProcess(
    DWORD dwDesiredAccess,
    BOOL bInheritHandle,
    DWORD dwProcessId
    )
{
    char buf[255];
    sprintf(buf, "Acc:%ld\nInh:%ld\nPID:%d\n", dwDesiredAccess, bInheritHandle, dwProcessId);
    MessageBox(NULL, buf, "Wonderful!", 0);
    // 已按晕菜菜大牛删除
    //__asm
    //{
    //  sub esp,12
    //}
    return 0;
}
 
int main()
{
    HOOKDATA HookData;
    memset(&HookData, 0, sizeof(HOOKDATA));
    printf("Init:%d\n", InitHook(&HookData, "kernel32.dll", "OpenProcess", MyOpenProcess));
    printf("Set:%d\n", SetHook(&HookData));
    OpenProcess(1, 2, 3);
}

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费
支持
分享
最新回复 (2)
雪    币: 245
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
修改:

HANDLE WINAPI MyOpenProcess(

删除:

  __asm
  {
    sub esp,12
  }
2010-4-11 16:33
0
雪    币: 43
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
看来 _cdel 和 pascal 不一样啊
谢谢!学习了!
但是还有问题啊
2010-4-11 20:20
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册