VeryXXF HXXL Cxxxxxxx v2.0 注册分析+人工计算注册码即可【0.1星级别】!
本帖最后由 云在天 于 2019-6-7 13:22 编辑VeryPDF html Converter 是一个功能强大的 HTML 转换产品。它允许您以不同格式 (如 TIF、TIFF、JPG、JPEG、GIF、PNG、bmp、pcx、TGA、JP2 (JPEG2000)、PNM 等) 创建网页预览或缩略图。它还允许将网页转换为 PDF、PS (PostScript)、WMF、EMF 矢量格式。VeryPDF HTML Converter 不依赖于打印驱动程序, 它可以快速、准确地呈现网页。 VeryPDF HTML Converter 是 HTML 转换器解决方案, 可在 web 服务器上进行设置, 从服务中使用, 从命令行在其他程序中启动。使用 VeryPDF HTML Converter, 如果您处理大量的文件, 您可以进行其他批量转换。
软件来源:http://www.verypdf.com/app/html-converter/index.html
安装启动软件,软件立即要求注册,当然也可以直接点try先试用,如下:
产品ID是程序生成的,不可更改。在 Series 栏随便输入一些字符或数字,点OK。
立即报序列号错误,请检查重试。点“确定”后,再“Try"试用看看。
软件告诉我们有50次使用机会,”确定“后进入软件主界面:
下面的工具栏按钮,最后有”register",表示软件还没有注册。
退出软件,使用OD载入,利用超级搜索:“series number error, please check it and try again.”,马上来到下面界面,找到字符串:
双击来到引用该字符串的代码处:
汇编代码如下:
00410942 > \8BB424 E80000>mov esi, dword ptr ;Case 1 of switch 004108B8
00410949 .68 C8000000 push 0C8 ; /Count = C8 (200.)
0041094E .B9 32000000 mov ecx, 32 ; |
00410953 .33C0 xor eax, eax ; |
00410955 .BF 2C164500 mov edi, 0045162C ; |
0041095A .68 2C164500 push 0045162C ; |Buffer = winhtml.0045162C
0041095F .68 FB030000 push 3FB ; |ControlID = 3FB (1019.)
00410964 .56 push esi ; |hWnd
00410965 .F3:AB rep stos dword ptr es: ; |
00410967 .FF15 74E44300 call dword ptr [<&USER32.GetDlgItemTextA>] ; \GetDlgItemTextA
0041096D .68 2C164500 push 0045162C ; 先在这里下断,看看下面的call的作用。
00410972 .E8 49FAFFFF call 004103C0
00410977 .83C4 04 add esp, 4
0041097A .85C0 test eax, eax
0041097C .74 38 je short 004109B6 ; eax==0时此处跳转去显示“series number error, please check it and try again.”
; 以下是显示注册成功的代码
0041097E .6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00410980 .68 8CEF4400 push 0044EF8C ; |Title = "Thanks"
00410985 .68 54EF4400 push 0044EF54 ; |Text = "Thank you purchased the VeryPDF HTML Converter v2.0."
0041098A .56 push esi ; |hOwner
0041098B .FF15 A8E54300 call dword ptr [<&USER32.MessageBoxA>] ; \MessageBoxA
00410991 .68 2C164500 push 0045162C
00410996 .E8 35FBFFFF call 004104D0
0041099B .83C4 04 add esp, 4
0041099E .C705 F8174500>mov dword ptr , 1
004109A8 .6A 01 push 1 ; /Result = 1
004109AA .56 push esi ; |hWnd
004109AB .FF15 78E44300 call dword ptr [<&USER32.EndDialog>] ; \EndDialog
004109B1 .E9 79020000 jmp 00410C2F ; 跳转到退出函数
; 以下是显示注册失败的代码
004109B6 >6A 10 push 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004109B8 .6A 00 push 0 ; |Title = NULL
004109BA .68 20EF4400 push 0044EF20 ; |series number error, please check it and try again.
004109BF .56 push esi ; |hOwner
004109C0 .FF15 A8E54300 call dword ptr [<&USER32.MessageBoxA>] ; \MessageBoxA
004109C6 .68 FB030000 push 3FB ; /ControlID = 3FB (1019.)
004109CB .56 push esi ; |hWnd
004109CC .FF15 7CE44300 call dword ptr [<&USER32.GetDlgItem>] ; \GetDlgItem
004109D2 .50 push eax ; /hWnd
004109D3 .FF15 80E44300 call dword ptr [<&USER32.SetFocus>] ; \SetFocus
004109D9 .E9 51020000 jmp 00410C2F ; 跳转到退出函数
通过简单分析静态代码,可以看到注册码的检查和显示提示都包括在内了,只有一个call 004103C0是调用的程序代码,其它call都是调用的系统代码。因此在 0041096D push 0045162C 处下断点,重新来一次注册操作。按F9让程序运行,再次来到注册界面。我们填入假码:78787878787878787878,点击OK,OD断下程序:
00410942 > \8BB424 E80000>mov esi, dword ptr ;
00410949 .68 C8000000 push 0C8 ; /Count = C8 (200.)
0041094E .B9 32000000 mov ecx, 32 ; |
00410953 .33C0 xor eax, eax ; |
00410955 .BF 2C164500 mov edi, 0045162C ; |ASCII "78787878787878787878"
0041095A .68 2C164500 push 0045162C ; |Buffer = winhtml.0045162C
0041095F .68 FB030000 push 3FB ; |ControlID = 3FB (1019.)
00410964 .56 push esi ; |hWnd
00410965 .F3:AB rep stos dword ptr es: ; |
00410967 .FF15 74E44300 call dword ptr [<&USER32.GetDlgItemTextA>] ; \GetDlgItemTextA
0041096D .68 2C164500 push 0045162C ;ASCII "78787878787878787878"
00410972 .E8 49FAFFFF call 004103C0 ; 注册码检查函数
00410977 .83C4 04 add esp, 4
0041097A .85C0 test eax, eax ; 检查验证结果
0041097C .74 38 je short 004109B6 ; 当eax=0时,表示注册失败
可以看到,原来那个 0041096D push 0045162C 是保存我们提供的假码的地址。我们F7进入call 004103C0,来到函数内部,并且一边F8,一边分析如下:
004103C0/$83EC 18 sub esp, 18
004103C3|.83C9 FF or ecx, FFFFFFFF ;初始化计数器为-1
004103C6|.33C0 xor eax, eax ;返回值,如果下面的长度检测没通过,则返回 eax=0,注册失败
004103C8|.53 push ebx
004103C9|.56 push esi
004103CA|.8B7424 24 mov esi, dword ptr ;假码的保存地址
004103CE|.57 push edi
004103CF|.8BFE mov edi, esi
004103D1|.F2:AE repne scas byte ptr es: ;计算长度的操作,ECX为计数器
004103D3|.F7D1 not ecx
004103D5|.49 dec ecx
004103D6|.83F9 14 cmp ecx, 14 ;如果输入的注册码为20位才可以,否则就直接退出了
004103D9|.74 07 je short 004103E2 ;ecx==0x14时,合法有效
004103DB|.5F pop edi
004103DC|.5E pop esi
004103DD|.5B pop ebx
004103DE|.83C4 18 add esp, 18
004103E1|.C3 retn
004103E2|>8A06 mov al, byte ptr ;第1位码
004103E4|.8A4E 01 mov cl, byte ptr ;第2位码
004103E7|.8D5424 0C lea edx, dword ptr ;edx=esp+0C,下面call 0041D462 的字符参数地址
004103EB|.32DB xor bl, bl ;当作 '\0'
004103ED|.52 push edx ;__atoi() 的参数
004103EE|.884424 1C mov byte ptr , al ;保存为字符串
004103F2|.885C24 1D mov byte ptr , bl ;加上'\0',即null结束符
004103F6|.884C24 10 mov byte ptr , cl ;保存为字符串, 这时edx=esp+10(原来是edx=esp+0C,中间那个push引起的)
004103FA|.885C24 11 mov byte ptr , bl ;加上'\0',即null结束符
004103FE|.E8 5FD00000 call 0041D462 ;__atoi(),得到第2个注册码的数字值 eax=8
00410403|.8BF8 mov edi, eax ;edi=0x08
00410405|.8D4424 1C lea eax, dword ptr ;第1个字符的地址
00410409|.50 push eax ;__atoi() 的参数
0041040A|.E8 53D00000 call 0041D462 ;_atoi(),转换第1位码
0041040F|.03F8 add edi, eax ;求两数的和
00410411|.83C4 08 add esp, 8 ;恢复前面两次push对esp的影响
00410414|.83FF 0A cmp edi, 0A ;是否等于10
00410417|.74 09 je short 00410422 ;不相等就 GameOver了
00410419|.5F pop edi
0041041A|.5E pop esi
0041041B|.33C0 xor eax, eax ;eax=0,注册失败
0041041D|.5B pop ebx
0041041E|.83C4 18 add esp, 18
00410421|.C3 retn
00410422|>8A4E 12 mov cl, byte ptr ;第19位
00410425|.8A56 13 mov dl, byte ptr ;第20位
00410428|.8D4424 0C lea eax, dword ptr ;下面的代码与前面的一样,也是求和是否为10
0041042C|.884C24 18 mov byte ptr , cl
00410430|.50 push eax
00410431|.885C24 1D mov byte ptr , bl
00410435|.885424 10 mov byte ptr , dl
00410439|.885C24 11 mov byte ptr , bl
0041043D|.E8 20D00000 call 0041D462
00410442|.8D4C24 1C lea ecx, dword ptr
00410446|.8BF8 mov edi, eax
00410448|.51 push ecx
00410449|.E8 14D00000 call 0041D462
0041044E|.03F8 add edi, eax ;求和
00410450|.83C4 08 add esp, 8
00410453|.83FF 0A cmp edi, 0A ;也是求和后要等于10
00410456|.74 09 je short 00410461
00410458|.5F pop edi
00410459|.5E pop esi
0041045A|.33C0 xor eax, eax ;eax=0,注册失败
0041045C|.5B pop ebx
0041045D|.83C4 18 add esp, 18
00410460|.C3 retn
00410461|>8A56 05 mov dl, byte ptr ;第6位
00410464|.8A46 0D mov al, byte ptr ;第14位
00410467|.8D4C24 0C lea ecx, dword ptr
0041046B|.885424 18 mov byte ptr , dl
0041046F|.51 push ecx
00410470|.885C24 1D mov byte ptr , bl
00410474|.884424 10 mov byte ptr , al
00410478|.885C24 11 mov byte ptr , bl
0041047C|.E8 E1CF0000 call 0041D462
00410481|.8D5424 1C lea edx, dword ptr
00410485|.8BF8 mov edi, eax
00410487|.52 push edx
00410488|.E8 D5CF0000 call 0041D462
0041048D|.03F8 add edi, eax ;求和
0041048F|.83C4 08 add esp, 8
00410492|.83FF 08 cmp edi, 8 ;这次是求和要等于8了
00410495|.74 09 je short 004104A0
00410497|.5F pop edi
00410498|.5E pop esi
00410499|.33C0 xor eax, eax ;eax=0,注册失败
0041049B|.5B pop ebx
0041049C|.83C4 18 add esp, 18
0041049F|.C3 retn
004104A0|>807E 0C 4D cmp byte ptr , 4D ;第13位要求为大写的'M'
004104A4|.74 09 je short 004104AF
004104A6|.5F pop edi
004104A7|.5E pop esi
004104A8|.33C0 xor eax, eax ;eax=0,注册失败
004104AA|.5B pop ebx
004104AB|.83C4 18 add esp, 18
004104AE|.C3 retn
004104AF|>8A4E 0E mov cl, byte ptr ;第15位
004104B2|.33C0 xor eax, eax ;返回值,先清0
004104B4|.80F9 4C cmp cl, 4C ;第15位要求为大写的'L'
004104B7|.5F pop edi
004104B8|.5E pop esi
004104B9|.5B pop ebx
004104BA|.0F94C0 sete al ;如果cl='L'就设置al=1,表示注册成功,返回eax=1。
004104BD|.83C4 18 add esp, 18
004104C0\.C3 retn
跟据上面动态分析,修改假码为 9152p0jie.cnM8Lwww55,再次点OK,提示成功注册,分析结束。
再进入软件,就没有"Register"按钮了,表示软件注册成功了:
总结验证规则如下:
1、注册码的长度为20个字符
2、第1、2、6、14、19、20位必须为数字
3、第1与第2位的数字之和等于10
4、第19与20位的数字之和等于10
5、第6与14位的数字之和等于8
6、第13位为大写字母'M'
7、第15位为大写字母'L'
8、其它位置没什么限制,应该只要是可显示字符就行。
这个注册验证实规则在太简单了,通过口算就可以人工搞定了。
另外,注册信息保存在文件 "C:\WINDOWS\system32\htmltool.ini" 或 "C:\WINDOWS\SysWOW64\htmltool.ini" 中。
所以软件初次启动会触发UAC。
思路很好,昨天按照楼主的思路 破解了一款很小众的内部垄断性软件工具,思路与楼主一样,只不过内部分别使用了先AES加密 后MD5加密两种措施,但是通过 分析代码跑程序两层都得到了完美的破解。对AES的加密原理更加深刻。现在唯一的遗憾是,delphi下的AES加密与其他平台的AES加密出来的结果不一样(部分一样),还在努力解决这个问题 本帖最后由 solly 于 2019-3-27 22:23 编辑
wapjltb 发表于 2019-3-27 18:17
请问楼主分析窗口右边的注释是自动生成的吗?
不是的,能自动生成那就不用分析了,OD还没有这么NB,是在OD中右键选“注释”后人为添加的,再与代码一起复制出来的。 欢迎分析讨论交流,吾爱破解论坛有你更精彩! 学习了,谢谢! 非常帅气暴力,我喜欢! 谢谢@Thanks! 今天没分了,mark一下,改天来送分。 可惜搬砖工的我完全看不懂 看起来简单,学起来难系列{:1_889:} 请问楼主分析窗口右边的注释是自动生成的吗? 看不懂系列,还是很感谢,牛!
页:
[1]
2