IDA Pro是一款強(qiáng)大的反匯編軟件备恤,特有的IDA視圖和交叉引用,可以方便理解程序邏輯和快速定位代碼片斷渠牲,以方便修改频祝。
**IDA視圖**
示例程序
下面會通過修改示例程序的輸出字符串泌参,來講解如何使用IDA Pro。
#include
main()
{
int n;
scanf ("%d",&n);
if (n > 0)
printf("a > 0"); //后面會用IDA Pro把'a'改成'n'
else
printf("n < 0");
}
編譯后的程序下載:demo
運行IDA Pro
運行IDA Pro常空,并使用PE文件的方式打開示例的test.exe文件沽一。IDA Pro會新建一個工程,并開始反匯編程序漓糙。反匯編完成后铣缠,在[IDA-View]窗口中,可以看到程序邏輯的樹形圖昆禽,如下:
樹形圖把條件分支清晰地顯示出來了蝗蛙。左下角有IDA視圖的縮略圖,在上面點擊可以快速定位到視圖的指定位置醉鳖。 IDA的View有幾個按鈕對定位代碼很重要歼郭,如下圖所示:
從上到下分別是:
Open exports window:打開導(dǎo)出窗口
Open import window:打開導(dǎo)入窗口
Open names window:函數(shù)和參數(shù)的命名列表
Open functions window:程序調(diào)用的所有函數(shù)窗口
Open strings window:打開字符串顯示窗口,會列出程序中的所有字符串辐棒,該窗口有助于你通過程序的運行輸出逆向找出對應(yīng)的代碼片斷。
定位代碼片斷
假設(shè)我們現(xiàn)在接到個任務(wù),需修正程序漾根,把輸出“a > 0”修正為“n > 0”泰涂。示例程序比較簡單,直接看IDA視圖我們就能找到需修改的代碼片斷辐怕,但實際處理時逼蒙,可能程序有幾m大,通過一個個看IDA視圖已沒法有效找到相關(guān)的執(zhí)行代碼片斷寄疏,這時怎么辦是牢? 使用字符串窗口和IDA強(qiáng)大的交叉引用! 點擊View里的[Open strings windows]按鈕陕截,可以看到如下的程序字符串:
程序的字符串較少驳棱,可以很快地看到我們需要的字符串“a > 0”在數(shù)據(jù)段00403003位置。假如字符串多到已不能肉眼定位查找农曲,因為字符串窗口是沒有查找功能的社搅,這時需要借助其他的文本編輯器,如notepad乳规,editplus等形葬。在字符串窗口內(nèi)右鍵,選擇菜單[copy]命令暮的,會把字符串窗口的所有內(nèi)容復(fù)制到剪貼板笙以,再粘貼到記事本中查找就可以了。 雙擊字符串窗口的該行字符串冻辩,會跳轉(zhuǎn)到IDA視圖的00403003位置猖腕,如下圖所示:
單擊’a > 0’中的a,a會高亮微猖,
最后定位的代碼片斷谈息,上圖顯示的匯編指令即是我們要找的代碼片斷,這時點擊[Hex View-A]窗口凛剥,會切換到二進(jìn)制瀏覽模式侠仇,并高亮了匯編代碼的二進(jìn)制格式指令,如下圖所示:
已找到需修改的代碼片斷犁珠,剩下的只需把a(bǔ)改成n逻炊。
修改程序文件
在IDA中,可以在[Hex View-A]窗口右鍵選擇[Edit]來修改二進(jìn)制指令犁享。修改后通過右鍵選擇[Commit Change]可以看到修改后的IDA視圖余素。但需要注意的是,這種方式的修改并不會更新原始程序文件炊昆,實際只是修改了IDA的項目文件桨吊!IDA中只適合做一些驗證性的修改威根,確保正確后再使用其他工具修改原始程序文件。 在IDA中驗證修改正確后视乐,可以使用UltraEdit或Hex Workshop來修改原始程序文件洛搀。下面會以UltraEdit為例來說明如何修改。
下載好UltraEdit佑淀,用UltraEdit直接打開程序文件留美,如上圖所示,UltraEdit會以16進(jìn)制模式顯示程序文件伸刃。UltraEdit顯示的地址和IDA顯示的地址是不同的谎砾,為了找到對應(yīng)代碼片斷在UltraEdit中的實際地址,需要使用到UltraEdit的查找功能捧颅。在IDA中復(fù)制需修改的16進(jìn)制模式顯示的指令景图,在UltraEdit中打開查找,粘貼并查找該16進(jìn)制字符串隘道,UltrEdit會很快定位到該指令處症歇,如下圖所示:
找到了UltraEdit的對應(yīng)位置 現(xiàn)在我們要把“a > 0”改成“n > 0”,a對應(yīng)的ASCII碼是61谭梗,而n對應(yīng)的ASCII碼是6E忘晤,只需把61改成6E就可以了,修改后保存激捏。
再次運行设塔,可以看到結(jié)果已改變!
示例只是修改了字符串远舅,只需更改數(shù)據(jù)段內(nèi)容就可以了闰蛔,不用更改指令。假如需要更改指令图柏,需要參考指令集的指令操作表寫出對應(yīng)指今的16進(jìn)制形式序六,再修改。