谁能分解这个汇编代码的作用?
Posted
技术标签:
【中文标题】谁能分解这个汇编代码的作用?【英文标题】:Can anyone break down what this assembly code does? 【发布时间】:2021-07-25 06:02:01 【问题描述】:以下代码是旧赛车游戏中的一些基本计算。它的模型下压力,通过检查汽车的当前速度。有一个下压力系数(我在第三行向下追踪),它在某处乘以汽车的速度,这增加了轮胎上的垂直力。我认为这是针对两个前轮胎的。
有人能把这个等式分解成简单的术语吗?我只部分了解我在看什么...
GAME.exe+58620C - 8B 54 24 0C - mov edx,[esp+0C]
GAME.exe+586210 - 8B 44 24 04 - mov eax,[esp+04]
GAME.exe+586214 - D9 04 90 - fld dword ptr [eax+edx*4]
GAME.exe+586217 - 8B CA - mov ecx,edx
GAME.exe+586219 - 6B C9 34 - imul ecx,ecx,34
GAME.exe+58621C - 8D 4C 01 08 - lea ecx,[ecx+eax+08]
GAME.exe+586220 - 8B 01 - mov eax,[ecx]
GAME.exe+586222 - 85 C0 - test eax,eax
GAME.exe+586224 - 74 46 - je GAME.exe+58626C
GAME.exe+586226 - 83 F8 01 - cmp eax,01 1
GAME.exe+586229 - D9 44 24 10 - fld dword ptr [esp+10]
GAME.exe+58622D - 75 0F - jne GAME.exe+58623E
GAME.exe+58622F - D9 05 C8975300 - fld dword ptr [GAME.exe+1397C8] (0.00)
GAME.exe+586235 - D8D9 - fcomp st(0),st(1)
GAME.exe+586237 - DFE0 - fnstsw ax
GAME.exe+586239 - F6 C4 41 - test ah,41 65
GAME.exe+58623C - 7A 2C - jp GAME.exe+58626A
GAME.exe+58623E - D8 51 1C - fcom dword ptr [ecx+1C]
GAME.exe+586241 - DFE0 - fnstsw ax
GAME.exe+586243 - F6 C4 41 - test ah,41 65
GAME.exe+586246 - 75 07 - jne GAME.exe+58624F
GAME.exe+586248 - DDD8 - fstp st(0)
GAME.exe+58624A - D9 41 1C - fld dword ptr [ecx+1C]
GAME.exe+58624D - EB 0F - jmp GAME.exe+58625E
GAME.exe+58624F - D8 51 18 - fcom dword ptr [ecx+18]
GAME.exe+586252 - DFE0 - fnstsw ax
GAME.exe+586254 - F6 C4 05 - test ah,05 5
GAME.exe+586257 - 7A 05 - jp GAME.exe+58625E
GAME.exe+586259 - DDD8 - fstp st(0)
GAME.exe+58625B - D9 41 18 - fld dword ptr [ecx+18]
GAME.exe+58625E - D8 49 14 - fmul dword ptr [ecx+14]
GAME.exe+586261 - D8 41 10 - fadd dword ptr [ecx+10]
GAME.exe+586264 - D8 49 04 - fmul dword ptr [ecx+04]
GAME.exe+586267 - DEC1 - faddp
GAME.exe+586269 - C3 - ret
GAME.exe+58626A - DDD8 - fstp st(0)
GAME.exe+58626C - C3 - ret
【问题讨论】:
我们看不到分支机构的去向,因为您没有显示地址。像objconv
这样的反汇编程序可以反汇编成带有分支标签的 asm 源代码,从而更容易理清条件行为。 (存储状态字并对其进行测试是sahf
的替代方法并使用 jp(无序)或 ja / je / jb。)
我们也不知道整数寄存器中的指针值是什么,或者fld dword ptr [GAME.exe+1397C8]
正在加载什么FP常量。
我只是将地址添加到每一行。有帮助吗?
是的,这样就可以开始并查看分支目标。如果您自己匹配数字地址并标记分支目标以及纯数字,尤其是任何向后分支(因为这些通常是循环的顶部),将会有更多帮助。这里有很多分支,在寻找模式时不容易将其全部记在脑海中。单步执行它并观察 FP 寄存器值的变化可能会有所帮助。
@PeterCordes 我认为我这样做是正确的......在每个阶段添加断点。
【参考方案1】:
有些代码没有公开,其中很多使用的是未记录的 Windows 内核偏移量,例如:
1.mov edx,[esp+0C] / mov eax,[esp+04]
2.je GAME.exe+58626C / jne GAME.exe+58623E / jp GAME.exe+58626A etc
3.fld dword ptr [eax+edx*4]
99% 的代码是隐藏的,没有人能帮你,你需要提供完整的代码
注意:地址只是在运行时放置在您的代码中,不会有帮助
【讨论】:
查找 EAX 和 ESP 等值的最佳方法是什么? 调试它们,看看它们是否会使用断点 但是 mov edx,[esp+0C] 是 windows 内核函数,它指向 PEB_LDR_DATA 为什么您认为从您自己的本地堆栈空间加载 EDX 与 Windows 内核有关?mov edx, [esp+0xC]
是一条完全正常的指令,可以出现在正常的编译器生成的代码中,用于访问局部变量。
@PaulTaylor,ESP
的值无关紧要,因为它是一个移动的目标。以上是关于谁能分解这个汇编代码的作用?的主要内容,如果未能解决你的问题,请参考以下文章