1625-5 王子昂 总结《2017年9月25日》 【连续第358天总结】
A. Reversing.kr-Replace
B.
Replace
先查一波壳,还好没有
运行,是一个GUI程序,下面Label框中显示Wrong!,说明没法找Msgbox了呢
随便输入后点Check,就停止运行了……嗯?这么暴力的,输错就GG吗
惯例拖入IDA,WinMain中只有构造窗口的DialogBoxParamA函数,回调函数使用了DialogFunc
搜索字符串发现Correct!在DialogFunc中有引用,遂查看代码并反编译:
// write access to const memory has been detected, the output may be wrong!
BOOL __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4)
{
BOOL result; // eax@2
if ( a2 == 273 )
{
if ( (unsigned __int16)a3 == 2 )
{
EndDialog(hDlg, 2);
result = 1;
}
else if ( (unsigned __int16)a3 == 1003 )
{
input = GetDlgItemInt(hDlg, 1002, 0, 0);
sub_40466F();
((void (__cdecl *)(void *))loc_404689)(&loc_40469F);
*(_DWORD *)sub_40466F = -1013972794;
sub_40466F();
sub_40466F();
*(_DWORD *)sub_40466F = 1768;
result = 1;
}
else
{
result = 0;
}
}
else
{
result = 0;
}
return result;
}
查了一波API手册,发现回调函数其实叫DialogProc,参数说明只能知道a2为指定消息uMsg,a3为指定消息的其他信息wParam
想研究一波前面判断的具体信息,但是没找到相关手册说明uMsg的对应表
内层循环体的GetDlgItemInt很明显就是获取对话框的值
输入了一下试试,发现只能接受数字,字母和符号都是无法输入的
在OD中下断DialogFunc,发现窗口开启状态下会不停地断到,说明消息是不断传送的。似乎是当焦点在窗口上方时a2=273,点击按钮时a3=3。
参数不搞明白倒是不怎么影响啦,在内层循环体下断可以在点击按钮后断到
将输入送入0x4084d0后就call 0040466F了
这个call是一个很关键很有趣的点,需要慢慢地仔细分析
首先回忆一下汇编中函数调用的相关知识
当call某处时,首先将下一条指令的地