gpt4 book ai didi

c++ - 连接到一个相当大的应用程序

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:09 24 4
gpt4 key购买 nike

我有这段代码:

.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

长话短说,我需要做以下事情:- Hook 到函数的开头- 做一些检查(这些检查需要分配代码)- 根据检查结果,我需要让函数继续正常运行,或者让它跳转到它触发一些错误的部分,或者干脆停止它前进。

我必须对 asm 有基本的了解才能做到这一点。

根据我的阅读,我可以用钩子(Hook)做到这一点,但这是我的问题:检查函数需要读取 _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. 是否可以从我的钩子(Hook)调用另一个函数,同时将与钩子(Hook)函数相同的参数传递给它?
  3. 我根本没有弄乱 OnItemCombination 函数的参数,当我退出 Hook 时是否必须重做堆栈?

最佳答案

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

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

急切等待更多答案,

干杯。

更新:

这是我的想法。

编辑程序的启动代码,使其像下面这样循环自旋。使用 jmpcmp 指令。

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

然后注入(inject)您的 DLL/so 并进行检查。完成后。将 spin 更改为 false 并允许程序继续。

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

关于c++ - 连接到一个相当大的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18247948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com