1. 程式人生 > >逆向學習XXclient怎樣僅僅執行一個實例

逆向學習XXclient怎樣僅僅執行一個實例

關閉 code 就會 sap pan 動態 紅色 空氣 直觀

個人覺得學習分兩種,

  • 一種是當面請教和直接從書本網絡中的資料學習.
  • 其二就是看著令你驚嘆的作品-頓悟.
  • 什麽?頓悟不了?那我們就一起來逆向學習吧!差點忘了,我並不打算提供Demo,這並不重要,難道你打算遇到一個同樣的情景?

    重在方法.

註意:

本文為了照應新手人群,對於某些內容可能會非常具體的推演.
名詞解釋:

  1. 一個實例:一個對象,這裏指一個程序被創建後在內存中的數量.大白話就是:成功執行了幾次.

事由:

今天閑來無事(忙裏偷閑)執行了兩次Dr_COM的寬帶認證client.如咱所料,
如圖:
技術分享
我們知道,限制程序僅僅執行一個實例的方法非常多,例如以下主流的幾種:

  1. 查找窗體.
  2. 使用相互排斥對象之類的.病毒經常也這麽幹.
  3. 使用共享區塊.
  4. 使用暫時文件.

那我們的COM先生是否怎樣實現的呢?

開弓or工

好的操起家夥(OllyDBG,IDA)開始一次內科手術.
假設你不是非常熟悉這兩個工具能夠在須要的時候參考這裏:

反病毒工具-IDA使用介紹
反病毒工具-OllyDBG使用簡單介紹

首先,用OD加載我們Dr.COM
技術分享

這裏的入口點似乎是早期的VS版本號編譯的Release版本號C/C++程序.用工具ExeInfoPE驗證一下我們的經驗並簡單看下是否是偽裝殼:
技術分享

ExeInfoPe的使用方法及介紹能夠看這裏:
ExeInfo在反病毒領域的使用方法

我們須要找到哪句提示語“程序xxx已經在執行”,在系統中的位置.在界面中央(反匯編窗體)右鍵,選擇“中文字符串搜索->智能搜索”(這是一個插件,你能夠從主流的OD版本號中同樣位置找到相似的字符串查找功能).彈窗如圖:
技術分享

非常幸運,我們找到了它.我們並非每次都這麽幸運,由於一些程序猿會將它們加密存儲.對於處理種種加密情況我們有機會再談.
技術分享
雙擊這個字符串就可以來到這個字符串的地址.
技術分享

我們看到一個紅色箭頭指向這裏.而本字符串地址的上面是一個jmp,它指向了以下的某處,這表明指令執行的時候僅僅能從遠處跳到本字符串地址而不可能是一行一行走下來的.
技術分享

請牢記我們的目的,我們的目的是

找到程序怎樣進行”是否執行了多個實例”的推斷.這個推斷導致指令走向兩條或者很多其它的路.當中一條就是這條提示信息.順藤摸瓜就可以.

我們逆著跳到本字符串地址的箭頭找到根源.
技術分享

如上圖,我們找到了jmp的根源它就在我們圈住的地方.這是一個動態的jmp.它依據eax的值進行運算,eax*4+0x401D98,運算結果是一個地址跳轉表,指向結果.eax就是關鍵.是誰改動了eax呢?
技術分享

這裏有條mov 指令,原來eax的值來自於[esp+0x174],而esp是棧頂寄存器,僅僅有在執行到該條指令的時候才會有真正參與運算的值.好的.F2在該條指令下斷點.然後執行起我們的程序,聰明的OD已經幫助我們計算出了地址,原來eax的值來自於ss:[0018FC64].ss是段選擇寄存器,就是我們右下角的窗體顯示的內容咯.
技術分享

我們要監視這個地址是誰將’1’這個值寫入當中的.這裏提供三種方法:

  1. 緊盯住該地址的內容,我們通過棧回溯跟蹤到改動者.
  2. 通過硬件斷點,在左下角窗體-“數據窗體”找到該地址,右鍵”斷點”->”寫入斷點”.長度依據具體情況,這裏WORD就可以.
  3. 使用RUN跟蹤.菜單條”調試”->”設置條件”,將中斷條件設置為該地址為’1’則中斷.至於關於強大的RUN跟蹤的使用方法,假設你感興趣,你須要找OD的資料學習.

下圖描寫敘述了觀察棧回溯的兩種方法:
技術分享

皇天不負有心人,我終於找到了將’1’寫入的操作,它的地址是:403992.如圖:
技術分享

檢測到多個實例的情況已經找到.那麽單個演示樣例執行的情況怎樣呢?我們關閉上面打開的兩個Dr.COM程序.如今我們要實驗一下僅僅執行一個該程序的時候eax是多少?
技術分享

將程序拖入OD中一個client,找到我們上次的eax*4+0x401D98的地方.發現正常情況下eax的值為A.繼續用上面的方法尋找是誰改動了這個eax,找到了一個新的地址403466.這真是非常醉,這個程序看來是在推斷之後進行了不少其它任務才進行push操作的.VS2005…

既然我們有了兩次操作的地址,僅僅要找到它們的共同調用者就可以.一般通過重復對照OD中的棧回溯能夠幫助我們找到它們的祖先函數.可是這次我不打算用這樣的毫無趣味的方法.

IDA上場!!!!

反病毒工具-IDA使用介紹
IDA作為一款擅長圖形化程序流程的超棒靜態分析工具非常適合此次任務.將程序拖入IDA.
小經驗:註意:不要快捷方式拖進去.OD是會將快捷方式指向的程序進行分析,**而**IDA連快捷方式本身都不放過!
如圖:
技術分享

假設你發現你的界面是匯編界面而不是像上圖的流程圖,這往往意味你剛剛不小心關閉了流程圖.放心,你能夠通過View->Opensubviews->Proximity browsers 又一次打開它.
技術分享

在圖形界面按”G”,寫上push 0xA的地址”403466”如圖:
技術分享

OK,跳過去:
技術分享

同樣的辦法按”G”,寫上push 0x1的地址.找到push 0x1在流程圖的顯示.

在IDA中使用你的Ctrl+鼠標滾輪,能夠放大or縮小流程圖.讓你感覺到更直觀.
我的天兩幅圖居然沒有在一幅”大圖”裏面!!!這意味這兩個函數在調用上相隔非常遠.
技術分享

我們通過”大圖”的頂端.點擊函數名稱,按住”X”鍵能夠看到交叉引用的界面.這項功能非常有用,它能夠將全部對目標函數或變量的調用列出來.我們看到對於push 0xA這一路的頂端函數僅僅有一個父函數調用過它.雙擊這個父函數.

這以下的圖中,我們看到它們的關系:
技術分享

讓我們放大分道揚鑣之地.如圖:
技術分享

從後往前看,假設cmp結果是0,就會跳到右邊(loc_403A99),沒有發現已經執行了本程序.cmp比較的是eax是否等於0FFFFFFFF(八個F).假設等於就是正常.OK,顯然是call sub_40A4E0做了某種推斷導致eax的值.

如今記住eax假設等於0FFFFFFFF就是沒有檢測到其它演示樣例.
在OD中進入這個函數:
技術分享

發現新大陸

我和我的小夥伴們都驚呆了.這全然超出了我的預期.本來以為這個程序會用傳統的實例檢測方法,可是我們看到了CreateFileMappimg之類的函數.初步推斷此程序利用多次映射文件產生的沖突來做的文章.繼續看:
我們發現一個新的分道揚鑣的跳轉,它位於40A529.
它用以下這句做了比較:

cmp ebp,0xB7

向上追溯:

mov ebp,eax

ebp來自eax.依照約定,函數的調用能夠改動eax的值來達到傳遞結果的目的.而這裏的eax正是GetLastError函數的執行結果.
技術分享

地址40A529的代碼的意思是假設執行GetLastError返回的不是0xB7,則跳走.跳走的結果是:

0040A54A   mov eax,edi

而此時的edi為FFFFFFFF,回憶上面,這個值意味著我們沒有檢測到還有一個演示樣例在執行.

有同學可能會問,’0xB7是嘛意思呀?

隨機的一個值?’.當然不是,0xB7是錯誤碼,它擁有明白的含義,你能夠通過VisualStudio中菜單條中的工具->”錯誤查找”小工具,找到它的含義:
技術分享

果然如此.

收工總結

到此我們已經達到了我們預期的目的-探明Dr. Com檢測到自己是否僅僅執行了一個實例的方法.通過逆向分析了解到它是通過:
設置CreateFileMapping函數的最後一個參數MapName,該參數是一個共享值.假設該值被重復命名,會報錯,該錯誤能夠通過GetLastError函數得到,返回值為ERROR_ALREADY_EXISTS(0xB7).

知識拓展

很多其它關於該函數的情況能夠閱讀這裏:
CreateFileMapping使用方法

學到了什麽?

估計一名純新手讀者通過閱讀本文會學到:

  1. OD對程序的基本分析方法.
  2. 棧回溯概念
  3. 利用IDA流程圖分析程序.
  4. 一種獨特的進程相互排斥方法.(目的)
  5. ……

我從中學到了什麽:

  1. 復習了以上全部知識
  2. 沿途看了數個感興趣的WindowsAPI的實現.
  3. 直接下斷經常使用相互排斥函數找捷徑差點被坑.
  4. 了解了一些字符串函數和文件夾路徑設置函數的使用方法.
  5. ……

尾聲

在我幼稚園時,老師問我,”你從哪裏懂得這麽多”.”我的老師是書本.”我回答道.
有人說書本是不會說話的老師.假設你學到很多其它知識,請珍惜和程序在一起的時光吧.

有問題請留言評論以便討論.
假設本文為你來到了新奇空氣,請點(~ o ~)~
技術分享

逆向學習XXclient怎樣僅僅執行一個實例