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"
运行起来只有一个简单的对话框,显示出“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应该是在压参数。
随后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,则不跳转,执行以下命令:
出现 "Hello! 2012"对话框。
如果不给eax传参,则最终 jnz short loc_401035 ,跳转到地址401035处:
直接F5进C语言:
这两句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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗