【文章标题】: 用软件自身制作正版注册机
【文章作者】: chinglq
【作者邮箱】: chinglq@sina.com
【作者主页】: http://lqcoolboy.xinwen365.com
【软件名称】: 无
【软件大小】: 无
【下载地址】: 无
【加壳方式】: N/A
【保护方式】: 注册码
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: OD、PEiD
【操作平台】: 联想OEM WinXPsp2
【软件介绍】: 无
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!如果喜欢该软件,请支持正版!
--------------------------------------------------------------------------------
【详细过程】
明码比较软件,大部分可以很方便地用keymake制作内存注册机,或用自注册的方式修改软件,让它自动弹出显示正确注册码的信息框。但它们有一个共同的缺陷,那就是只能显示本机的注册吗。而自注册则显得有些多余,也许是为了展现才华横溢。我今天要向大家介绍的是在一
个机器上,便能计算出其他任何机器上的注册码的方法,也就是真正意义上的注册机。它和这两种方式有些地方相似,即利用了软件自身的算
法系统,有原装正版之誉,而且能弥补不足,功能完整。这比较适合我等菜鸟操作使用。
下面我利用一个实例来做以详细介绍。请大家仔细看下面:
--------------------------------------------------------
00409E2C |> FF75 08 push dword ptr [ebp+8] ; /String2 ; 输入机器码
00409E2F |. 8D85 C4FDFFFF lea eax, dword ptr [ebp-23C] ; |
00409E35 |. 50 push eax ; |String1
00409E36 |. FF15 E4469C00 call dword ptr [<&KERNEL32.lstrcpyA>] ; \lstrcpyA ; 由[ebp+8]复制到[ebp-23C]
00409E3C |. 803D FCBEB000 00 cmp byte ptr [B0BEFC], 0 ; eax=输入机器码
00409E43 |. 0F84 92010000 je 00409FDB
.................省略..................................
00409EFC |> 8D85 C4F5FFFF lea eax, dword ptr [ebp-A3C]
00409F02 |. 50 push eax
00409F03 |. 68 A4B4B000 push 00B0B4A4
00409F08 |. FF75 10 push dword ptr [ebp+10]
00409F0B |. E8 A04F2800 call 0068EEB0 ; 获得机器码16位
00409F10 |. 80A5 D0F5FFFF 00 and byte ptr [ebp-A30], 0
00409F17 |. 83C4 0C add esp, 0C ; 取0C(12)位
00409F1A |. 8D85 C4F5FFFF lea eax, dword ptr [ebp-A3C] ; ---> 8D85 C4FDFFFF lea eax, dword ptr [ebp-23C]
00409F20 |. 8D4D EC lea ecx, dword ptr [ebp-14] ; 上句由 eax=本机机器码 ---> eax=输入机器码
00409F23 |. 50 push eax
00409F24 |. E8 EBA45600 call <jmp.&MFC42.#537_CString::CString>
.................省略..................................
0040A03C |. 50 push eax ; /String2 ; 输入机器码
0040A03D |. 8D85 C4F9FFFF lea eax, dword ptr [ebp-63C] ; |
0040A043 |. 50 push eax ; |String1 ; 注册码
0040A044 |. FF15 E0469C00 call dword ptr [<&KERNEL32.lstrcmpA>] ; \lstrcmpA
0040A04A |. 85C0 test eax, eax
0040A04C |.^ 0F85 CAFDFFFF jnz 00409E1C
-------------------------------------------------------------
在注册码框中不填入任意码,而填入需要计算注册码的机器码,点注册按钮后在00409E3C行记录地址。然后在本机机器码计算完成后,
进入由机器码计算注册码前,在00409F1A改为输入的机器码。这是最关键的一步,这样才能保证在本机计算其他机器的注册码!
在真码出现后的0040A043处记录地址,然后跟踪该地址的真码是否被删除。我们来到:
------------------------------------------------------------
004B5243 > 807D F3 01 cmp byte ptr [ebp-D], 1
004B5247 . 75 36 jnz short 004B527F ; ---> 74 36 je short 004B527F
004B5249 . 6A 00 push 0
004B524B . 68 66230000 push 2366
004B5250 . 8D4D BC lea ecx, dword ptr [ebp-44]
004B5253 . FFD3 call ebx
004B5255 . 6A 00 push 0
004B5257 . 6A 00 push 0
004B5259 . 8BC8 mov ecx, eax
004B525B . C645 FC 03 mov byte ptr [ebp-4], 3 ; ---> 8D85 60F9FFFF lea eax, dword ptr [ebp-6A0]
004B525F . FFD7 call edi
004B5261 . 50 push eax ; 成功信息
004B5262 . E8 6DF24B00 call <jmp.&MFC42.#1200_AfxMessageBox> ; 成功对话框
004B5267 . 8D4D BC lea ecx, dword ptr [ebp-44]
004B526A . C645 FC 01 mov byte ptr [ebp-4], 1
004B526E . FF15 D88D9C00 call dword ptr [<&db.__ResourceString::~__ResourceString>] ; db.__ResourceString::~__ResourceString
004B5274 . 6A 0A push 0A
004B5276 . 8BCE mov ecx, esi
004B5278 . E8 D9FA4B00 call <jmp.&MFC42.#2645_CDialog::EndDialog>
004B527D . EB 3A jmp short 004B52B9
004B527F > 68 F8B3B000 push 00B0B3F8
004B5284 . 8D8E 20010000 lea ecx, dword ptr [esi+120]
004B528A . E8 DBF54B00 call <jmp.&MFC42.#6199_CWnd::SetWindowTextA> ; 删除真码
004B528F . 33F6 xor esi, esi
004B5291 . 8D4D BC lea ecx, dword ptr [ebp-44]
004B5294 . 56 push esi
004B5295 . 68 68230000 push 2368
004B529A . FFD3 call ebx
004B529C . 56 push esi
004B529D . 56 push esi
004B529E . 8BC8 mov ecx, eax
004B52A0 . C645 FC 04 mov byte ptr [ebp-4], 4
004B52A4 . FFD7 call edi
004B52A6 . 50 push eax
004B52A7 . E8 28F24B00 call <jmp.&MFC42.#1200_AfxMessageBox> ; 出错对话框
004B52AC . 8D4D BC lea ecx, dword ptr [ebp-44]
004B52AF . C645 FC 01 mov byte ptr [ebp-4], 1
004B52B3 . FF15 D88D9C00 call dword ptr [<&db.__ResourceString::~__ResourceString>] ; db.__ResourceString::~__ResourceString
004B52B9 > 8065 FC 00 and byte ptr [ebp-4], 0
-----------------------------------------------------------
004B5247行是决定出现哪个对话框的跳转,在出现出错对话框以前的004B528A行的CALL中删除真码,这是我们不希望看到的。分析真假两
路的程序段可知,成功对话框那路没有类似语句,我们就将它改向成功对话框。成功对话框前面的004B5261行是提供成功信息字符串的,它是
由前面的CALL函数获得的。我们要将成功信息字符串更换为真码,那么,与这个CALL相关的语句(004B5255——004B525F)对我们来说就是多
余的。在这段地方放上我们让信息变为真码的语句,那是再好不过的啦(省得另找地方)!就这样改动三处:
------------------------------------------------
00409F1A |. 8D85 C4F5FFFF lea eax, dword ptr [ebp-A3C] ; ---> 8D85 C4FDFFFF lea eax, dword ptr [ebp-23C]
004B5247 . 75 36 jnz short 004B527F ; ---> 74 36 je short 004B527F
004B525B . C645 FC 03 mov byte ptr [ebp-4], 3 ; ---> 8D85 60F9FFFF lea eax, dword ptr [ebp-6A0]
------------------------------------------------
好了,在OD中改好,右键——复制到可执行文件——所有修改——全部复制,在弹出窗口中,右键——保存文件——换名——保存。
OK!大功告成!一个功能完整的正版注册机诞生了,收工!
--------------------------------------------------------------------------------
【经验总结】
这是菜鸟成长的第四篇破文。用keymake制作的内存注册机,虽然简单方便,但生成的注册机的壳与许多病毒的壳相同,常被杀软误报为病
毒并采取强硬措施,使许多新手望而生畏。自注册方法虽然安全,但和它的名字一样,也只能给自己注册罢了。本文介绍的方法,弥补了它们
的缺陷,是个真正的功能完整的正版注册机。一点体会,愿与大家分享,方家莫要见笑!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007.12.02
[课程]Linux pwn 探索篇!