zaas 发表于 2010-2-13 15:52

A-PDF Watermark 3.0.0算法分析

【破文标题】A-PDF Watermark 3.0.0算法分析
【破文作者】zaas
【破解工具】OllyICE,PEiD v0.94
【破解平台】WinXP
【软件名称】Batch DOCX to DOC Converter 2010.2.205
【更新时间】2010-2-12 10:04:51
【软件类别】国外软件/文件管理
【软件语言】英文
【应用平台】WinXP/2000/2003/Vista
【软件性质】共享(收费)软件
【软件大小】3843KB
【原版下载】http://www.newhua.com/soft/87179.htm
【保护方式】注册码
【软件简介】A-PDF Watermark是一个快速的桌面实用程序PDF格式的水印工具,让你帮一批Acrobat PDF 文件添加水印,当文件被复制时,它们自动的将被添加水印 , 并自动的传送到另一个目录中去。您可以加文字,标识,日期/时间戳,网页号码,图像, PDF档案等各种水印,这样就可以保护您的版权问题等等
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------
【破解内容】
--------------------------------------------------------------
**************************************************************
用PEiD查壳,为ASProtect 1.2x - 1.3x -> Alexey Solodovnikov
**************************************************************
过年回老家,手头工具不全,只好带壳调试。大年三十比较清闲,找个软件玩玩。
新电脑,OD插件没有,故下MessageBoxExA断点,成功断下:
0012F2E4   7E45082F/CALL 到 MessageBoxExA 来自 user32.7E45082A
0012F2E8   00550232|hOwner = 00550232 ('Pdfwm',class='TApplication')
0012F2EC   01477B88|Text = "Invalid Register Key"
0012F2F0   013D9E88|Title = "Pdfwm"
0012F2F4   00000040|Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0012F2F8   00000000\LanguageID = 0 (LANG_NEUTRAL)

ctrl+f9返回,来到:

006C7B94/.55            push    ebp                              ;calll
006C7B95|.8BEC          mov   ebp, esp
006C7B97|.6A 00         push    0
006C7B99|.53            push    ebx
006C7B9A|.8BD8          mov   ebx, eax
006C7B9C|.33C0          xor   eax, eax
006C7B9E|.55            push    ebp
006C7B9F|.68 107C6C00   push    006C7C10
006C7BA4|.64:FF30       push    dword ptr fs:
006C7BA7|.64:8920       mov   dword ptr fs:, esp
006C7BAA|.8D55 FC       lea   edx, dword ptr
006C7BAD|.8B83 30030000 mov   eax, dword ptr
006C7BB3|.E8 54CBDAFF   call    0047470C                         ;假码
006C7BB8|.8B55 FC       mov   edx, dword ptr
006C7BBB|.A1 F8AF7200   mov   eax, dword ptr
006C7BC0|.8B00          mov   eax, dword ptr
006C7BC2|.E8 9187FEFF   call    006B0358
006C7BC7|.A1 F8AF7200   mov   eax, dword ptr
006C7BCC|.8B00          mov   eax, dword ptr
006C7BCE|.E8 F984FEFF   call    006B00CC                         ;关键call
006C7BD3|.84C0          test    al, al
006C7BD5|.74 16         je      short 006C7BED
006C7BD7|.A1 90B17200   mov   eax, dword ptr
006C7BDC|.8B40 04       mov   eax, dword ptr
006C7BDF|.E8 FC37EAFF   call    0056B3E0
006C7BE4|.8BC3          mov   eax, ebx
006C7BE6|.E8 ADFBFFFF   call    006C7798
006C7BEB|.EB 0D         jmp   short 006C7BFA
006C7BED|>A1 90B17200   mov   eax, dword ptr
006C7BF2|.8B40 08       mov   eax, dword ptr
006C7BF5|.E8 E637EAFF   call    0056B3E0
006C7BFA|>33C0          xor   eax, eax
006C7BFC|.5A            pop   edx
006C7BFD|.59            pop   ecx
006C7BFE|.59            pop   ecx
006C7BFF|.64:8910       mov   dword ptr fs:, edx
006C7C02|.68 177C6C00   push    006C7C17
006C7C07|>8D45 FC       lea   eax, dword ptr
006C7C0A|.E8 05D2D3FF   call    00404E14
006C7C0F\.C3            retn
006C7BD3 al不等于0注册成功,因而call    006B00CC为关键call。同时跟踪发现:无论输入的注册码正确与否,都会写入注册表的
"RegisterCode"子项,所以还是需要试试启动验证。。。
不得已,上网找了找VOLX大侠的脚本,成功找到OEP。
0070015C/.55            push    ebp
0070015D|.8BEC          mov   ebp, esp
0070015F|.83C4 EC       add   esp, -14
00700162|.53            push    ebx
00700163|.33C0          xor   eax, eax
00700165|.8945 EC       mov   dword ptr , eax
00700168|.B8 24FA6F00   mov   eax, 006FFA24
0070016D|.E8 8273D0FF   call    004074F4
00700172|.33C0          xor   eax, eax
00700174|.55            push    ebp
00700175|.68 87027000   push    00700287
0070017A|.64:FF30       push    dword ptr fs:
0070017D|.64:8920       mov   dword ptr fs:, esp
00700180|.8D55 EC       lea   edx, dword ptr
00700183|.B8 9C027000   mov   eax, 0070029C                  ;ASCII "Software\A-PDF\Watermark\Language"
00700188|.E8 2BCAE6FF   call    0056CBB8

下RegOpenKeyExA断点,断下:
返回到似曾相识的这段代码:
006B01AA   .E8 A15BD9FF   call    00445D50                         ;读注册表的注册信息
006B01AF   .8D4D E4       lea   ecx, dword ptr
006B01B2   .8B45 FC       mov   eax, dword ptr
006B01B5   .8B50 18       mov   edx, dword ptr
006B01B8   .8B45 F0       mov   eax, dword ptr
006B01BB   .E8 EC5FD9FF   call    004461AC                         ;假码
006B01C0   .8B55 E4       mov   edx, dword ptr
006B01C3   .8B45 F8       mov   eax, dword ptr
006B01C6   .E8 9D4CD5FF   call    00404E68
006B01CB   .8B55 F8       mov   edx, dword ptr
006B01CE   .8B12          mov   edx, dword ptr
006B01D0   .8B45 FC       mov   eax, dword ptr
006B01D3   .E8 80000000   call    006B0258                         ;关键call
006B01D8   .84C0          test    al, al
006B01DA   .74 10         je      short 006B01EC

跟进关键call,发现启动验证和输入注册码验证用的居然是同一段call,国外的软件还是太实在了,hohoho。。。
006B0258/$55            push    ebp
006B0259|.8BEC          mov   ebp, esp
006B025B|.83C4 D8       add   esp, -28
006B025E|.53            push    ebx
006B025F|.56            push    esi
006B0260|.57            push    edi
006B0261|.33C9          xor   ecx, ecx
006B0263|.894D E8       mov   dword ptr , ecx
006B0266|.894D F4       mov   dword ptr , ecx
006B0269|.894D F0       mov   dword ptr , ecx
006B026C|.8955 F8       mov   dword ptr , edx
006B026F|.8945 FC       mov   dword ptr , eax
006B0272|.8B45 F8       mov   eax, dword ptr
006B0275|.E8 5A50D5FF   call    004052D4                         ;no use
006B027A|.33C0          xor   eax, eax
006B027C|.55            push    ebp
006B027D|.68 48036B00   push    006B0348
006B0282|.64:FF30       push    dword ptr fs:
006B0285|.64:8920       mov   dword ptr fs:, esp
006B0288|.8D55 E8       lea   edx, dword ptr
006B028B|.8B45 F8       mov   eax, dword ptr
006B028E|.E8 F1BBD5FF   call    0040BE84
006B0293|.8B55 E8       mov   edx, dword ptr
006B0296|.8D45 F8       lea   eax, dword ptr
006B0299|.E8 0E4CD5FF   call    00404EAC
006B029E|.8D55 D8       lea   edx, dword ptr
006B02A1|.8B45 F8       mov   eax, dword ptr
006B02A4|.E8 7356ECFF   call    0057591C                         ;计算假码的MD5
006B02A9|.8D45 D8       lea   eax, dword ptr           ;MD5结果保存的位置
006B02AC|.8D55 F4       lea   edx, dword ptr
006B02AF|.E8 8856ECFF   call    0057593C                         ;Md5结果转数值
006B02B4|.8D4D F0       lea   ecx, dword ptr
006B02B7|.BA 10000000   mov   edx, 10
006B02BC|.33C0          xor   eax, eax
006B02BE|.E8 1152D5FF   call    004054D4                         ;清除一段内存地址
006B02C3|.33F6          xor   esi, esi
006B02C5|.8B45 FC       mov   eax, dword ptr          ;内存基址
006B02C8|.8B78 08       mov   edi, dword ptr
006B02CB|.C645 EF 00    mov   byte ptr , 0             ;标志位置0
006B02CF|.3BFE          cmp   edi, esi
006B02D1|.7E 4F         jle   short 006B0322
006B02D3|>8D1C37      /lea   ebx, dword ptr
006B02D6|.D1FB          |sar   ebx, 1
006B02D8|.79 03         |jns   short 006B02DD
006B02DA|.83D3 00       |adc   ebx, 0
006B02DD|>8D45 F0       |lea   eax, dword ptr
006B02E0|.E8 5750D5FF   |call    0040533C
006B02E5|.8BD0          |mov   edx, eax
006B02E7|.8BC3          |mov   eax, ebx
006B02E9|.03C0          |add   eax, eax
006B02EB|.8B4D FC       |mov   ecx, dword ptr           ;基址
006B02EE|.8B49 04       |mov   ecx, dword ptr
006B02F1|.8D04C1      |lea   eax, dword ptr
006B02F4|.B9 10000000   |mov   ecx, 10                         ;取16字符
006B02F9|.E8 EE29D5FF   |call    00402CEC                        ;取得真码数值
006B02FE|.8B55 F0       |mov   edx, dword ptr
006B0301|.8B45 F4       |mov   eax, dword ptr
006B0304|.E8 A3B9D5FF   |call    0040BCAC                        ;MD5数值和真码数值按字节比较
006B0309|.85C0          |test    eax, eax                        ;此处为比较结果。
006B030B|.75 06         |jnz   short 006B0313                  ;关键跳转,爆破点
006B030D|.C645 EF 01    |mov   byte ptr , 1            ;标志位
006B0311|.EB 0F         |jmp   short 006B0322
006B0313|>85C0          |test    eax, eax
006B0315|.7E 05         |jle   short 006B031C
006B0317|.8D73 01       |lea   esi, dword ptr
006B031A|.EB 02         |jmp   short 006B031E
006B031C|>8BFB          |mov   edi, ebx
006B031E|>3BFE          |cmp   edi, esi
006B0320|.^ 7F B1         \jg      short 006B02D3                  ;循环取得下一组真码进行比较
006B0322|>8A5D EF       mov   bl, byte ptr             ;标志位入bl,然后传给eax

【破解总结】软件的算法很简单,把输入的假码做MD5运算,取得32位数值,和软件内置的N个字符串(嘿嘿,加密过了的,不能直接搜索到)做比较,只要有一个相符,则注册成功。
比如输入假码“123456789abcdef”,MD5值(内存)为:64 9F 31 2A AF FA C7 56 1A E8 1F 8F 9C 33 4F 14,系统内置的注册码大概有30组,比如:
80 B6 77 81 BB CA 80 13 82 F0 F2 0E D5 3A A6 3A,
3F DA DF 3E 7D 89 49 AD BA DF 71 20 7D D8 BE 94,
1C 09 96 6E B5 B5 22 9A 9F CA 6E 6E 16 FD 42 BF等等。。。
由于MD5算法不可逆,而且估计这个注册码位数不会太短,所以。。。有兴趣的同学可以用穷举法试试。。。
为标志位,006B030B|.75 06         |jnz   short 006B0313    可以用dup2做个patch改为75 00,或者可以脱壳修改。。。
【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

missviola 发表于 2010-2-13 16:06

啊,这不是来自pyg的zaas大侠么。好文啊,支持大侠,希望以后能常来52发帖~~

李东国 发表于 2010-2-13 17:18

牛贴,学习学习带壳分析

Hmily 发表于 2010-2-16 21:40

欢迎zaas来吾爱破解多多发布算法分析教程!

zaas 发表于 2010-2-18 00:19

欢迎zaas来吾爱破解多多发布算法分析教程!
Hmily 发表于 2010-2-16 21:40 http://www.52pojie.cn/images/common/back.gif


    :lol:lol:lol

lover_six 发表于 2010-2-18 14:27

学习下,膜拜lz

a2213572 发表于 2010-2-19 23:49

希望可以在詳細點.
感謝分享教學
页: [1]
查看完整版本: A-PDF Watermark 3.0.0算法分析