C語言與匯編語言對照分析.doc
《C語言與匯編語言對照分析.doc》由會員分享,可在線閱讀,更多相關(guān)《C語言與匯編語言對照分析.doc(20頁珍藏版)》請在裝配圖網(wǎng)上搜索。
. 游戲通常會包含各種各樣的功能,如戰(zhàn)斗系統(tǒng)、UI渲染、經(jīng)濟(jì)系統(tǒng)、生產(chǎn)系統(tǒng)等,每個系統(tǒng)又包含各式各樣子功能,如傷害判定、施法、使用道具、角色移動、玩家之間交易等等。這些游戲功能在代碼實(shí)現(xiàn)中往往少不了條件判斷(如傷害判定)、循環(huán)(遍歷物品列表,播放游戲動畫)等。 在逆向過程中如果可以從匯編語言識別出對應(yīng)的語法結(jié)構(gòu),在分析過程中將匯編代碼轉(zhuǎn)換為C語言語法結(jié)構(gòu),可以幫助對程序執(zhí)行流程的理解。 下面分別介紹最常見的邏輯語法結(jié)構(gòu): a)if...else b)switch...case c)for、while 注:文中使用的反匯編工具為IDA 一、if...else 匯編代碼: if...else結(jié)構(gòu)比較固定,通常包含cmp指令、jcc指令以及滿足條件后執(zhí)行的指令塊。 if...else結(jié)構(gòu)可以串聯(lián),串聯(lián)后的if...else有明顯的代碼塊邊界,逆向工具通??梢詫⒋a塊標(biāo)識出來(圖中虛線)。 二、switch...case 1.一個簡單switch...case 匯編代碼: 上圖顯示了switch...case基本的結(jié)構(gòu):a)跳轉(zhuǎn)表達(dá)式;b)分支代碼;c)跳轉(zhuǎn)表 a)跳轉(zhuǎn)表達(dá)式 其中l(wèi)oc_401235代碼塊對應(yīng)switch...case中default分支。 當(dāng)nGameEvent>4時,跳轉(zhuǎn)到loc_401235代碼塊,即default分支。 當(dāng)nGameEvent<=4時,根據(jù)跳轉(zhuǎn)表達(dá)式進(jìn)行跳轉(zhuǎn): jmpds:off_40123C[nGameEvent*4] 其中off_40123C為跳轉(zhuǎn)表地址,跳轉(zhuǎn)表中每一項代表一個32位地址(4個字節(jié)),當(dāng)nGameEvent為0按第一項地址跳轉(zhuǎn),當(dāng)nGameEvent為1按第二項地址跳轉(zhuǎn),依次類推。 b)分支代碼 各個分支的處理邏輯都在這里,示例代碼中僅僅簡單的調(diào)用對應(yīng)函數(shù)。 (PS:這里用jmp而不用call是編譯器優(yōu)化的結(jié)果) c)跳轉(zhuǎn)表 跳轉(zhuǎn)表實(shí)際是一個地址數(shù)組,存放了每個跳轉(zhuǎn)分支的地址(32位絕對地址),當(dāng)nGameEvent為0時,跳轉(zhuǎn)表達(dá)式讀取數(shù)組中第一項數(shù)據(jù)(0x0040121C),即 .text:0040121CE98FFFFF+jmp?DoLogin@@YAXXZ 調(diào)用DoLogin函數(shù)。 (PS:實(shí)際運(yùn)行時,由于隨機(jī)化基址,從調(diào)試器看到的跳轉(zhuǎn)表內(nèi)容可能與靜態(tài)分析時不同,這是重定位引起的,關(guān)于重定位的原理可以參考相關(guān)文檔,這里不再詳述) 2.不連續(xù)的switch...case 上面的示例中case的值是連續(xù)的,因此跳轉(zhuǎn)表比較規(guī)則。在實(shí)際使用中可能會遇到不規(guī)則的case值,如下圖: 匯編代碼: 上面的代碼有兩個特點(diǎn): i.最小case值非0 上圖中最小case值為3,為了不浪費(fèi)跳轉(zhuǎn)表空間,編譯器會將索引值減去3保證最小的case值對應(yīng)跳轉(zhuǎn)表中的第一項。 ii.case值不連續(xù) 編譯器會在跳轉(zhuǎn)表間隔中插入default跳轉(zhuǎn),保證邏輯正確。(以空間換取時間) 3.雙重跳轉(zhuǎn)表 匯編代碼: 相對于前一個示例,此處case值間隔更大。如果按照之前的方法,跳轉(zhuǎn)表的大小需要(110-30+1)*4=324字節(jié),占用內(nèi)存空間大。 編譯器為了節(jié)省空間,使用了雙重跳轉(zhuǎn):跳轉(zhuǎn)表、間接跳轉(zhuǎn)表。其中跳轉(zhuǎn)表與之前介紹的跳轉(zhuǎn)表一致,而間接跳轉(zhuǎn)表保存的不是分支地址,而是索引值,指向跳轉(zhuǎn)表中的索引。 跳轉(zhuǎn)表: 間接跳轉(zhuǎn)表: 在進(jìn)入switch...case時,先算根據(jù)間接跳轉(zhuǎn)表獲得索引號,再根據(jù)索引號查找跳轉(zhuǎn)表,獲取實(shí)際分支地址。 使用雙重跳轉(zhuǎn)表后,實(shí)際占用空間:5*4+(110–30+1)=101字節(jié),大大減少空間占用。 4.swtich...case退化 當(dāng)case值間隔過大,使用跳轉(zhuǎn)表、雙重跳轉(zhuǎn)表消耗的空間太大,編譯器會將switch...case退化為if...else,如下圖: 匯編代碼: 這里沒有跳轉(zhuǎn)表結(jié)構(gòu),只剩下cmp/jcc指令,可見編譯器已經(jīng)將swtich...case轉(zhuǎn)換為等價的if...else。但在轉(zhuǎn)換過程中,編譯還是做了力所能及的優(yōu)化:通過二叉查找法加快跳轉(zhuǎn)分支的查找。 5.嵌套switch...case 匯編代碼: 可以看出嵌套的switch...case結(jié)構(gòu)在匯編代碼上是相對獨(dú)立的,外層和內(nèi)層switch結(jié)構(gòu)有各自的跳轉(zhuǎn)表。 外層跳轉(zhuǎn)表: 內(nèi)存跳轉(zhuǎn)表(雙重跳轉(zhuǎn)表): 根據(jù)跳轉(zhuǎn)表中的地址項,也可以清楚的區(qū)分外層和內(nèi)層的跳轉(zhuǎn)分支。 三、循環(huán)語句 a)for循環(huán) 匯編代碼: 其中nopdwordptr[eax+00h]為指令對齊,沒有實(shí)際意義。循環(huán)的匯編實(shí)現(xiàn)為: b)while循環(huán) 匯編代碼: 其中nopdwordptr[eax+eax+00h]為指令對齊,沒有實(shí)際意義。循環(huán)的匯編實(shí)現(xiàn)為: 從上面可以看出,for和while結(jié)構(gòu)的匯編實(shí)現(xiàn)幾乎一摸一樣,僅僅是使用的寄存器有些區(qū)別。實(shí)際逆向過程中將循環(huán)映射為for或者while結(jié)構(gòu)都是可以的。同時還可以看出,循環(huán)有個明顯的特征:往回跳轉(zhuǎn)(向地址小的方向跳轉(zhuǎn)),大部分情況下遇到往回跳轉(zhuǎn)的指令就是循環(huán),極少數(shù)如編譯器代碼結(jié)構(gòu)優(yōu)化生成的往回跳轉(zhuǎn)不是循環(huán)除外。 四、總結(jié) 語法結(jié)構(gòu)對應(yīng)的匯編代碼與編譯器有很大關(guān)系,同一份源代碼不同編譯器生成的匯編代碼結(jié)構(gòu)不一樣;即使是同一個編譯器,不同的編譯選項生成的匯編代碼結(jié)構(gòu)也不盡相同。需要在逆向過程中慢慢熟悉編譯器的特性。 精選word范本!- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
15 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 語言 匯編語言 對照 分析
鏈接地址:http://www.820124.com/p-5399770.html