zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    JAVA多线程之AQS
    LRU算法
    JAVA设计之SPI
    JAVA多线程之CAS
    操作系统之中断处理
    计算机领域思想
    操作系统之I/O
    操作系统之虚拟内存
    Mysql事务原理
    Mysql添加索引
  • 原文地址:https://www.cnblogs.com/lsh123/p/7859220.html
Copyright © 2011-2022 走看看