Assembly 有人能分解这个汇编代码的功能吗?

Assembly 有人能分解这个汇编代码的功能吗?,assembly,x86,reverse-engineering,x87,Assembly,X86,Reverse Engineering,X87,下面的代码是一个旧的赛车游戏中的一些基本计算。它的模型通过检查汽车的当前速度来施加下压力。有一个下压力系数,我在下面第三行追踪到,它乘以汽车的速度,这增加了轮胎上的垂直力。我想这是给两个前轮胎的 有人能帮我把方程分解成简单的术语吗?我只是部分了解我在看什么 GAME.exe+58620C - 8B 54 24 0C - mov edx,[esp+0C] GAME.exe+586210 - 8B 44 24 04 - mov eax,[esp+04] GAM

下面的代码是一个旧的赛车游戏中的一些基本计算。它的模型通过检查汽车的当前速度来施加下压力。有一个下压力系数,我在下面第三行追踪到,它乘以汽车的速度,这增加了轮胎上的垂直力。我想这是给两个前轮胎的

有人能帮我把方程分解成简单的术语吗?我只是部分了解我在看什么

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 

有些代码没有公开,很多代码使用的是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%的代码是隐藏的,没有人能够帮助您提供所需的全部代码


注意:地址只是在运行时放在代码中,不会有任何帮助,因为您没有显示地址,所以我们看不到分支的位置。像objconv这样的反汇编程序可以反汇编到带有分支标签的asm源代码中,这使得分类条件行为更加容易。存储状态字并测试它是sahf和使用jp unordered或ja/je/jb的替代方法。我们也不知道整数寄存器中的指针值是什么,或者fld dword ptr[GAME.exe+1397C8]加载的FP常量是什么。我只是将地址添加到每一行。这有帮助吗?是的,这样就可以开始查看分支目标。如果您自己匹配数字地址并标记分支目标,以及纯数字,尤其是任何反向分支,这将更有帮助,因为它们通常是循环的顶部。这里有很多分支,当你在寻找模式的时候,很难把它们都记在脑子里。单步执行并观察FP寄存器值的变化可能会有所帮助。@PeterCordes我认为我这样做是正确的…在每个阶段添加断点。找到EAX和ESP等值的最佳方法是什么?调试它们并查看它们是否将使用断点而不是mov edx,[ESP+0C]windows内核函数及其指向PEB_LDR_数据的点为什么您认为从您自己的本地堆栈空间加载EDX与windows内核有关?mov edx,[esp+0xC]是一条完全正常的指令,可以出现在用于访问局部变量的正常编译器生成的代码中。@PaulTaylor,esp的值与此无关,因为它是一个移动目标。