這個是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,則跳轉到失敗,否則跳轉到成功。