某个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,则跳转到失败,否则跳转到成功。






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