受【原创】借尸还魂--把程序自己改成注册机的启发,现在将一个CrackMe改造成注册机,
程序来自:"光盘\chap02\2.1 OllyDbg调试器\2.1.4 基本操作\bin\ASCII版\TraceMe.exe"
TraceMe.rar
====================第一部分:爆破====================
这部分书上有,比较简单。
od载入,Ctrl+G跟随"GetDlgItemTextA",来到77D6B05E,然后F2下断点,运行。
输入用户名和注册码后,单击check就断下来了,F2取消断点,然后Alt+F9来到004011B6处。
一路F8来到004011F5处,这里就是关键跳转,
按空格键后输入nop,再F9,就显示"恭喜你"了。
====================第二部分:注册机====================
这也不难,在关键跳转上方找到00401340,按回车键跟进去,可以看到计算序列号的代码:
代码:
00401340 /$ 55 push ebp 00401341 |. 8B6C24 0C mov ebp, dword ptr [esp+C] …… 0040139B 40 inc eax 0040139C 5D pop ebp 0040139D \. C3 retn
(dev-cpp 4.9.9.2下测试成功)
代码:
#include <cstdio> #include <cstdlib> using namespace std; const int b[8]={0x0C,0x0A,0x13,0x09,0x0C,0x0B,0x0A,0x08}; int main(){ unsigned char a[100]; printf("用户名:"); scanf("%s",&a); int len=0; while(a[len])len++; if(len<5){ printf("用户名不能小于5位!\n"); system("pause"); return 0; } unsigned s=0; for(int i=3,j=0;i<len;i++,j++){ if(j>7)j=0; s=s+(a[i]*b[j]); printf("%.8X\n",s); } printf("\n%u\n",s); system("pause"); return 0; }
这才是重点,这部分是我写这个帖子的原因。
基本的思路就是在计算出序列号后,用MessageBox函数将其输出。
先在程序的后面,找出一段空间来存放自己的代码

先看一下计算序列号的函数的结尾:

在0040139B处,按空格键进行汇编,输入"jmp 00403D00"

然后来到00403D00处,开始汇编。

现在运行。

可以看到注册码了。然后把所有修改保存到"TraceMe修改.exe"里。

运行一下"TraceMe修改.exe"试试。

验证一下。

========================================
事实上,【第三部分:改造】中有两个小问题,
1. 00403D00处不一定是没用的,程序本身有可能会对这段空间做一些操作。
2. MessageBox函数的Title参数为0,有可能造成不可预料的后果。