游戏通常会包含各种各样的功能,如战斗系统、UI渲染、经济系统、生产系统等,每个系
统又包含各式各样子功能,如伤害判定、施法、使用道具、角色移动、玩家之间交易等 等。这些游戏功能在代码实现中往往少不了条件判断(如伤害判定)、循环(遍历物品列 表,播放游戏动画)等。
在逆向过程中如果可以从汇编语言识别出对应的语法结构,在分析过程中将汇编代
码转换为C语言语法结构,可以帮助对程序执行流程的理解。
下面分别介绍最常见的逻辑语法结构:
a)if...else
b)switch...case
c)for、while
注:文中使用的反汇编工具为IDA
一、if...else
_declspec(noirline) int IfFunction_e(int nlndex)
int nValue;
if (rtlndex == 1)
nValue - 9 } else if (nlndex — 2)
nValue = 0
}
else if (nlndrx == 3)
nVslue ? 0
}
else if (nlndex ■- 4)
nValue = 9x70000?&4;
)
else
{
nValue = 1W;
return nvalue;
汇编代码:
-NN
09*01270 ; int
u^ercJll iFrunctian 0@(Lnt n[ntf^xQ<?cx>)
.text
09*IM27e ? 1 fFunctiofl_aHSVftHH?7 proc OFdr: CDOE XRFf : rwin+S^p
.text
09J*Q127O nl皿M
■ ecu
.text
0BJIC127Q
enpnlndFX, 1
,text)nzshort loc 4S127B
,ttxt
0D4Q1275
mvFJXf 7O0DDQO1F1
,text
00*U127R
rttn
-text
,text -t函
OB40127B 00*?127B OD4D12?B
;CODE XRE F: IFFunct1QD 0(Int >?3Tj
-text
HD4H127B
enp
nlndf 2
-St
MD4V1??E
Jrw
short loe HO1?R6
,gt
l?U
71]
,C4*Xt
rein
Idc *0127B:
*trxt
,tPXt
* text
皿『MG 004012*6 她罹12"
*tPKt
enprtlndtxt 3
*text
jni?hort 1OC_*012Q1
? text
0DJIB12IIBnoueaxt 7D0DOO03F1
.text
。眄 nmre th
-text
0M?12Q1
.tvxt
00^01291 lac 4101291:
.tewt
004^1291tnpnlndex, 4
OBJ*0120*MV整AX. A?ih
?text
094^1299novedx? 7Q04QQ^h
.text
0B*V124ECMvf fax, Fdx
?tPXt
0^012A1rrtn
.text
Tirrunctiofl a@@YftHH@z endp
Idc U01286;
;£DDE XREF: 1Ffunction_B(int)?Etj
;CODE XREF: IFFunction a(int)>19tj
14^
14^
145
146
147
148
149
150
151
152
153
154
155
156
157
15E
159
160
161
162
163
164
165
166
167
1 AR
if...else结构比较固定,通常包含 cmp指令、jcc指令以及满足条件后执行的指令
块。
.text :fl0^i012F0cmpnlndex, 1
.text:004O12F3jnzshort loc_^912FB
.text:004O12F5moueax, 7如丽
.text:60ii012Ffiretn
if...else结构可以串联,串联后的if...else有明显的代码块边界,逆向工具通常
可以将代码块标识出来(图中虚线)。
.text:B04912FB nlntftK - ecx
一text: BBU012F&
.tFXt: 004012F fl ,text:0B4Q12FB .
.teit ;0Mt12FB
lot llOrUFa:
jnz nuu r?hth
nln<1ex r 1
short loc_hOt;tB JODflODOth
;CODE KRFF: IFFunctinn]
cmp
nIndex