02 条件语句静态分析
(很久以前的学习记录,放到博客上来)
逆向一个简单的exe文件。
运行起来只有一个简单的对话框,显示出“Hello! Windows”
把exe拖到WinHex中看二进制了(或者说是16进制)。
看到几个应该是关键的地方:
PE文件的DOS_header的MZ(4a5d)标志没啥好说的。
发现了一个C盘下的路径,以及最常见的USER32.dll 和 KERNEL32.dll , 以及一个GetActiveWindow函数。
![图片](http://r.photo.store.qq.com/psb?/V11jNGht4C3zP5/OnAb7g38NjzqfcwEhy0NktSYewikxIdiS5RPPhXISsI!/o/dCABAAAAAAAA&bo=9gIsAPYCLAADEDU!)
把exe拖到IDA中看反汇编。
![图片](http://r.photo.store.qq.com/psb?/V11jNGht4C3zP5/uj*9W5XSVFLcxb0JiwwTG3LhaLA2mEbo.g0hla*DdgI!/o/dCABAAAAAAAA&bo=RQWAAqEGJQMDIEY!)
在Graph overview视图中可以看到程序是有两个不同的分支的,有两句注释分别写的“Hello! 2012” ,"Hello! Windows".
尝试给exe传参运行,将exe拷贝到了C盘下,用cmd命令行传参“2012”直接运行起来。
![图片](http://r.photo.store.qq.com/psb?/V11jNGht4C3zP5/6sfr04ydUB3e5j*Q.DDVjvBLM0s75MTGFlbF7UsdyZM!/o/dCABAAAAAAAA&bo=6wKAAtQDSAMDEMI!)
成功运行到了另外一个分支。
IDA中空格键进反汇编:
![图片](http://r.photo.store.qq.com/psb?/V11jNGht4C3zP5/jeNcgP4vR*fYMnNcNke0yfesQx4HxfJCYpwJ6vTyvms!/o/dPYAAAAAAAAA&bo=bQWAAp8GDQMDMGg!)
.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;
}