首页
社区
课程
招聘
[原创] PDF to IMAGE v4.5算法分析
发表于: 2010-8-29 09:37 4770

[原创] PDF to IMAGE v4.5算法分析

2010-8-29 09:37
4770
【软件名称】: PDF to IMAGE v4.5
【下载地址】: 自己搜索下载
【保护方式】: 序列号
【编写语言】: Borland C++
【使用工具】: PEiD,Ollydbg
【软件介绍】: PDF To Image是一款非常强大的PDF工具,转换为带有文字,绘画,制图等完整功能的图像文件,它不需要其它任何软件例如Adobe Acrobat, Acrobat Reader等的支持。
【作者声明】: 入门级,高手略过。
--------------------------------------------------------------------------------
    今天下载IMAGE to PDF时,下成了PDF to IMAGE了,一不小心就把算法跟了出来,在论坛又没有IMAGE to PDF的相关文章,可能是太简单的原因了吧。写这篇文章目的是想让许多想学破解又像我一样菜的朋友们有一个初步的认识,增强学习的信心。

1. peid扫描下,没有加壳,显示是Borland C++.
2. 寻找注册函数
方法一:用dede打开程序,在过程中找到RegD模块,双击右面btOKClick事件,那就是注册函数的段首,记下0040A5BC,再用OD打开程序,Ctrl+G进行表达式跟踪,输入0040A5BC,确定,来到0040A5BC,F2下断点。
方法二:由于注册不成功会弹出一个窗口,可以直接用OD打开程序,在命令行输入bp MessageBoxA下断点,F9运行程序,随便输入一个注册码例如123456789,这时进入程序领空,按ALT+F9返回,会弹出错误提示框,确定后,来到程序段中。如下:
0040A770   |.  8BC3                 mov eax,ebx
0040A772   |.  E8 3DBD0800          call pdftoima.004964B4
0040A777   |.  50                   push eax                           ; |hOwner
0040A778   |.  E8 A7270D00          call <jmp.&USER32.MessageBoxA>     ; \MessageBoxA
0040A77D   |.  FF4F 1C              dec dword ptr ds:[edi+1C]                返回来到这里
0040A780   |.  8D45 FC              lea eax,dword ptr ss:[ebp-4]
0040A783   |.  BA 02000000          mov edx,2
一直向上找到段首,也和刚才找到的一样是0040A5BC,F2下断点。重新运行程序,输入假码,在0040A5BC处断下,如下:

0040A5BC   /.  55                   push ebp
0040A5BD   |.  8BEC                 mov ebp,esp
0040A5BF   |.  83C4 C4              add esp,-3C
0040A5C2   |.  53                   push ebx
0040A5C3   |.  56                   push esi
0040A5C4   |.  57                   push edi
0040A5C5   |.  8BD8                 mov ebx,eax
0040A5C7   |.  BE CC0E4E00          mov esi,pdftoima.004E0ECC
0040A5CC   |.  8D7D C4              lea edi,dword ptr ss:[ebp-3C]
0040A5CF   |.  B8 84114E00          mov eax,pdftoima.004E1184
0040A5D4   |.  E8 0B2C0B00          call pdftoima.004BD1E4
0040A5D9   |.  66:C747 10 1400      mov word ptr ds:[edi+10],14
0040A5DF   |.  33D2                 xor edx,edx
0040A5E1   |.  8955 FC              mov dword ptr ss:[ebp-4],edx
0040A5E4   |.  8D55 FC              lea edx,dword ptr ss:[ebp-4]
0040A5E7   |.  FF47 1C              inc dword ptr ds:[edi+1C]
0040A5EA   |.  8B83 F4020000        mov eax,dword ptr ds:[ebx+2F4]
0040A5F0   |.  E8 AB570800          call pdftoima.0048FDA0
0040A5F5   |.  66:C747 10 0800      mov word ptr ds:[edi+10],8
0040A5FB   |.  837D FC 00           cmp dword ptr ss:[ebp-4],0
0040A5FF   |.  74 05                je short pdftoima.0040A606
0040A601   |.  8B4D FC              mov ecx,dword ptr ss:[ebp-4]
0040A604   |.  EB 03                jmp short pdftoima.0040A609
0040A606   |>  8D4E 47              lea ecx,dword ptr ds:[esi+47]
0040A609   |>  51                   push ecx                           ; /Arg2
0040A60A   |.  53                   push ebx                           ; |Arg1
0040A60B   |.  E8 50FFFFFF          call pdftoima.0040A560             ; \pdftoima.0040A560
0040A610   |.  83C4 08              add esp,8
0040A613   |.  3C 01                cmp al,1                           ;  al=1则注册成功
0040A615   |.  0F85 45010000        jnz pdftoima.0040A760              ;  跳则注册失败
0040A61B   |.  6A 40                push 40
0040A61D   |.  8D86 9D000000        lea eax,dword ptr ds:[esi+9D]
0040A623   |.  50                   push eax
0040A624   |.  8D56 48              lea edx,dword ptr ds:[esi+48]
0040A627   |.  52                   push edx
0040A628   |.  8BC3                 mov eax,ebx
0040A62A   |.  E8 85BE0800          call pdftoima.004964B4
0040A62F   |.  50                   push eax                           ; |hOwner
0040A630   |.  E8 EF280D00          call <jmp.&USER32.MessageBoxA>     ; \注册成功
0040A635   |.  66:C747 10 2C00      mov word ptr ds:[edi+10],2C

如0040A613处如果al=1则注册成功,向上看一下0040A60B处的call,它的返回值就保存在al中,所以这是一个关键call.从段首我们一路F8单步来到0040A60B处,F7跟进。

3.算法分析
上面F7跟进后来到:
0040A560   /$  55                   push ebp
0040A561   |.  8BEC                 mov ebp,esp
0040A563   |.  53                   push ebx
0040A564   |.  56                   push esi
0040A565   |.  57                   push edi                           ;  上面是一些椎栈操作
0040A566   |.  8B5D 0C              mov ebx,dword ptr ss:[ebp+C]
0040A569   |.  85DB                 test ebx,ebx
0040A56B   |.  74 0C                je short pdftoima.0040A579
0040A56D   |.  53                   push ebx
0040A56E   |.  E8 D9280B00          call pdftoima.004BCE4C             ;  计算注册码位数返回值保存在EAX中
0040A573   |.  59                   pop ecx
0040A574   |.  83F8 10              cmp eax,10                         ;  用注册码位数和十六进制的10比较,也就是十进制的16
0040A577   |.  74 04                je short pdftoima.0040A57D         ;  如果相等,继续
0040A579   |>  33C0                 xor eax,eax                        ;  如果不相等,EAX清零,跳出程序
0040A57B   |.  EB 39                jmp short pdftoima.0040A5B6        ;  我们之前分析al要等于1才注册成功,这里等于0也就是注册失败
0040A57D   |>  0FBE73 02            movsx esi,byte ptr ds:[ebx+2]      ;  把第3位注册码存入ESI中
0040A581   |.  8BC6                 mov eax,esi                        ;  第3位再存入EAX中
0040A583   |.  0FBE7B 0D            movsx edi,byte ptr ds:[ebx+D]      ;  把第14位注册码存入EDI中
0040A587   |.  03C7                 add eax,edi                        ;  第3位ascii值+第14位ascii值
0040A589   |.  3D 9B000000          cmp eax,9B                         ;  与9B比较
0040A58E   |.  75 24                jnz short pdftoima.0040A5B4        ;  不相等则跳,跳则注册失败
0040A590   |.  8BCE                 mov ecx,esi                        ;  第3位存入ECX中
0040A592   |.  2BCF                 sub ecx,edi                        ;  第3位ascii值-第14位ascii值
0040A594   |.  8BC1                 mov eax,ecx
0040A596   |.  99                   cdq
0040A597   |.  33C2                 xor eax,edx
0040A599   |.  2BC2                 sub eax,edx                        ;  这三句取绝对值
0040A59B   |.  83C0 41              add eax,41
0040A59E   |.  0FBE53 07            movsx edx,byte ptr ds:[ebx+7]      ;  第8位存入EDX中
0040A5A2   |.  3BC2                 cmp eax,edx                        ;  把上面的结果与第8位比较
0040A5A4   |.  75 0E                jnz short pdftoima.0040A5B4        ;  不相等则跳,跳则注册失败
0040A5A6   |.  8B45 08              mov eax,dword ptr ss:[ebp+8]
0040A5A9   |.  C680 34030000 01     mov byte ptr ds:[eax+334],1        ;  这里应该是写入注册成功的标志
0040A5B0   |.  B0 01                mov al,1                           ;  AL=1,也就注册成功
0040A5B2   |.  EB 02                jmp short pdftoima.0040A5B6
0040A5B4   |>  33C0                 xor eax,eax                        ;  跳到这里,EAX清零,注册失败
0040A5B6   |>  5F                   pop edi
0040A5B7   |.  5E                   pop esi
0040A5B8   |.  5B                   pop ebx
0040A5B9   |.  5D                   pop ebp
0040A5BA   \.  C3                   retn

4.总结
这个程序的注册算法很简单。
注册码必须为16位,第3位ascii值+第14位ascii值必须等于9BH,如字母“A”+字母“Z”=9BH,(第3位ascii值-第14位ascii值)的绝对值+41H必须等于第8位注册码,如(字母“A”-字母“Z”)的绝对值+41h=5Ah,也就是字母Z。其它位任意。
一个可用的注册码:11A1111Z11111Z11.

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回