[原创]一个简单的逆向+注册机源码
来发个小帖子怡怡情............
准备工具:od vs
-------------------------------------
我们先查是否有壳,再运行写主程序,(由于并没有壳,所以不演示这个步骤了)
点开主程序发现有个按钮是灰色的

那么我们必须先把这个解决。在脑海(也可以百度)中搜索下什么可以将按钮置为无效 那么便是“EnableWindow”
我们将它拖入OD 往下一拉 很容发现:

我们简单粗暴的将它NOP掉 并转存为“Crack1.exe”
再打开程序查看是否运行正常(显然可以的):

我们随便输入账户名以及序列号:
例: NAME:1111 SERIAL:111111
点击 check it。会提示:

然后我们可以将字符串记录下来再去OD搜索 (然而在这里并没有什么X用,我并不打算用这个方法)。

然后我们把新转存的程序拖入OD 往下一拉 发现3个CALL

根据函数名可知:获取对话框中的控件相关的标题或文本
●
我也不知道 我们选中-回车进去瞧瞧 很容易能发现

好 那么在这个函数CALL下个断点(或者函数内第一个PUSH) 我们F9运行 成功断下

00401168 50 push eax 00401169 53 push ebx 0040116A 57 push edi 0040116B 0FBE0C38 movsx ecx,byte ptr ds:[eax+edi] 0040116F 51 push ecx 00401170 68 59304000 push Crack1.00403059 ; %x 00401175 68 68314000 push Crack1.00403168 ; ASCII "31" 0040117A E8 D3000000 call <jmp.&user32.wsprintfA> ; 将字符转换为16进制 0040117F 83C4 0C add esp,0xC 00401182 68 68314000 push Crack1.00403168 ; ASCII "31" 00401187 68 68324000 push Crack1.00403268 ; ASCII "313131" 0040118C E8 0F010000 call <jmp.&kernel32.lstrcatA> ; 将转换后的十六进制字符衔接 00401191 5F pop edi 00401192 5B pop ebx 00401193 58 pop eax 00401194 40 inc eax 00401195 3BC3 cmp eax,ebx ; 根据字符长短判断下步操作 00401197 ^ 7C CF jl short Crack1.00401168
紧跟其后的是
00401199 68 68334000 push Crack1.00403368 ; ASCII 1111111" 0040119E 68 68324000 push Crack1.00403268 ; ASCII 1313131"(此处我未单步完) 004011A3 E8 FE000000 call <jmp.&kernel32.lstrcmpA> ; 字符串比较 004011A8 0BC0 or eax,eax 004011AA 75 4A jnz short Crack1.004011F6
那我看到“1”和“31”瞬间联想到这是十进制-》十六进制
那么我们运行下程序试试这个想法。


成功!
好 根据思路写(搜)个注册机:
char ch[1024];
char hex[1024];
char result[1024];
char *p_ch = ch;
char *p_hex = hex;
printf("请输入你的账户名:");
scanf_s("%s",p_ch,_countof(ch));
strToHex(p_ch,p_hex);//将指定字符串转换为16进制
printf("序列号为:%s\n",p_hex);
system("pause");
return 0;
随便输入个名字 得到

我们将它拿去试试, 却发现

那究竟是怎么回事呢 我们拖入OD继续走俩步试试

擦 原来 转换为小写了
好 那么只要在原来代码上加上
char *copy1;//序列号
_strlwr_s(copy1=_strdup(p_hex),strlen(p_hex) + 1);
printf("序列号为:%s\n",copy1);
至此 完。
------------------
源码及附件
注册机.rar
Crack.rar
