-
-
让crakcme成为注册机
-
发表于:
2006-9-19 15:02
6284
-
【文章标题】: 让crakcme成为注册机
【文章作者】: 醉天使
【软件名称】: muckis's crakcme #1
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: name,serial
【编写语言】: VC++
【使用工具】: OD
【操作平台】: win2k
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
这个crakcme已经由bxm分析过了,算法分析很是详尽,我就不再?嗦了,见http://bbs.pediy.com/showthread.php?threadid=31757这篇文章;
任务:让crackme自动弹出正确的注册码或把正确的注册码写入编辑框;
废话不说,进入我们菜鸟的修炼历程:
1、这个crackme是明码比较的,内存中有程序计算出来的注册码,我们只需要在程序中加入几行代码,在注册码被销毁前用Messagebox弹出,或用SetDlgItemText、setWindowText等函数写到编辑框即可;
2、很庆幸,程序中有MessageBox函数,也有SetWindowText函数
地址 区段 类型 ( 名称 注释
004302D4 .idata 输入 ( USER32.MessageBoxA
004302D8 .idata 输入 ( USER32.SetWindowTextA
我们只要call一下函数的地址,就可以实现函数的调用了,如call 004302D8就是调用SetWindowTextA;
3、我们跟踪一下crackme,看看注册码在什么地方计算完成:
0040155C |> \6A 0A PUSH 0A
0040155E |. 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20]
00401561 |. 51 PUSH ECX
00401562 |. 8D55 C0 LEA EDX,DWORD PTR SS:[EBP-40]
00401565 |. 52 PUSH EDX
00401566 |. E8 B3FAFFFF CALL crackme1.0040101E
0040156B |. 83C4 04 ADD ESP,4
0040156E |. 50 PUSH EAX ; |Arg1
0040156F |. E8 FC9F0000 CALL crackme1.0040B570 ; \crackme1.0040B570
OK,经过0040156F |. E8 FC9F0000 CALL crackme1.0040B570这个call后,正确的注册码已经出现在我们眼前了:0012fb50处,我们用d 0012fb50察看一下;
4、希望离我们越来越近了,哦,还是以SetWindowText为例来探索吧!
还是看看函数的定义吧:
BOOL SetWindowText(
HWND hWnd, // handle of window or control
LPCTSTR lpString // address of string
);
有2个参数,一个是编辑框的句柄,一个是我们想写入的内容,转化为asm应该是:
push 写入的内容编辑框句柄
push 编辑框句柄
call SetWindowText函数地址
注意api中的参数在asm中刚好是反着入栈的;
问题又来了,编辑框的句柄如何获得了?我们还是到OD中看看吧:
0040158A |. 68 1CA04200 PUSH crackme1.0042A01C ; /now make a keygen!
0040158F |. 8B4D 9C MOV ECX,DWORD PTR SS:[EBP-64] ; |
00401592 |. 51 PUSH ECX ; |hWnd
00401593 |. FF15 D8024300 CALL DWORD PTR DS:[<&USER32.SetWindowTex>; \SetWindowTextA
yeah,push ecx就是句柄参数了,ecx来自MOV ECX,DWORD PTR SS:[EBP-64],这是只要EBP的值不发生改变,我们可以照葫芦画瓢了
5、该找块空白的地方写入我们的代码了,在OD中鼠标往下拉吧,停停,这里是都是DB 00,正是程序的空白区,就让我们的代码在这里安家吧
我们要让程序暂时中断去干我们要求它干的事,然后再返回去继续自己的流程,我们用jmp让它跳转,然后用jmp跳回来;还是回OD看看吧:
0040156E |. 50 PUSH EAX ; |Arg1
0040156F |. E8 FC9F0000 CALL crackme1.0040B570 ; \crackme1.0040B570
00401574 |. 83C4 0C ADD ESP,0C
00401577 |. 50 PUSH EAX
00401578 |. 8D45 A0 LEA EAX,DWORD PTR SS:[EBP-60]
0040157B |. 50 PUSH EAX
0040157C E8 1F1F0000 CALL crackme1.004034A0
0040157C E8 1F1F0000 CALL crackme1.004034A0这是一个理想的地方,和jmp ********一样是10个字节,我们就从CALL crackme1.004034A0开刀
0040156E |. 50 PUSH EAX ; |Arg1
0040156F |. E8 FC9F0000 CALL crackme1.0040B570 ; \crackme1.0040B570
00401574 |. 83C4 0C ADD ESP,0C
00401577 |. 50 PUSH EAX
00401578 |. 8D45 A0 LEA EAX,DWORD PTR SS:[EBP-60]
0040157B |. 50 PUSH EAX
0040157C . /E9 7F7C0100 JMP crackme1.00419200
注意修改前一定要把CALL crackme1.004034A0记录下来,后面我们还要恢复它
我们转到00419200,在DB 00上双击,写入如下代码:
pushad ;和popad配对使用,保护我们的作案现场
PUSH 12FB50 ;正确注册码存放地点
MOV ECX,DWORD PTR SS:[EBP-64] ;获得编辑框句柄
PUSH ECX ;句柄入栈
CALL DWORD PTR DS:[4302D8] ;调用SetWindowTextA函数
POPAD
CALL 004034A0 ;恢复前面被我们改写了的代码
JMP 00401581 ;回到我们跳出来的地方,继续程序的流程;
6、好了,我们要将成果保存下来了,在我们改写或添加的代码上(会自动变成红色的)点右键,复制到可执行文件--所有修改--全部复制,这时会弹出一个窗口,我们直接关闭它,会提醒我们是否保存?当然选是了,换个名字保存吧;
来看看我们的成果吧,输入Unlock、987654321,check it,yeah,serial编辑框的内容变成了25290749,在点击check it,Now make a keygen!
Good,这正是我们想要的。
7、用MessageBox弹出注册码的方法就留给大家练习吧!
附件中是我修改过的,原件请到http://bbs.pediy.com/showthread.php?threadid=31757来下载
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年09月19日 14:45:30
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!