【原创】借尸还魂--把程序自己改成注册机的启发,现在将一个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,有可能造成不可预料的后果。