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,或者可以脱壳修改。。。
【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢! 啊,这不是来自pyg的zaas大侠么。好文啊,支持大侠,希望以后能常来52发帖~~ 牛贴,学习学习带壳分析 欢迎zaas来吾爱破解多多发布算法分析教程! 欢迎zaas来吾爱破解多多发布算法分析教程!
Hmily 发表于 2010-2-16 21:40 http://www.52pojie.cn/images/common/back.gif
:lol:lol:lol 学习下,膜拜lz 希望可以在詳細點.
感謝分享教學
页:
[1]