我有这个代码:
.text:0045A020 ; int __thiscall CMapConnection__OnItemOptionCombination(CMapConnection *this, _tagRequestMAP_COMPOSITION_OPTIONITEM *prcreq)
.text:0045A020 ?OnItemOptionCombination@CMapConnection@@QAEHPAU_tagRequestMAP_COMPOSITION_OPTIONITEM@@@Z proc near
.text:0045A020
.text:0045A020 000 push ebp
.text:0045A021 004 mov ebp, esp
.text:0045A023 004 sub esp, 440h ; Integer Subtraction
.text:0045A029 444 mov eax, ___security_cookie
.text:0045A02E 444 xor eax, ebp ; Logical Exclusive OR
.text:0045A030 444 mov [ebp+var_2F0], eax
.text:0045A036 444 push esi
.text:0045A037 448 push edi
.text:0045A038 44C mov [ebp+this], ecx
.text:0045A03E 44C mov eax, [ebp+this]
.text:0045A044 44C mov ecx, [eax+534h]
.text:0045A04A 44C mov [ebp+pPlayer], ecx
.text:0045A050 44C cmp [ebp+pPlayer], 0 ; Compare Two Operands
.text:0045A057 44C jnz short loc_45A063 ; Jump if Not Zero (ZF=0)
.text:0045A057
.text:0045A059 44C mov eax, 1
.text:0045A05E 44C jmp loc_45A97B ; Jump
长话短说,我需要做以下事情: - 挂钩到函数的开头 - 做一些检查(这些检查需要分配代码) - 根据检查结果,我需要让函数继续它是正常的当然,或者让它跳到它触发一些错误的部分,或者只是阻止它前进。
我必须对 asm 有基本的了解才能做到这一点。
从我读过的内容来看,我可以用钩子来做到这一点,但这是我的问题:检查功能需要读取_tagRequestMAP_COMPOSITION_OPTIONITEM *prcreq数据,因此它可以收集一些数字。
.text:0041A464 784C mov ecx, [ebp+pPacket] ; jumptable 00417B7A case 27
.text:0041A467 784C add ecx, 4 ; Add
.text:0041A46A 784C mov [ebp+var_1874], ecx
.text:0041A470 784C mov edx, [ebp+var_1874]
.text:0041A476 784C push edx ; prcreq
.text:0041A477 7850 mov ecx, [ebp+this] ; this
.text:0041A47D 7850 call ?OnItemOptionCombination@CMapConnection@@QAEHPAU_tagRequestMAP_COMPOSITION_OPTIONITEM@@@Z ;
这是调用原始函数的方式。
我的问题:
- 如何在 C++ 代码中从 *pcreq 读取数据?可能吗?
- 是否可以从我的钩子中调用另一个函数,同时将与钩子函数相同的参数传递给它?
- 我根本不会弄乱 OnItemCombination 函数的参数,我退出钩子时是否必须重做堆栈?