我有这段代码:
.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 ;
以下是原始函数的调用方式。
我的问题:
答案 0 :(得分:2)
由于你不能“暂停”程序以便注入DLL /并进行检查(或者至少我从未听说过这样的事情)你可以修改启动代码以便循环一个变量。
当程序正在旋转时,对已注入的DLL执行检查,然后获取用于该变量的静态指针并修改它以允许继续注入的程序。
这可能需要一些技巧才能实现。
急切地等待更多答案,
干杯。
<强>更新强>
这就是我的想法。
编辑程序的启动代码以在如下循环中旋转。使用jmp
和cmp
说明。
static bool spin = true;
while(spin){ }
然后注入你的DLL / so并做你的检查。一旦你完成了。将spin
更改为 false 并允许程序继续。
要更改spin
,您必须找到静态指针。您可以通过学习说明或CheatEngine等程序来实现。
答案 1 :(得分:1)