solly 发表于 2019-3-27 11:21

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。



guoyangye 发表于 2019-3-28 18:48

思路很好,昨天按照楼主的思路 破解了一款很小众的内部垄断性软件工具,思路与楼主一样,只不过内部分别使用了先AES加密 后MD5加密两种措施,但是通过 分析代码跑程序两层都得到了完美的破解。对AES的加密原理更加深刻。现在唯一的遗憾是,delphi下的AES加密与其他平台的AES加密出来的结果不一样(部分一样),还在努力解决这个问题

solly 发表于 2019-3-27 22:21

本帖最后由 solly 于 2019-3-27 22:23 编辑

wapjltb 发表于 2019-3-27 18:17
请问楼主分析窗口右边的注释是自动生成的吗?
不是的,能自动生成那就不用分析了,OD还没有这么NB,是在OD中右键选“注释”后人为添加的,再与代码一起复制出来的。

看世间百态 发表于 2019-3-27 12:38

欢迎分析讨论交流,吾爱破解论坛有你更精彩!

51cbb 发表于 2019-3-27 14:29

学习了,谢谢!

fxinyi 发表于 2019-3-27 15:14

非常帅气暴力,我喜欢!

BlackCoffee 发表于 2019-3-27 16:20

谢谢@Thanks!

我为52pojie狂 发表于 2019-3-27 16:23

今天没分了,mark一下,改天来送分。

昵称太骚已屏蔽 发表于 2019-3-27 17:09

可惜搬砖工的我完全看不懂

flyingct 发表于 2019-3-27 18:01

看起来简单,学起来难系列{:1_889:}

wapjltb 发表于 2019-3-27 18:17

请问楼主分析窗口右边的注释是自动生成的吗?

ytkxw 发表于 2019-3-27 18:46

看不懂系列,还是很感谢,牛!
页: [1] 2
查看完整版本: VeryXXF HXXL Cxxxxxxx v2.0 注册分析+人工计算注册码即可【0.1星级别】!