好友
阅读权限40
听众
最后登录1970-1-1
|
zaas
发表于 2010-2-13 15:52
【破文标题】A-PDF Watermark 3.0.0算法分析
【破文作者】zaas[PYG][FCT]
【破解工具】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 [Registered] -> Alexey Solodovnikov [Overlay]
**************************************************************
过年回老家,手头工具不全,只好带壳调试。大年三十比较清闲,找个软件玩玩。
新电脑,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:[eax]
006C7BA7 |. 64:8920 mov dword ptr fs:[eax], esp
006C7BAA |. 8D55 FC lea edx, dword ptr [ebp-4]
006C7BAD |. 8B83 30030000 mov eax, dword ptr [ebx+330]
006C7BB3 |. E8 54CBDAFF call 0047470C ; 假码
006C7BB8 |. 8B55 FC mov edx, dword ptr [ebp-4]
006C7BBB |. A1 F8AF7200 mov eax, dword ptr [72AFF8]
006C7BC0 |. 8B00 mov eax, dword ptr [eax]
006C7BC2 |. E8 9187FEFF call 006B0358
006C7BC7 |. A1 F8AF7200 mov eax, dword ptr [72AFF8]
006C7BCC |. 8B00 mov eax, dword ptr [eax]
006C7BCE |. E8 F984FEFF call 006B00CC ; 关键call
006C7BD3 |. 84C0 test al, al
006C7BD5 |. 74 16 je short 006C7BED
006C7BD7 |. A1 90B17200 mov eax, dword ptr [72B190]
006C7BDC |. 8B40 04 mov eax, dword ptr [eax+4]
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 [72B190]
006C7BF2 |. 8B40 08 mov eax, dword ptr [eax+8]
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:[eax], edx
006C7C02 |. 68 177C6C00 push 006C7C17
006C7C07 |> 8D45 FC lea eax, dword ptr [ebp-4]
006C7C0A |. E8 05D2D3FF call 00404E14
006C7C0F \. C3 retn
006C7BD3 al不等于0注册成功,因而call 006B00CC为关键call。同时跟踪发现:无论输入的注册码正确与否,都会写入注册表的[HKEY_LOCAL_MACHINE\SOFTWARE\A-PDF\Watermark\Register]
"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 [ebp-14], 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:[eax]
0070017D |. 64:8920 mov dword ptr fs:[eax], esp
00700180 |. 8D55 EC lea edx, dword ptr [ebp-14]
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 [ebp-1C]
006B01B2 . 8B45 FC mov eax, dword ptr [ebp-4]
006B01B5 . 8B50 18 mov edx, dword ptr [eax+18]
006B01B8 . 8B45 F0 mov eax, dword ptr [ebp-10]
006B01BB . E8 EC5FD9FF call 004461AC ; 假码
006B01C0 . 8B55 E4 mov edx, dword ptr [ebp-1C]
006B01C3 . 8B45 F8 mov eax, dword ptr [ebp-8]
006B01C6 . E8 9D4CD5FF call 00404E68
006B01CB . 8B55 F8 mov edx, dword ptr [ebp-8]
006B01CE . 8B12 mov edx, dword ptr [edx]
006B01D0 . 8B45 FC mov eax, dword ptr [ebp-4]
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 [ebp-18], ecx
006B0266 |. 894D F4 mov dword ptr [ebp-C], ecx
006B0269 |. 894D F0 mov dword ptr [ebp-10], ecx
006B026C |. 8955 F8 mov dword ptr [ebp-8], edx
006B026F |. 8945 FC mov dword ptr [ebp-4], eax
006B0272 |. 8B45 F8 mov eax, dword ptr [ebp-8]
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:[eax]
006B0285 |. 64:8920 mov dword ptr fs:[eax], esp
006B0288 |. 8D55 E8 lea edx, dword ptr [ebp-18]
006B028B |. 8B45 F8 mov eax, dword ptr [ebp-8]
006B028E |. E8 F1BBD5FF call 0040BE84
006B0293 |. 8B55 E8 mov edx, dword ptr [ebp-18]
006B0296 |. 8D45 F8 lea eax, dword ptr [ebp-8]
006B0299 |. E8 0E4CD5FF call 00404EAC
006B029E |. 8D55 D8 lea edx, dword ptr [ebp-28]
006B02A1 |. 8B45 F8 mov eax, dword ptr [ebp-8]
006B02A4 |. E8 7356ECFF call 0057591C ; 计算假码的MD5
006B02A9 |. 8D45 D8 lea eax, dword ptr [ebp-28] ; MD5结果保存的位置
006B02AC |. 8D55 F4 lea edx, dword ptr [ebp-C]
006B02AF |. E8 8856ECFF call 0057593C ; Md5结果转数值
006B02B4 |. 8D4D F0 lea ecx, dword ptr [ebp-10]
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 [ebp-4] ; 内存基址
006B02C8 |. 8B78 08 mov edi, dword ptr [eax+8]
006B02CB |. C645 EF 00 mov byte ptr [ebp-11], 0 ; 标志位置0
006B02CF |. 3BFE cmp edi, esi
006B02D1 |. 7E 4F jle short 006B0322
006B02D3 |> 8D1C37 /lea ebx, dword ptr [edi+esi]
006B02D6 |. D1FB |sar ebx, 1
006B02D8 |. 79 03 |jns short 006B02DD
006B02DA |. 83D3 00 |adc ebx, 0
006B02DD |> 8D45 F0 |lea eax, dword ptr [ebp-10]
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 [ebp-4] ; 基址
006B02EE |. 8B49 04 |mov ecx, dword ptr [ecx+4]
006B02F1 |. 8D04C1 |lea eax, dword ptr [ecx+eax*8]
006B02F4 |. B9 10000000 |mov ecx, 10 ; 取16字符
006B02F9 |. E8 EE29D5FF |call 00402CEC ; 取得真码数值
006B02FE |. 8B55 F0 |mov edx, dword ptr [ebp-10]
006B0301 |. 8B45 F4 |mov eax, dword ptr [ebp-C]
006B0304 |. E8 A3B9D5FF |call 0040BCAC ; MD5数值和真码数值按字节比较
006B0309 |. 85C0 |test eax, eax ; 此处为比较结果。
006B030B |. 75 06 |jnz short 006B0313 ; 关键跳转,爆破点
006B030D |. C645 EF 01 |mov byte ptr [ebp-11], 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 [ebx+1]
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 [ebp-11] ; 标志位入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算法不可逆,而且估计这个注册码位数不会太短,所以。。。有兴趣的同学可以用穷举法试试。。。
[ebp-11] 为标志位,006B030B |. 75 06 |jnz short 006B0313 可以用dup2做个patch改为75 00,或者可以脱壳修改。。。
【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
|
免费评分
-
查看全部评分
|