【文章标题】: 处女作--一个简单明了的注册过程与大家共享
【文章作者】: looyoo
【软件名称】: OpenVideoConverter v3.01
【软件大小】: 1.28mb
【下载地址】: http://www.wuguole.com
【保护方式】: 注册码
【编写语言】: VC++7.0
【使用工具】: PEiD,OllyDbg1.10
【操作平台】: WindowsXP SP2
【软件介绍】: 视屏转换,简单实用。
【作者前言】: 我是学“实用主义哲学”的,无论是工作还是专业,均与软件或破解相去甚远,是看雪的几本书把我带到了这里,做了一名看官。为偿取索之债,在下不揣浅薄,以此聊表回报,实无班门弄斧之意。缪误之处,请能者指教!
--------------------------------------------------------------------------------
因需要,前几天在网上找到一款视频编辑软件,本来做汉化的朋友已经提供了一组注册码,无奈不合实用主义者的一贯做法,因此还是操起了火枪,企图用暴力彻底解决问题。在 OllyDbg 下,该软件的注册过程简单明了,实在是难得的破解案例,于是有了这篇陋作。
-----------------------------------
言归正传!
一、开局例行三板斧:查壳、查编写语言和试注册。好极了!无壳、VC++、有提示,是菜鸟吃的馍馍,窃喜!
二、了解大致的注册流程:搬出利器 OllyDbg,加载目标程序,在 CPU 窗口击右键,选择:超级字串参考->查找 UNICODE,(没有这个插件的朋友可以在 W32Dasm 或 UE 下定位)搜索注册失败的提示语“注册失败!”,找到以后双击该提示语,来到 CPU 窗口 00424c55 处,不妨让它变红(设为断点)以醒目,向上翻屏,到最近的一个 etrn 为止,紧接其下的 00424980 PUSH EBP 就是注册论证过程的子程序的入口处,设为断点。我们就从这里开始跟踪分析注册过程。
包围圈划定了,可以先试注册一下,了解注册过程的大致流程,以便在跟踪分析时心中有数。输入注册名与注册码以后,程序大致按下述路径运行:
1)...004249A1 JGE 004249B6-->004249C4 JGE 004249D9...-->①...00424B9B JE 00424BF5-->注册成功!
-->②JNE 00424B9D-->2),作新的注册码测试;
2)...00424B9D...-->①...00424BF9 PUSH 00460374-->注册成功!
-->②JNE 00424C51-->注册失败!
注册名与注册码均有长度要求。
三、调试并获取注册码。设子程序入口点 0042497F 为断点,用 DllyDbg 加载程序,F9 运行,弹出注册窗口后输入注册名 abcdef、注册码 12345678(本例中便于识别),点击“注册”。程序在 0042497F 处断下,F8 步进。由于整个注册过程不长,我们不妨把它全部贴上,在代码旁作标注,更加直观。
--------------------------------------------
0042497F \. C3 RETN
00424980 /. 55 PUSH EBP ; 子程序入口、设为断点
00424981 |. 8BEC MOV EBP,ESP
00424983 |. 83EC 20 SUB ESP,20
00424986 |. 894D E0 MOV DWORD PTR SS:[EBP-20],ECX
00424989 |. 6A 01 PUSH 1
0042498B |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
0042498E |. E8 CA230200 CALL VideoCon.00446D5D
00424993 |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424996 |. 83C1 70 ADD ECX,70
00424999 |. E8 B270FEFF CALL VideoCon.0040BA50
0042499E |. 83F8 02 CMP EAX,2 ; 比较注册名长度(请结合寄存器来看)
004249A1 |. 7D 13 JGE SHORT VideoCon.004249B6 ; 大于或等于则跳(显然不能小于2位)
004249A3 |. 6A 00 PUSH 0
004249A5 |. 6A 00 PUSH 0
004249A7 |. 68 2C034600 PUSH VideoCon.0046032C ; ASCII "请输入正确的用户名!"
004249AC |. E8 BEC10200 CALL VideoCon.00450B6F
004249B1 |. E9 A9020000 JMP VideoCon.00424C5F ; 以上不跳将要运行至重新输入注册名
004249B6 |> 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20] ; 注册名合乎要求后跳转至此
004249B9 |. 83C1 74 ADD ECX,74
004249BC |. E8 8F70FEFF CALL VideoCon.0040BA50
004249C1 |. 83F8 08 CMP EAX,8 ; 比较注册码长度
004249C4 |. 7D 13 JGE SHORT VideoCon.004249D9 ; 大于或等于则跳(显然不能小于8位)
004249C6 |. 6A 00 PUSH 0
004249C8 |. 6A 00 PUSH 0
004249CA |. 68 4C034600 PUSH VideoCon.0046034C ; ASCII "请输入正确的注册码!"
004249CF |. E8 9BC10200 CALL VideoCon.00450B6F
004249D4 |. E9 86020000 JMP VideoCon.00424C5F ; 以上不跳将要运行至重新输入注册码
-----------------------------------------------------------
将注册名的前两位转换为 ASCII 码,并分别保存
004249D9 |> 6A 00 PUSH 0 ; 上一节注册码长度合乎要求后跳转至此
004249DB |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20] ; [EBP-20]中为常数 DEE30
004249DE |. 83C1 70 ADD ECX,70 ; 加70
004249E1 |. E8 AAF5FFFF CALL VideoCon.00423F90 ; 0042390 存放着注册名,本节同
004249E6 |. 8845 EF MOV BYTE PTR SS:[EBP-11],AL ; AL=61存入[ebp-11],第一个字符a的ASCII码,以下可以类推
004249E9 |. 6A 01 PUSH 1
004249EB |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
004249EE |. 83C1 70 ADD ECX,70
004249F1 |. E8 9AF5FFFF CALL VideoCon.00423F90
004249F6 |. 8845 F8 MOV BYTE PTR SS:[EBP-8],AL ; AL=62存入[ebp-8],第二个字符b的ASCII码
004249F9 |. 6A 00 PUSH 0
004249FB |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
004249FE |. 83C1 70 ADD ECX,70
00424A01 |. E8 8AF5FFFF CALL VideoCon.00423F90
00424A06 |. 8845 FF MOV BYTE PTR SS:[EBP-1],AL ; AL=61存入[ebp-20],第一个字符a的ASCII码
00424A09 |. 6A 01 PUSH 1
00424A0B |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424A0E |. 83C1 70 ADD ECX,70
00424A11 |. E8 7AF5FFFF CALL VideoCon.00423F90
00424A16 |. 8845 FA MOV BYTE PTR SS:[EBP-6],AL ; AL=62存入[ebp-6],第二个字符b的ASCII码
------------------------------------------------
00424A19 |. 0FB645 EF MOVZX EAX,BYTE PTR SS:[EBP-11] ; 第一个字符a的 ASCII 码传送到 eax
00424A1D |. 83C8 41 OR EAX,41 ; 逻辑或运算,下同
00424A20 |. 8845 EF MOV BYTE PTR SS:[EBP-11],AL ; 或运算结果的低位数AL=61存入[ebp-11]
00424A23 |. 0FB64D F8 MOVZX ECX,BYTE PTR SS:[EBP-8]
00424A27 |. 83C9 56 OR ECX,56
00424A2A |. 884D F8 MOV BYTE PTR SS:[EBP-8],CL ; CL=76存入[ebp-8]
00424A2D |. 0FB655 FF MOVZX EDX,BYTE PTR SS:[EBP-1]
00424A31 |. 83CA 49 OR EDX,49
00424A34 |. 8855 FF MOV BYTE PTR SS:[EBP-1],DL ; DL=69存入[ebp-1]
00424A37 |. 0FB645 FA MOVZX EAX,BYTE PTR SS:[EBP-6]
00424A3B |. 83C8 43 OR EAX,43
00424A3E |. 8845 FA MOV BYTE PTR SS:[EBP-6],AL ; AL=63存入[ebp-6]
---------------------------------------------------------
计算真码的前五位并分别保存在各自的地址
00424A41 |. 0FB645 EF MOVZX EAX,BYTE PTR SS:[EBP-11] ; 上一节已经计算[EBP-11]-->61
00424A45 |. 99 CDQ ; 字节扩展
00424A46 |. B9 0A000000 MOV ECX,0A ; 除数是 0A,意味着余数不会大于9,注册码前五位只能是阿拉伯数字
00424A4B |. F7F9 IDIV ECX ; 有符号除法,(edx,eax)/ecx,商存 eax取 edx 中的余数
00424A4D |. 8855 EF MOV BYTE PTR SS:[EBP-11],DL ; DL=7......1 第一位注册码,以下类推
00424A50 |. 0FB645 F8 MOVZX EAX,BYTE PTR SS:[EBP-8]
00424A54 |. 99 CDQ
00424A55 |. B9 0A000000 MOV ECX,0A
00424A5A |. F7F9 IDIV ECX
00424A5C |. 8855 F8 MOV BYTE PTR SS:[EBP-8],DL ; DL=8......2
00424A5F |. 0FB645 FF MOVZX EAX,BYTE PTR SS:[EBP-1]
00424A63 |. 99 CDQ
00424A64 |. B9 0A000000 MOV ECX,0A
00424A69 |. F7F9 IDIV ECX
00424A6B |. 8855 FF MOV BYTE PTR SS:[EBP-1],DL ; DL=5......3
00424A6E |. 0FB645 FA MOVZX EAX,BYTE PTR SS:[EBP-6]
00424A72 |. 99 CDQ
00424A73 |. B9 0A000000 MOV ECX,0A
00424A78 |. F7F9 IDIV ECX
00424A7A |. 8855 FA MOV BYTE PTR SS:[EBP-6],DL ; DL=9......4。以下计算第5位注册码
00424A7D |. C745 F0 00000>MOV DWORD PTR SS:[EBP-10],0 ; 清 0 初始化
00424A84 |. C745 E8 00000>MOV DWORD PTR SS:[EBP-18],0 ; 清 0 初始化
00424A8B |. EB 09 JMP SHORT VideoCon.00424A96
00424A8D |> 8B55 E8 /MOV EDX,DWORD PTR SS:[EBP-18] ; 已处理过的注册名位数
00424A90 |. 83C2 01 |ADD EDX,1 ; 当前要处理的注册名位次是已处理过的位数+1
00424A93 |. 8955 E8 |MOV DWORD PTR SS:[EBP-18],EDX
00424A96 |> 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424A99 |. 83C1 70 |ADD ECX,70 ; 加70
00424A9C |. E8 AF6FFEFF |CALL VideoCon.0040BA50 ; 注册名全长(6)
00424AA1 |. 3945 E8 |CMP DWORD PTR SS:[EBP-18],EAX ; eax 内为注册名全长
00424AA4 |. 7D 1E |JGE SHORT VideoCon.00424AC4 ; 大于或等于(6)则跳
00424AA6 |. 8B45 E8 |MOV EAX,DWORD PTR SS:[EBP-18]
00424AA9 |. 50 |PUSH EAX ;
00424AAA |. 8B4D E0 |MOV ECX,DWORD PTR SS:[EBP-20] ;
00424AAD |. 83C1 70 |ADD ECX,70 ;
00424AB0 |. E8 DBF4FFFF |CALL VideoCon.00423F90 ; 取注册名
00424AB5 |. 8845 E7 |MOV BYTE PTR SS:[EBP-19],AL ; 注册名当前位次上字符的 ASCII 码
00424AB8 |. 0FB64D E7 |MOVZX ECX,BYTE PTR SS:[EBP-19]
00424ABC |. 034D F0 |ADD ECX,DWORD PTR SS:[EBP-10] ; 已处理过的位次上注册名字符的ASCII值被累加在[EBP-10]
00424ABF |. 894D F0 |MOV DWORD PTR SS:[EBP-10],ECX ; 当前累加结果传送至 [EBP-10] 保存
00424AC2 |.^ EB C9 \JMP SHORT VideoCon.00424A8D ; 进入下一个循环
00424AC4 |> 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10] ; 最终的累加值
00424AC7 |. 99 CDQ ; 字节扩展
00424AC8 |. B9 0A000000 MOV ECX,0A
00424ACD |. F7F9 IDIV ECX ; 用累加值除以0A,取 edx 中的余数
00424ACF |. 8855 F4 MOV BYTE PTR SS:[EBP-C],DL ; DL=7......5 第五位注册码
----------------------------------------------------------
将测试码各位次上的 ASCII 值分别保存
00424AD2 |. 6A 00 PUSH 0 ;
00424AD4 |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20] ; [EBP-20]-->DEE30,一个常数
00424AD7 |. 83C1 74 ADD ECX,74 ; 加74
00424ADA |. E8 B1F4FFFF CALL VideoCon.00423F90 ; 0042390 存放着测试用注册码,本节同
00424ADF |. 8845 FC MOV BYTE PTR SS:[EBP-4],AL ; 1.AL=31存[EBP-4]备用,以下可以类推
00424AE2 |. 6A 01 PUSH 1 ; /Arg1 = 00000001
00424AE4 |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424AE7 |. 83C1 74 ADD ECX,74
00424AEA |. E8 A1F4FFFF CALL VideoCon.00423F90
00424AEF |. 8845 FD MOV BYTE PTR SS:[EBP-3],AL ; 2.AL=32
00424AF2 |. 6A 02 PUSH 2 ; /Arg1 = 00000002
00424AF4 |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424AF7 |. 83C1 74 ADD ECX,74
00424AFA |. E8 91F4FFFF CALL VideoCon.00423F90
00424AFF |. 8845 F6 MOV BYTE PTR SS:[EBP-A],AL ; 3.AL=33
00424B02 |. 6A 03 PUSH 3 ; /Arg1 = 00000003
00424B04 |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424B07 |. 83C1 74 ADD ECX,74
00424B0A |. E8 81F4FFFF CALL VideoCon.00423F90
00424B0F |. 8845 F5 MOV BYTE PTR SS:[EBP-B],AL ; 4.AL=34
00424B12 |. 6A 04 PUSH 4 ; /Arg1 = 00000004
00424B14 |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424B17 |. 83C1 74 ADD ECX,74
00424B1A |. E8 71F4FFFF CALL VideoCon.00423F90
00424B1F |. 8845 F9 MOV BYTE PTR SS:[EBP-7],AL ; 5.AL=35
00424B22 |. 6A 05 PUSH 5 ; /Arg1 = 00000005
00424B24 |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424B27 |. 83C1 74 ADD ECX,74
00424B2A |. E8 61F4FFFF CALL VideoCon.00423F90
00424B2F |. 8845 F7 MOV BYTE PTR SS:[EBP-9],AL ; 6.AL=36
00424B32 |. 6A 06 PUSH 6 ; /Arg1 = 00000006
00424B34 |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424B37 |. 83C1 74 ADD ECX,74
00424B3A |. E8 51F4FFFF CALL VideoCon.00423F90
00424B3F |. 8845 FE MOV BYTE PTR SS:[EBP-2],AL ; 7.AL=37
00424B42 |. 6A 07 PUSH 7 ; /Arg1 = 00000007
00424B44 |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424B47 |. 83C1 74 ADD ECX,74
00424B4A |. E8 41F4FFFF CALL VideoCon.00423F90
00424B4F |. 8845 FB MOV BYTE PTR SS:[EBP-5],AL ; 8.AL=38
---------------------------------------------------------
真码与测试码前五位相对应的逐位比较(第一环节)
00424B52 |. 0FB655 EF MOVZX EDX,BYTE PTR SS:[EBP-11] ; 00424A4D: ...[EBP-11]-->7-十进制
00424B56 |. 0FB645 FC MOVZX EAX,BYTE PTR SS:[EBP-4] ; 00424ADF: ...[EBP-4]-->31-十六进制(ASCII码)
00424B5A |. 83E8 30 SUB EAX,30 ; ASCII码减30转换为十进制数
00424B5D |. 3BD0 CMP EDX,EAX ; edx 为真码,eax为测试码,均十进制,比较
00424B5F 74 3C JNE SHORT VideoCon.00424B9D ; 不等则跳至下一节比较,以下类推(这里可爆破)
00424B61 |. 0FB64D F8 MOVZX ECX,BYTE PTR SS:[EBP-8]
00424B65 |. 0FB655 FD MOVZX EDX,BYTE PTR SS:[EBP-3]
00424B69 |. 83EA 30 SUB EDX,30
00424B6C |. 3BCA CMP ECX,EDX ; ecx为真码,edx为测试码
00424B6E 74 2D JNE SHORT VideoCon.00424B9D
00424B74 |. 0FB64D F6 MOVZX ECX,BYTE PTR SS:[EBP-A]
00424B78 |. 83E9 30 SUB ECX,30
00424B7B |. 3BC1 CMP EAX,ECX ; eax为真码,ecx为测试码
00424B7D 74 1E JNE SHORT VideoCon.00424B9D
00424B7F |. 0FB655 FA MOVZX EDX,BYTE PTR SS:[EBP-6]
00424B83 |. 0FB645 F5 MOVZX EAX,BYTE PTR SS:[EBP-B]
00424B87 |. 83E8 30 SUB EAX,30
00424B8A |. 3BD0 CMP EDX,EAX ; edx为真码,eax为测试码
00424B8C 74 0F JNE SHORT VideoCon.00424B9D
00424B8E |. 0FB64D F4 MOVZX ECX,BYTE PTR SS:[EBP-C]
00424B92 |. 0FB655 F9 MOVZX EDX,BYTE PTR SS:[EBP-7]
00424B96 |. 83EA 30 SUB EDX,30
00424B99 |. 3BCA CMP ECX,EDX ; ecx为真码,edx为测试码
00424B9B 74 58 JE SHORT VideoCon.00424BF5 ; 相等则跳至注册成功
--------------------------------------------------------
前面比较不等时跳至这里再次比较,实际上这里是一组不随注册名改变的万能注册码(第二环节)
00424B9D |> 0FB645 FC MOVZX EAX,BYTE PTR SS:[EBP-4] ; 第一环节不等时跳至此另行比较
00424BA1 |. 83F8 35 CMP EAX,35 ; 35 是十进制数 5 的 ASCII 码
00424BA4 0F85 A7000000 JNZ VideoCon.00424C51 ; 不等则跳至注册失败,以下类推(这里可爆破)
00424BAA |. 0FB64D FD MOVZX ECX,BYTE PTR SS:[EBP-3]
00424BAE |. 83F9 31 CMP ECX,31
00424BB1 0F85 9A000000 JNZ VideoCon.00424C51
00424BB7 |. 0FB655 F6 MOVZX EDX,BYTE PTR SS:[EBP-A]
00424BBB |. 83FA 38 CMP EDX,38
00424BBE 0F85 8D000000 JNZ VideoCon.00424C51
00424BC4 |. 0FB645 F5 MOVZX EAX,BYTE PTR SS:[EBP-B]
00424BC8 |. 83F8 39 CMP EAX,39
00424BCB 0F85 80000000 JNZ VideoCon.00424C51
00424BD1 |. 0FB64D F9 MOVZX ECX,BYTE PTR SS:[EBP-7]
00424BD5 |. 83F9 37 CMP ECX,37
00424BD8 75 77 JNZ SHORT VideoCon.00424C51
00424BDA |. 0FB655 F7 MOVZX EDX,BYTE PTR SS:[EBP-9]
00424BDE |. 83FA 36 CMP EDX,36
00424BE1 75 6E JNZ SHORT VideoCon.00424C51
00424BE3 |. 0FB645 FE MOVZX EAX,BYTE PTR SS:[EBP-2]
00424BE7 |. 83F8 32 CMP EAX,32
00424BEA 75 65 JNZ SHORT VideoCon.00424C51
00424BEC |. 0FB64D FB MOVZX ECX,BYTE PTR SS:[EBP-5]
00424BF0 |. 83F9 39 CMP ECX,39
00424BF3 |. 75 5C JNZ SHORT VideoCon.00424C51 ; 不跳则注册成功
----------------------------------------------------
顺着往下运行则注册成功
00424BF5 |> 6A 00 PUSH 0
00424BF7 |. 6A 00 PUSH 0
00424BF9 |. 68 74034600 PUSH VideoCon.00460374 ; ASCII "注册成功!"
00424BFE |. E8 6CBF0200 CALL VideoCon.00450B6F
00424C03 |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424C06 |. 83C1 70 ADD ECX,70
00424C09 |. E8 62F4FFFF CALL VideoCon.00424070
00424C0E |. 50 PUSH EAX
00424C0F |. 68 90034600 PUSH VideoCon.00460390
00424C14 |. 68 9C034600 PUSH VideoCon.0046039C
00424C19 |. E8 A295FEFF CALL VideoCon.0040E1C0
00424C1E |. 8BC8 MOV ECX,EAX
00424C20 |. E8 AABC0200 CALL VideoCon.004508CF
00424C25 |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424C28 |. 83C1 74 ADD ECX,74
00424C2B |. E8 40F4FFFF CALL VideoCon.00424070
00424C30 |. 50 PUSH EAX
00424C31 |. 68 A4034600 PUSH VideoCon.004603A4
00424C36 |. 68 B8034600 PUSH VideoCon.004603B8
00424C3B |. E8 8095FEFF CALL VideoCon.0040E1C0
00424C40 |. 8BC8 MOV ECX,EAX
00424C42 |. E8 88BC0200 CALL VideoCon.004508CF
00424C47 |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
00424C4A |. E8 87620200 CALL VideoCon.0044AED6
00424C4F |. EB 0E JMP SHORT VideoCon.00424C5F
00424C51 |> 6A 00 PUSH 0 ; 第二环节注册码比较,不等时跳至此
00424C53 |. 6A 00 PUSH 0
00424C55 |. 68 C0034600 PUSH VideoCon.004603C0 ; ASCII "注册失败!"
00424C5A |. E8 10BF0200 CALL VideoCon.00450B6F
00424C5F |> 8BE5 MOV ESP,EBP ; 注册名、注册码位数不合乎要求时跳至此
00424C61 |. 5D POP EBP
00424C62 \. C3 RETN
--------------------------------------------------------------------------------
分析了上述过程以后,我们可以归纳一下:
1.要求注册名不小于2位,注册码不小于8位,前五位为阿拉伯数字;
2.第一环节注册过程中只比较了注册码的前五位,显然余下的几位可以是任意数字;
3.第二环节注册过程中的 8 个常数实际上是一个不随注册名变化的注册码的 ASCII 值,其十进制值为:51897629,这就是传说中的万能注册码;
4.注册码的算法过程已经了然,因为在下不会编程,所以算法注册机无法奉上,但软件作者顾及到我等菜鸟,预备了一个万能码,算是一个安慰吧。
注册名:abcdef 注册码:78597xxx...或
注册名:xxxxxx 注册码:51897629...
(x 为任意字符,包括汉字)
请弟兄们不吝赐教!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课