通过行为分析,发现这个提示对话框应该是modal dialog性质的messagebox
.在win32 api中,好像有doModalDialog
和MessageBox
的函数,由于界面相关操作的api一般存在于user32.dll
用windbg
附加到进程上去,并查找一下有没有上面函数.
对照MSDN,主要在上面下划线的函数打断点
运行一下si
,照样输入注册码”hello world”
根据MessageBox
的原型
int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT UType);
看一下第二个参数0006fcac,由于是A后缀,说明是ASCII码.
可见,这里已经找到了相应的错误处理分支.
如果这个进程是多线程的话,那么它有可能通过另外一个线程把注册码比对结果放到这个线程来弹出对话框.
看一下有多少个线程:
只有一个线程,看来它比对注册码应该也是这个线程里.
再仔细看一下栈:
0006fc70 00407c8d 000d0226 0006fcac 005bc3dc USER32!MessageBoxAWARNING: Stack unwind information not available. Following frames may be wrong.
0006fc94 00407ec5 0006fcac 00000005 00000000 Insight3+0x7c8d
0006feac 00448c3c 0053e96c 00000001 00000002 Insight3+0x7ec5
0006fec4 00447ac5 00000001 00000000 00000000 Insight3+0x48c3c
0006fee0 0043fdfd 7c921000 0006fed0 7c937ea0 Insight3+0x47ac5
0006ff34 0051ed0b 00400000 00000000 00092341 Insight3+0x3fdfd
0006ffc0 7c81776f 00091378 7c93003d 7ffd9000 Insight3+0x11ed0b
可以看到,
0006fc94 00407ec5 0006fcac 00000005 00000000 Insight3+0x7c8d
的第一个参数和MessageBoxA
的第二个参数是一样的.也就是说,真正产生
You typed an invalid serial number
是在
0006feac 00448c3c 0053e96c 00000001 00000002 Insight3+0x7ec5
而由windbg显示堆栈的第二列数据是返回地址,指向调用者函数的下一条指令可知,
0006feac 00448c3c 0053e96c 00000001 00000002 Insight3+0x7ec5
的地址是00407ec5
由于00407ec5是位于执行文件的地址范围,又是绝对地址,所以,用ida
打开这个执行文件,跳转到这个地址
根据调用约定,可以看到, 0006fcac这个值是00407EAD这条指令调用_sprintf
得来的.这方面的知识可以看我<<coredump原理问题探究windows版>>的第三章.
在00407EAD断点,看一下并在windbg
下看一下这段汇编:
可以看到, ebp+Str就是ebp+8,就是函数的第一个参数.看一下这个参数是什么,按照sprintf
的原型,它应该是格式化字符串
由于这个值是第一参数,由上一层函数
0006fec4 00447ac5 00000001 00000000 00000000 Insight3+0x48c3c
传过来的.
返回值则是由
0006feac 00448c3c 0053e96c 00000001 00000002 Insight3+0x7ec5
可知是00448c3c.
有可能上一层函数才是做注册码校验,由于校验不通过,才会走到错误分支,把这个值传过来,弹出一个对话框来的.
用IDA
看一下00448c3c所在的函数
可以看到,确实如此.那么loc_448c32这个分支是由哪里跳过来的.
双击一下右面的
; CODE XREF: sub_448AC3+11Dj
就可以跳转到
由上面可以看到,跳到loc_448c32
是因为sub_448f37
的返回值为0.也就是说,sub_448f37
有可能是校验注册码的函数.
在调用sub_448F37
的地址00448BD9打断点,看一下sub_448F37
的参数值是什么?
可以看到,sub_448F37
确实是校验注册码的地方.
通过对sub_448F37
里面的一系列过程逆向,可以找出42万个注册码.有这样的特征:
SI3US-XXXXXX-YYYYY
其中X和Y可以是任意数字.
暗号:80c1c