我正在尝试创建一个图表,以便我可以在我感兴趣的游戏中可视化特定功能的流程。我最初使用 Cheat Engine 来跟踪该功能的流程,但经过大约 20 jmps 到最终进入 ret 指令,我决定在 IDA 中打开可执行文件,以便我可以看到图形视图。
当我在 IDA 中打开可执行文件时,我遇到了一个问题,即自动分析“卡住”在一个循环中,永远无法完成。
查看代码,我确实想知道是否存在某种混淆,因为似乎同一件事可以用更少的指令编码。
我该怎么办?
这是我怀疑导致问题的一段代码的示例(对不起,如果我的评论没有多大意义):
cmp [rcx],rdi ; if *rcx == rdi:
cmove eax,r15d ; do eax = r15d
add rcx,08 ; rcx += 8
dec rdx ; i -= 1
mov [rsp-08],rbp ; var a = rbp
lea rsp,[rsp-08] ; rsp = &a
mov rbp,game.exe+13139A0 ; rbp = game.exe+13139A0
xchg [rsp],rbp ; swap(a, rbp) i.e.
; a = game.exe+13139A0
; rbp = rbp (original value)
lea rsp,[rsp-08] ; var b; rsp = &b
mov [rsp],rbx ; b = rbx
lea rsp,[rsp-08] ; var c; rsp = &c
mov [rsp],rax ; c = rax
mov rbx,[rsp+10] ; rbx = a
mov rax,game.exe+1313990 ; rax = game.exe+1313990
cmovne rbx,rax ; rbx = i == 0 ? rax : rbx
mov [rsp+10],rbx ; a = rbx
lea rsp,[rsp+08] ; rsp = &b
mov rax,[rsp-08] ; rax = c
mov rbx,[rsp] ; rbx = b
lea rsp,[rsp+08] ; rsp = &a
lea rsp,[rsp+08] ; rsp = &???
jmp qword ptr [rsp-08] ; jmp a i.e.
; i == 0: game.exe+1313990
; i != 0: game.exe+13139A0