谁能分解这个汇编代码的作用?

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 的值无关紧要,因为它是一个移动的目标。

以上是关于谁能分解这个汇编代码的作用?的主要内容,如果未能解决你的问题,请参考以下文章

ORG 组装说明有啥作用?

谁能帮我把我的 SQL 连接到这个源代码它对我不起作用

keil软件的作用是啥? 谁能分享

谁能帮我理解为啥在“后缀”起作用时“前缀”不起作用以及如何解决这个问题?

为啥 JL 命令在我的汇编代码中不起作用?

栈的作用