刘收获

导航

02 条件语句静态分析

(很久以前的学习记录,放到博客上来)
逆向一个简单的exe文件。

运行起来只有一个简单的对话框,显示出“Hello! Windows”

图片 

 
 把exe拖到WinHex中看二进制了(或者说是16进制)。

看到几个应该是关键的地方:

PE文件的DOS_header的MZ(4a5d)标志没啥好说的。

发现了一个C盘下的路径,以及最常见的USER32.dll 和 KERNEL32.dll , 以及一个GetActiveWindow函数。

图片

图片 

图片 

 把exe拖到IDA中看反汇编。

图片
 
在Graph overview视图中可以看到程序是有两个不同的分支的,有两句注释分别写的“Hello! 2012” ,"Hello! Windows".
尝试给exe传参运行,将exe拷贝到了C盘下,用cmd命令行传参“2012”直接运行起来。

图片

成功运行到了另外一个分支。

IDA中空格键进反汇编:

图片

.text:00401006                 push    offset String2  ; "2012"
.text:0040100B                 push    eax             ; lpString1

这两句push应该是在压参数。

.text:0040100C                 call    ds:lstrcmpW
.text:00401012                 push    0               ; uType
.text:00401014                 push    offset Caption  ; "MESSAGE"
.text:00401019                 test    eax, eax
.text:0040101B                 jnz     short loc_401035 

随后call 调用lstrcmpW()函数,也就是  eax = lstrcmpW(eax,"2012"),

如果在这里传参“2012” 赋值给 eax,则lstrcmpW()返回 0 给 eax,

之后test    eax, eax         eax为0,ZF置1,

 然后jnz     short loc_401035 ,ZF位1不为0,则不跳转,执行以下命令:

.text:0040101D                 push    offset Text     ; "Hello! 2012"
.text:00401022                 call    ds:GetActiveWindow
.text:00401028                 push    eax             ; hWnd
.text:00401029                 call    ds:MessageBoxW
.text:0040102F                 xor     eax, eax
.text:00401031                 pop     ebp
.text:00401032                 retn    10h

出现  "Hello! 2012"对话框。

如果不给eax传参,则最终 jnz     short loc_401035 ,跳转到地址401035处:

.text:00401035                 push    offset aHelloWindows ; "Hello! Windows"
.text:0040103A                 call    ds:GetActiveWindow
.text:00401040                 push    eax             ; hWnd
.text:00401041                 call    ds:MessageBoxW

直接F5进C语言:

int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
{
  HWND v4; // eax@2
  int result; // eax@2
  HWND v6; // eax@3
 
  if ( lstrcmpW(lpCmdLine, L"2012") )
  {
    v6 = GetActiveWindow();
    MessageBoxW(v6, L"Hello! Windows", L"MESSAGE", 0);
    result = 0;
  }
  else
  {
    v4 = GetActiveWindow();
    MessageBoxW(v4, L"Hello! 2012", L"MESSAGE", 0);
    result = 0;
  }
  return result;
}

 

posted on 2017-11-19 10:36  沉疴  阅读(333)  评论(0编辑  收藏  举报