某代码查看器的保护突破

现象

某代码查看器的保护突破_第1张图片某代码查看器的保护突破_第2张图片

 

分析

 

通过行为分析,发现这个提示对话框应该是modal dialog性质的messagebox.在win32 api中,好像有doModalDialog和MessageBox的函数,由于界面相关操作的api一般存在于user32.dll

用windbg附加到进程上去,并查找一下有没有上面函数.

某代码查看器的保护突破_第3张图片

 

对照MSDN,主要在上面下划线的函数打断点

某代码查看器的保护突破_第4张图片

 

运行一下si,照样输入注册码”hello world”

某代码查看器的保护突破_第5张图片

 

根据MessageBox的原型

int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTRlpCaption,UINT UType);

看一下第二个参数0006fcac,由于是A后缀,说明是ASCII码.

 

可见,这里已经找到了相应的错误处理分支.

 

如果这个进程是多线程的话,那么它有可能通过另外一个线程把注册码比对结果放到这个线程来弹出对话框.

看一下有多少个线程:

某代码查看器的保护突破_第6张图片

 

只有一个线程,看来它比对注册码应该也是这个线程里.

再仔细看一下栈:

0006fc7000407c8d 000d0226 0006fcac 005bc3dcUSER32!MessageBoxA

WARNING:Stack unwind information not available. Following frames may be wrong.

0006fc9400407ec5 0006fcac 00000005 00000000Insight3+0x7c8d

0006feac00448c3c 0053e96c 00000001 00000002 Insight3+0x7ec5

0006fec400447ac5 00000001 00000000 00000000 Insight3+0x48c3c

0006fee00043fdfd 7c921000 0006fed0 7c937ea0 Insight3+0x47ac5

0006ff340051ed0b 00400000 00000000 00092341 Insight3+0x3fdfd

0006ffc07c81776f 00091378 7c93003d 7ffd9000 Insight3+0x11ed0b

可以看到,

0006fc9400407ec5 0006fcac 00000005 00000000Insight3+0x7c8d

的第一个参数和MessageBoxA的第二个参数是一样的.也就是说,真正产生

You typedan invalid serial number

是在

0006feac00448c3c 0053e96c 00000001 00000002 Insight3+0x7ec5

而由windbg显示堆栈的第二列数据是返回地址,指向调用者函数的下一条指令可知,

0006feac00448c3c 0053e96c 00000001 00000002 Insight3+0x7ec5

的地址是00407ec5

由于00407ec5是位于执行文件的地址范围,又是绝对地址,所以,用ida打开这个执行文件,跳转到这个地址

某代码查看器的保护突破_第7张图片

 

根据调用约定,可以看到, 0006fcac这个值是00407EAD这条指令调用_sprintf得来的.这方面的知识可以看我<<coredump原理问题探究windows版>>的第三章.

在00407EAD断点,看一下并在windbg下看一下这段汇编:

某代码查看器的保护突破_第8张图片

 

可以看到, ebp+Str就是ebp+8,就是函数的第一个参数.看一下这个参数是什么,按照sprintf的原型,它应该是格式化字符串

 

由于这个值是第一参数,由上一层函数

0006fec400447ac5 00000001 00000000 00000000 Insight3+0x48c3c

传过来的.

返回值则是由

0006feac00448c3c 0053e96c 00000001 00000002 Insight3+0x7ec5

可知是00448c3c.

有可能上一层函数才是做注册码校验,由于校验不通过,才会走到错误分支,把这个值传过来,弹出一个对话框来的.

用IDA看一下00448c3c所在的函数

 

可以看到,确实如此.那么loc_448c32这个分支是由哪里跳过来的.

双击一下右面的

; CODE XREF: sub_448AC3+11Dj

就可以跳转到

某代码查看器的保护突破_第9张图片

 

由上面可以看到,跳到loc_448c32是因为sub_448f37的返回值为0.也就是说,sub_448f37有可能是校验注册码的函数.

在调用sub_448F37的地址00448BD9打断点,看一下sub_448F37的参数值是什么?

某代码查看器的保护突破_第10张图片

 

可以看到,sub_448F37确实是校验注册码的地方.

通过对sub_448F37里面的一系列过程逆向,可以找出42万个注册码.有这样的特征:

SI3US-XXXXXX-YYYYY

其中X和Y可以是任意数字.必须有六个X,五个Y.


你可能感兴趣的:(代码)