刘收获

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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   沉疴  阅读(340)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示