陷入一个相当大的应用程序

时间:2013-08-15 07:16:34

标签: c++ hook

我有这段代码:

.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函数的参数,当我从钩子中退出时,我是否必须重做堆栈?

2 个答案:

答案 0 :(得分:2)

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

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

急切地等待更多答案,

干杯。

<强>更新

这就是我的想法。

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

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

然后注入你的DLL / so并做你的检查。一旦你完成了。将spin更改为 false 并允许程序继续。

要更改spin,您必须找到静态指针。您可以通过学习说明或CheatEngine等程序来实现。

答案 1 :(得分:1)