从IDA Pro中钩上USERCALL功能
Hooking a usercall function from ida pro
int CachedTag_NoCache_GetTagPos( CEntity* centity, int tag, Vector* worldpos )
{
void* funccall = (void*)0x7D5BD0;
__asm {
mov edi, worldpos
mov esi, centity
push tag
call funccall
add esp, 4
}
}
功能在添加ESP上崩溃,4 ....
我知道它是从此内联合花组件的清理中崩溃的。我只是不知道如何修复它。
这是IDA Pro中的内容:
int __usercall sub_7A7D20<eax>(int a1<ecx>, int a2<edi>, int a3<esi>, int a4)
{
int v4; // eax@2
int result; // eax@2
char *v6; // eax@3
char v7; // al@5
int v8; // [sp+0h] [bp-4h]@1
v8 = a1;
if ( *(_WORD *)(a3 + 678) == 1 )
{
LOBYTE(v8) = sub_5BB6F0(*(_BYTE *)(a3 + 4), *(_DWORD *)(a3 + 0x1E8));
v4 = sub_7A7C40();
result = sub_4DA2F0(a3, a2, a4, v4, v8);
}
else
{
v6 = sub_615EA0(*(_DWORD *)(a3 + 0x1E8), *(_BYTE *)(a3 + 4));
result = sub_4B2F50(a3, v6, a2, a4);
}
if ( !result )
{
v7 = sub_624C70(a2, 0);
result = sub_627380(1, "AimTarget_GetTagPos: Cannot find tag [%s] on entityn", v7);
}
return result;
}
来自文本中IDA Pro的此功能的组件:
.text:007D5BD0 sub_7D5BD0 proc near ; CODE XREF: sub_4DA2F0+76p
.text:007D5BD0 ; sub_62AE20+18p
.text:007D5BD0
.text:007D5BD0 arg_0 = dword ptr 4
.text:007D5BD0
.text:007D5BD0 movzx eax, byte ptr [esi+4]
.text:007D5BD4 mov ecx, [esi+1E8h]
.text:007D5BDA push ebx
.text:007D5BDB mov ebx, [esp+4+arg_0]
.text:007D5BDF push eax
.text:007D5BE0 push ecx
.text:007D5BE1 call sub_615EA0
.text:007D5BE6 add esp, 8
.text:007D5BE9 test eax, eax
.text:007D5BEB jnz short loc_7D5C00
.text:007D5BED fld dword ptr [esi+30h]
.text:007D5BF0 pop ebx
.text:007D5BF1 fstp dword ptr [edi]
.text:007D5BF3 fld dword ptr [esi+34h]
.text:007D5BF6 fstp dword ptr [edi+4]
.text:007D5BF9 fld dword ptr [esi+38h]
.text:007D5BFC fstp dword ptr [edi+8]
.text:007D5BFF retn
.text:007D5C00 ; ---------------------------------------------------------------------------
.text:007D5C00
.text:007D5C00 loc_7D5C00: ; CODE XREF: sub_7D5BD0+1Bj
.text:007D5C00 push edi
.text:007D5C01 push ebx
.text:007D5C02 push eax
.text:007D5C03 push esi
.text:007D5C04 call sub_4B2F50
.text:007D5C09 add esp, 10h
.text:007D5C0C test eax, eax
.text:007D5C0E jnz short loc_7D5C2B
.text:007D5C10 push eax
.text:007D5C11 push ebx
.text:007D5C12 call sub_624C70
.text:007D5C17 push eax ; char
.text:007D5C18 push offset aCachedtag_noca ; "CachedTag_NoCache_GetTagPos: Cannot fin"...
.text:007D5C1D push 1 ; int
.text:007D5C1F call sub_627380
.text:007D5C24 add esp, 14h
.text:007D5C27 xor eax, eax
.text:007D5C29 pop ebx
.text:007D5C2A retn
.text:007D5C2B ; ---------------------------------------------------------------------------
.text:007D5C2B
.text:007D5C2B loc_7D5C2B: ; CODE XREF: sub_7D5BD0+3Ej
.text:007D5C2B mov edx, dword_D4F178
.text:007D5C31 mov eax, [edx+40688h]
.text:007D5C37 pop ebx
.text:007D5C38 retn
.text:007D5C38 sub_7D5BD0 endp
.text:007D5C38
.text:007D5C38 ; ---------------------------------------------------------------------------
.text:007D5C39 align 10h
.text:007D5C40
我正在工作的组件。我进入游戏,它向我展示了大约3分钟的我想要的东西。然后它崩溃了。在将视觉工作室附加到该过程的同时,它总是说在上面的添加ESP上崩溃了我的功能,4。
现在在使用EDI和ESI的USERCALL上,我必须在调用我的功能和/或我也必须弹出一些东西吗?
显然我的使用方式不好,因为它只能工作约3分钟。我使用的代码最长的时间约为3场。长度约10分钟。
然后,在这3场比赛之后,我才开始对我发生致命错误。
感谢任何有能力回答这个问题的人。
我知道在插件中呼叫该功能后的清理工作很愚蠢。
您需要保存和恢复EDI
和ESI
(x86 abi将它们定义为 non -volatile寄存器,这意味着您不能丢弃它们)MSVC产生的序言和结语引起了问题,IMO,最好将其写为纯粹的裸函数,这使您可以更好地控制生成的组装,并确保您可以正确模拟非标准(优化)呼叫约定:
__declspec(naked) int __fastcall CachedTag_NoCache_GetTagPos(CEntity* centity, int tag, Vector* worldpos)
{
__asm {
push edi
push esi
mov edi,worldpos
mov esi,centity
push tag
mov eax,0x7D5BD0
call eax
add esp,4
pop esi
pop edi
retn 4
}
}
就您获得的例外而言,听起来您没有正确的行,像ollydbg这样的汇编级调试器将帮助您确定确切原因和正确的位置。
另外,作为一个谨慎的词,切勿使用固定地址,请使用搬迁安全变体,即:基本地址 rva;在我的上述代码中,您只需要更改两行即可实现:
mov eax,[base_address]
add eax,rva
base_address
沿着:
UINT_PTR base_address = (UINT_PTR)GetModuleHandle("some_module");
并且在全球范围内可访问。
您提供的代码是正确的。目标功能本身是堆栈中性的,打电话后您会清洁推送参数。
您确定这是代码崩溃的正确行吗?你会得到什么例外?我认为在寄存器中添加常数甚至不会导致例外。
您报告的崩溃间隔似乎是随机的。这可能是一个线程问题,例如通过无效的中心和所谓的功能崩溃。您可以通过连接通常调用此功能的线程并将其调用该线程中的线程来防止这种情况。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 询问在设计我的手臂模拟器功能表示格式1
- 功能原型的目的
- 从IDA Pro中钩上USERCALL功能