2

我有这个代码:

.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 ;

这是调用原始函数的方式。

我的问题:

  1. 如何在 C++ 代码中从 *pcreq 读取数据?可能吗?
  2. 是否可以从我的钩子中调用另一个函数,同时将与钩子函数相同的参数传递给它?
  3. 我根本不会弄乱 OnItemCombination 函数的参数,我退出钩子时是否必须重做堆栈?
4

2 回答 2

2

由于您不能“暂停”程序以注入 DLL/so 并进行检查(或者至少我从未听说过这样的事情),您可以修改启动代码以循环变量。
当程序旋转时,对注入的 DLL 执行检查,然后获取用于该变量的静态指针并修改它以允许注入程序的继续。

这可能需要一些技巧才能实现。

急切地等待更多的答案,

干杯。

更新:

这就是我的想法。

编辑程序的启动代码以循环旋转,如下所示。使用jmpcmp说明。

static bool spin = true;
while(spin){ }

然后注入您的 DLL/so 并进行检查。一旦你完成了。更改spinfalse并允许程序继续。

要更改spin,您必须找到静态指针。您可以通过研究说明或使用 CheatEngine 之类的程序来做到这一点。

于 2013-08-15T07:39:51.433 回答