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