某個ReverseMe的分析

這個是TiGa IDA視頻中的文件,他的視頻沒有聲音,所以我還是自己分析吧。


IDA打開文件,選擇對應的選項,一路YES

整個程序的縮略圖

我們一步一步來分析

00401000 > $  6A 00         push    0x0                                 ; |/pModule = NULL
00401002   .  E8 64020000   call    <jmp.&KERNEL32.GetModuleHandleA>    ; |\GetModuleHandleA
00401007   .  A3 77214000   mov     dword ptr [0x402177], eax           ; |
0040100C   .  C705 97214000>mov     dword ptr [0x402197], 0x4003        ; |
00401016   .  C705 9B214000>mov     dword ptr [0x40219B], 004011A6      ; |
00401020   .  C705 9F214000>mov     dword ptr [0x40219F], 0x0           ; |
0040102A   .  C705 A3214000>mov     dword ptr [0x4021A3], 0x0           ; |
00401034   .  A1 77214000   mov     eax, dword ptr [0x402177]           ; |
00401039   .  A3 A7214000   mov     dword ptr [0x4021A7], eax           ; |
0040103E   .  6A 04         push    0x4                                 ; |/RsrcName = 4.
00401040   .  50            push    eax                                 ; ||hInst => NULL
00401041   .  E8 3F030000   call    <jmp.&USER32.LoadIconA>             ; |\LoadIconA
00401046   .  A3 AB214000   mov     dword ptr [0x4021AB], eax           ; |
0040104B   .  68 007F0000   push    0x7F00                              ; |/RsrcName = IDC_ARROW
00401050   .  6A 00         push    0x0                                 ; ||hInst = NULL
00401052   .  E8 C8020000   call    <jmp.&USER32.LoadCursorA>           ; |\LoadCursorA
00401057   .  A3 AF214000   mov     dword ptr [0x4021AF], eax           ; |
0040105C   .  6A 00         push    0x0                                 ; |/hTemplateFile = NULL
0040105E   .  68 6F214000   push    0040216F                            ; ||Attributes = READONLY|HIDDEN|SYSTEM|ARCHIVE|TEMPORARY|402048
00401063   .  6A 03         push    0x3                                 ; ||Mode = OPEN_EXISTING
00401065   .  6A 00         push    0x0                                 ; ||pSecurity = NULL
00401067   .  6A 03         push    0x3                                 ; ||ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
00401069   .  68 000000C0   push    0xC0000000                          ; ||Access = GENERIC_READ|GENERIC_WRITE
0040106E   .  68 79204000   push    00402079                            ; ||FileName = "Keyfile.dat"
00401073   .  E8 0B020000   call    <jmp.&KERNEL32.CreateFileA>         ; |\CreateFileA
00401078   .  83F8 FF       cmp     eax, -0x1                           ; |
0040107B   .  75 1D         jnz     short 0040109A                      ; |

這個是OD中的代碼,和大多數程序一樣,先進行程序的初始化,然後要CreateFile一個文件,我們猜測這個文件是keyfile

這個文件的文件名爲Keyfile.dat,我們在當前目錄下創建這個文件,同時寫入一些數據。

CreateFile這個API我們前面的日誌中寫過,這裏就不具體分析了。

如果返回-1,則表示失敗。

如果不失敗,則繼續,也就是說失敗會執行一個MessageBox,提示失敗。

我們繼續往下

0040109A   > \6A 00         push    0x0                                 ; /pOverlapped = NULL
0040109C   .  68 73214000   push    00402173                            ; |pBytesRead = TiGa-vid.00402173
004010A1   .  6A 46         push    0x46                                ; |BytesToRead = 46 (70.)
004010A3   .  68 1A214000   push    0040211A                            ; |Buffer = TiGa-vid.0040211A
004010A8   .  50            push    eax                                 ; |hFile
004010A9   .  E8 2F020000   call    <jmp.&KERNEL32.ReadFile>            ; \ReadFile
004010AE   .  85C0          test    eax, eax
004010B0   .  75 02         jnz     short 004010B4

CreateFile完成之後,調用ReadFile讀取文件中的數據。

BOOL ReadFile(
  HANDLE hFile,                        //文件句柄
  LPVOID lpBuffer,                     //讀取後保存的位置
  DWORD nNumberOfBytesToRead,          //要讀取的字節數
  LPDWORD lpNumberOfBytesRead,         //指向實際讀取字節數的指針
  LPOVERLAPPED lpOverlapped
);
test    eax, eax
表示是否讀取到內容。

004010B4   > \33DB          xor     ebx, ebx
004010B6   .  33F6          xor     esi, esi
004010B8   .  833D 73214000>cmp     dword ptr [0x402173], 0x10
004010BF   .  7C 36         jl      short 004010F7
ebx清零,esi清零,ebx用來走位,esi相當於cout,用來保存個數。

從讀取到得數據中取得其中一個字節,與0比較,也就是判斷字符串是否結束。

與字符‘G’進行比較,如果相等,則esi自加1,否則繼續比較下一個字符。

004010C1   > /8A83 1A214000 mov     al, byte ptr [ebx+0x40211A]
004010C7   . |3C 00         cmp     al, 0x0
004010C9   . |74 08         je      short 004010D3
004010CB   . |3C 47         cmp     al, 0x47
004010CD   . |75 01         jnz     short 004010D0
004010CF   . |46            inc     esi
004010D0   > |43            inc     ebx
004010D1   .^\EB EE         jmp     short 004010C1
關鍵的地方來了。

如果esi即字符G的個數小於8,則跳轉到失敗,否則跳轉到成功。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章