有什麼逆向程序流程的技巧?

最近在學習OD逆向程序,有什麼逆向 【程序流程】 的技巧嗎?

比如0day安全一書上詳細說明了safeseh的檢測流程,我想自己逆向跟一遍這個流程,但是很多call jmp je/jne ja jb,跟不到重點就已經頭大了。。。


關於系統性學習軟體逆向,可以看看這個回答:為了CTF比賽,如何學習逆向和反彙編? - zheng yufeng 的回答

我真的好想告訴你,你不明白原理,只學一些技巧長遠來看沒什麼用.


好久沒碰逆向了,我就說幾條還記得住的吧

  • 善用堆棧

小到功能函數,大到「殼」,任何有意義的函數(不是運行完call就push個別的地址ret走的)都要維持堆棧。所以在分析函數、分析殼時,要多關注堆棧平衡

  • 找到功能函數入口

除了直接用asm語言編出來的程序,其他各種語言都有一套固定的「底子」。多看文章、分析了解如果快速找到某按鈕/過程的函數入口很重要。delphi有dede,其他的語言就靠經驗了。(有點忘了,輕拍歡迎補充)

  • 以函數為研究對象分析

除了一行一行分析最基本的函數外,最重要的目的是——這個函數(call)到底在實現什麼功能?以堆棧輸入的參數有哪些?寄存器的輸出有哪些?輸入用不用到寄存器?牽扯到哪些全局變數(直接讀取寫入在內存中而不走參數/寄存器)

  • 靜態和動態相結合

動態用OD,靜態用IDA。現在IDA的X-RAY插件據說已經很完善了,不試試看?ida+od結合在ring3下就是神器……

  • 加強基礎

SEH/TLS/多線程/基本反調試(雖然現在有插件了,但至少isdebuggerpresent這個api不能不知道吧)是基礎內容……看懂了原理再實操比一上來就逆向要好得多……這一點推薦看雪的《加密與解密》以及看雪的精華集,幾年前我還在玩逆向的時候,是每年出一版,每版收集當年論壇上的好文章,用處挺大的。平時沒事可以玩玩crackme,試試做做註冊機什麼的。


佔個坑等以後總結出一套方法體系後再來回答。這裡就先力薦一本在國內被忽視的書:Surreptitious Software(國內譯「軟體加密與解密」,Christian Collberg與Jasvir Nagra著)國內的書談軟體安全大多像看雪的《加密與解密》主要講技術,如何打斷點,殼是什麼,原理是什麼,但對逆向的技巧和代碼分析理論的討論不多。這本書主要從數學的角度講怎樣加密,彌補了這一空缺,但遺憾的是,這本書主要是從防禦的角度看安全,在攻的角度上涉及不多,不過仍可以作為參考資料。


輕量等級重點看寄存器 中量等級的重點看堆棧 大神等級的兩個一起看

CALL這種東西,重點看他的返回值 然後再回過頭看push的參數,而且,不要單純用OD,CE和OD一起用,CE找找標誌位,很多關鍵性的標誌位往上翻幾層就是關鍵CALL了


推薦閱讀:

URL編碼

TAG:逆向工程 | 網路安全 | 信息安全 | 軟體安全 |