好友
阅读权限35
听众
最后登录1970-1-1
|
solly
发表于 2019-3-27 11:21
本帖最后由 云在天 于 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.”,马上来到下面界面,找到字符串:
双击来到引用该字符串的代码处:
汇编代码如下:
[Asm] 纯文本查看 复制代码 00410942 > \8BB424 E80000>mov esi, dword ptr [esp+E8] ; 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:[edi] ; |
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 [4517F8], 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断下程序:
[Asm] 纯文本查看 复制代码 00410942 > \8BB424 E80000>mov esi, dword ptr [esp+E8] ;
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:[edi] ; |
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,一边分析如下:
[Asm] 纯文本查看 复制代码 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 [esp+24] ; 假码的保存地址
004103CE |. 57 push edi
004103CF |. 8BFE mov edi, esi
004103D1 |. F2:AE repne scas byte ptr es:[edi] ; 计算长度的操作,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 [esi] ; 第1位码
004103E4 |. 8A4E 01 mov cl, byte ptr [esi+1] ; 第2位码
004103E7 |. 8D5424 0C lea edx, dword ptr [esp+C] ; edx=esp+0C,下面call 0041D462 的字符参数地址
004103EB |. 32DB xor bl, bl ; 当作 '\0'
004103ED |. 52 push edx ; __atoi() 的参数
004103EE |. 884424 1C mov byte ptr [esp+1C], al ; 保存为字符串
004103F2 |. 885C24 1D mov byte ptr [esp+1D], bl ; 加上'\0',即null结束符
004103F6 |. 884C24 10 mov byte ptr [esp+10], cl ; 保存为字符串, 这时edx=esp+10(原来是edx=esp+0C,中间那个push引起的)
004103FA |. 885C24 11 mov byte ptr [esp+11], 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 [esp+1C] ; 第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 [esi+12] ; 第19位
00410425 |. 8A56 13 mov dl, byte ptr [esi+13] ; 第20位
00410428 |. 8D4424 0C lea eax, dword ptr [esp+C] ; 下面的代码与前面的一样,也是求和是否为10
0041042C |. 884C24 18 mov byte ptr [esp+18], cl
00410430 |. 50 push eax
00410431 |. 885C24 1D mov byte ptr [esp+1D], bl
00410435 |. 885424 10 mov byte ptr [esp+10], dl
00410439 |. 885C24 11 mov byte ptr [esp+11], bl
0041043D |. E8 20D00000 call 0041D462
00410442 |. 8D4C24 1C lea ecx, dword ptr [esp+1C]
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 [esi+5] ; 第6位
00410464 |. 8A46 0D mov al, byte ptr [esi+D] ; 第14位
00410467 |. 8D4C24 0C lea ecx, dword ptr [esp+C]
0041046B |. 885424 18 mov byte ptr [esp+18], dl
0041046F |. 51 push ecx
00410470 |. 885C24 1D mov byte ptr [esp+1D], bl
00410474 |. 884424 10 mov byte ptr [esp+10], al
00410478 |. 885C24 11 mov byte ptr [esp+11], bl
0041047C |. E8 E1CF0000 call 0041D462
00410481 |. 8D5424 1C lea edx, dword ptr [esp+1C]
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 [esi+C], 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 [esi+E] ; 第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。
|
免费评分
-
查看全部评分
|