HadgeROL 发表于 2011-4-2 17:59

Batch Image Resizer 算法分析

本帖最后由 Blackk 于 2011-4-2 18:26 编辑

heiketian10兄的注册机原帖地址:
http://www.52pojie.cn/thread-85075-1-1.html

【破文标题】Batch Image Resizer 算法分析
【破文作者】Blackk
【作者邮箱】191477631@qq.com
【作者主页】http://blackk.co.cc
【破解工具】OD,PEID
【破解平台】WinDows XP
【软件名称】BatchImageResizer
【软件大小】740KB
【原版下载】http://www.jklnsoft.com/download/batch-image-resizer.exe
【保护方式】Microsoft Visual C++ 6.0
【软件简介】Batch Image Resizer
With Batch Image Resizer, getting your photos to fit wherever you want them to has never been easier! Resize, Rotate, Stamp, and even Convert your images with ease. Full compatibility with JPEG, BMP, GIF, PCX, and PNG formats is included. Batch support included to do all of the above functions to multiple files at once.
【破解声明】仅作技术交流之用
------------------------------------------------------------------------
【破解过程】

OD载入程序,搜索字符串“registration code”。找到重启验证处

00405DC0/$6A FF         push    -1
00405DC2|.68 B0774100   push    004177B0                         ;SE 处理程序安装
00405DC7|.64:A1 0000000>mov   eax, dword ptr fs:
00405DCD|.50            push    eax
F8单步走

00405E73|.8379 F8 0B    cmp   dword ptr , 0B            ;邮箱总位数不小于11位
00405E77|.7D 08         jge   short 00405E81
00405E79|.899D C8000000 mov   dword ptr , ebx
00405E7F|.EB 6D         jmp   short 00405EEE
00405E81|>51            push    ecx
00405E82|.8D5424 14   lea   edx, dword ptr
00405E86|.8BCC          mov   ecx, esp
00405E88|.896424 20   mov   dword ptr , esp
00405E8C|.52            push    edx
00405E8D|.E8 58080100   call    <jmp.&MFC42.#535>
00405E92|.8D4424 1C   lea   eax, dword ptr
00405E96|.8BCE          mov   ecx, esi
00405E98|.50            push    eax
00405E99|.E8 82000000   call    00405F20                         ;算法CALL,F7

//算法入口

00405F20/$6A FF         push    -1
00405F22|.68 E7774100   push    004177E7                         ;SE 处理程序安装
00405F27|.64:A1 0000000>mov   eax, dword ptr fs:
00405F2D|.50            push    eax
00405F2E|.64:8925 00000>mov   dword ptr fs:, esp
//邮箱位数处理

00405F65|.83F8 0A       cmp   eax, 0A                        ;
00405F68|.0F8E 98010000 jle   00406106
00405F6E|.83F8 10       cmp   eax, 10
00405F71|.7D 0E         jge   short 00405F81                   ;邮箱总位数大于16位,不做修改
00405F73|.68 F0154200   push    004215F0                         ;小于16位就在后面加上aaaaaaaa

//算法1,邮箱每一位的初始处理

00405F8D|> /8D4C14 20   /lea   ecx, dword ptr    ;(initial cpu selection)
00405F91|. |8A040E      |mov   al, byte ptr           ;循环取邮箱每位的16进制值放入AL中
00405F94|. |3C 61         |cmp   al, 61                        ;若字符处于a-f之间
00405F96|. |8801          |mov   byte ptr , al
00405F98|. |7C 08         |jl      short 00405FA2
00405F9A|. |3C 66         |cmp   al, 66
00405F9C|. |7F 04         |jg      short 00405FA2
00405F9E|. |24 CE         |and   al, 0CE                         ;AL=AL AND 0CE
00405FA0|. |8801          |mov   byte ptr , al
00405FA2|> |8A01          |mov   al, byte ptr
00405FA4|. |3C 41         |cmp   al, 41                        ;接着判断AL是否处于A-F之间
00405FA6|. |7C 08         |jl      short 00405FB0
00405FA8|. |3C 46         |cmp   al, 46
00405FAA|. |7F 04         |jg      short 00405FB0
00405FAC|. |2C 42         |sub   al, 42                        ;AL=AL-42
00405FAE|. |EB 02         |jmp   short 00405FB2
00405FB0|> |2C 32         |sub   al, 32                        ;不在上面两个范围的:AL=AL-32
00405FB2|> |42            |inc   edx                           ;循环+1
00405FB3|. |8801          |mov   byte ptr , al            
00405FB5|. |83FA 10       |cmp   edx, 10                         ;
00405FB8|.^\7C D3         \jl      short 00405F8D


邮箱输入:191477631@qq.com.那么中为

位    数:0    1   2   3   4   5   6   7   8    9    10   11   12   13   14    15
计算后:FF   07   FF   02   05   05   04   01   FF   0E   3F   3F   FC   00   3D   3B


继续向下走:

00405FBF|.57            push    edi
00405FC0|.B8 06000000   mov   eax, 6                           ;EAX=6

//算法2,真码的计算过程
-----------------------------------------------------------------------------------------
00405FC8|> /8D70 FA       /lea   esi, dword ptr           ;ESI=EAX-6
00405FCB|. |8BD8          |mov   ebx, eax                        
00405FCD|. |8BCE          |mov   ecx, esi                        
00405FCF|. |83E3 0F       |and   ebx, 0F
00405FD2|. |83E1 0F       |and   ecx, 0F
00405FD5|. |8D78 01       |lea   edi, dword ptr           ;EDI=EAX+1
00405FD8|. |0FBE5C1C 28   |movsx   ebx, byte ptr       ;取第EBX位。(从第6位开始依次取,放入EBX)
00405FDD|. |0FBE540C 28   |movsx   edx, byte ptr       ;取第ECX位。(从第0位开始依次取,放入EDX)
00405FE2|. |8D48 FC       |lea   ecx, dword ptr           ;ecx=eax-4
00405FE5|. |03D6          |add   edx, esi                        ;edx=edx+esi
00405FE7|. |83E1 0F       |and   ecx, 0F                        
00405FEA|. |0FBE4C0C 28   |movsx   ecx, byte ptr       ;取第ECX位。(从第2位开始依次取放入ECX)
00405FEF|. |0FAFD1      |imul    edx, ecx                        ;EDX=EDX*ECX
00405FF2|. |8D48 FD       |lea   ecx, dword ptr          
00405FF5|. |83E1 0F       |and   ecx, 0F
00405FF8|. |0FBE4C0C 28   |movsx   ecx, byte ptr       ;取第ECX位。(从第3位开始依次取放入ECX)
00405FFD|. |03CE          |add   ecx, esi                        ;ECX=ECX+ESI
00405FFF|. |0FAFCB      |imul    ecx, ebx                        ;ECX=ECX*EBX
00406002|. |03D1          |add   edx, ecx                        ;edx=edx+ecx
00406004|. |8D48 FB       |lea   ecx, dword ptr          
00406007|. |8D58 FF       |lea   ebx, dword ptr          
0040600A|. |83E1 0F       |and   ecx, 0F
0040600D|. |83E3 0F       |and   ebx, 0F
00406010|. |0FBE4C0C 28   |movsx   ecx, byte ptr       ;取第ECX位。(从第1位开始依次取放入ECX)
00406015|. |0FBE5C1C 28   |movsx   ebx, byte ptr       ;取第EBX位。(从第5位开始依次取放入EBX)
0040601A|. |0FAFCB      |imul    ecx, ebx                        ;ecx=ecx*ebx
0040601D|. |03D1          |add   edx, ecx                        ;edx=edx+ecx
0040601F|. |8D48 FE       |lea   ecx, dword ptr          
00406022|. |8BDF          |mov   ebx, edi                        
00406024|. |83E1 0F       |and   ecx, 0F
00406027|. |83E3 0F       |and   ebx, 0F
0040602A|. |0FBE4C0C 28   |movsx   ecx, byte ptr       ;取第ECX位。(从第4位开始依次取放入ECX)
0040602F|. |0FBE5C1C 28   |movsx   ebx, byte ptr       ;取第EBX位。(从第7位开始依次取放入EBX)
00406034|. |0FAFCB      |imul    ecx, ebx                        ;ecx=ecx*ebx
00406037|. |03D1          |add   edx, ecx                        ;edx=edx+ecx
00406039|. |8D48 03       |lea   ecx, dword ptr          
0040603C|. |83E1 0F       |and   ecx, 0F
0040603F|. |8D58 07       |lea   ebx, dword ptr          
00406042|. |83E3 0F       |and   ebx, 0F
00406045|. |0FBE4C0C 28   |movsx   ecx, byte ptr       ;取第ECX位。(从第9位开始依次取放入ECX)
0040604A|. |0FBE5C1C 28   |movsx   ebx, byte ptr       ;取第EBX位。(从第13位开始依次取放入EBX)
0040604F|. |03CE          |add   ecx, esi                        ;ecx=ecx+esi(esi=0:15)
00406051|. |0FAFCB      |imul    ecx, ebx                        ;ecx=ecx*ebx
00406054|. |8D58 02       |lea   ebx, dword ptr          
00406057|. |83E3 0F       |and   ebx, 0F
0040605A|. |0FBE5C1C 28   |movsx   ebx, byte ptr       ;取第EBX位。(从第8位开始依次取放入EBX)
0040605F|. |03DE          |add   ebx, esi                        ;ebx=ebx+esi
00406061|. |8D70 04       |lea   esi, dword ptr          
00406064|. |83E6 0F       |and   esi, 0F
00406067|. |0FBE7434 28   |movsx   esi, byte ptr       ;取第ESI位。(从第10位开始依次取放入ESI)
0040606C|. |0FAFDE      |imul    ebx, esi                        ;EBX=EBX*ESI
0040606F|. |03CB          |add   ecx, ebx                        ;ECX=ECX+EBX
00406071|. |8D70 F8       |lea   esi, dword ptr          
00406074|. |8D58 06       |lea   ebx, dword ptr          
00406077|. |83E6 0F       |and   esi, 0F
0040607A|. |83E3 0F       |and   ebx, 0F
0040607D|. |0FBE7434 28   |movsx   esi, byte ptr       ;取第ESI位。(从第14位开始依次取放入ESI)
00406082|. |0FBE5C1C 28   |movsx   ebx, byte ptr       ;取第EBX位。(从第12位开始依次取放入EBX)
00406087|. |0FAFF3      |imul    esi, ebx                        ;ESI=ESI*EBX
0040608A|. |03CE          |add   ecx, esi                        ;ECX=ECX+ESI
0040608C|. |8D70 F9       |lea   esi, dword ptr          
0040608F|. |8D58 05       |lea   ebx, dword ptr          
00406092|. |83E6 0F       |and   esi, 0F
00406095|. |83E3 0F       |and   ebx, 0F
00406098|. |0FBE7434 28   |movsx   esi, byte ptr       ;取第ESI位。(从第15位开始依次取放入ESI)
0040609D|. |0FBE5C1C 28   |movsx   ebx, byte ptr       ;取第EBX位。(从第11位开始依次取放入EBX)
004060A2|. |0FAFF3      |imul    esi, ebx                        ;ESI=ESI*EBX。。。
004060A5|. |03CE          |add   ecx, esi                        ;ECX=ECX+ESI
004060A7|. |0FAFCA      |imul    ecx, edx                        ;ECX=ECX*EDX
004060AA|. |C1F9 03       |sar   ecx, 3
004060AD|. |83E1 1F       |and   ecx, 1F
004060B0|. |83F9 0A       |cmp   ecx, 0A
004060B3|. |7D 05         |jge   short 004060BA
004060B5|. |83C1 50       |add   ecx, 50
004060B8|. |EB 0D         |jmp   short 004060C7
004060BA|> |83F9 12       |cmp   ecx, 12
004060BD|. |7D 05         |jge   short 004060C4
004060BF|. |83C1 28       |add   ecx, 28
004060C2|. |EB 03         |jmp   short 004060C7
004060C4|> |83C1 2F       |add   ecx, 2F
004060C7|> |880C28      |mov   byte ptr , cl          ;注册码放入
004060CA|. |8BC7          |mov   eax, edi                        
004060CC|. |8D50 FA       |lea   edx, dword ptr          
004060CF|. |83FA 10       |cmp   edx, 10                         ;共循环16次,即注册码固定为16位。
004060D2|.^\0F8C F0FEFFFF \jl      00405FC8


-----------------------------------------------------------------------------------------
我们可以从上面代码中看出真码是对ECX的值处理得来的。
-----------------------------------------------------------------------------------------

00406098|. |0FBE7434 28   |movsx   esi, byte ptr       ;取第ESI位。
0040609D|. |0FBE5C1C 28   |movsx   ebx, byte ptr       ;取第EBX位。

ESI=ESI*EBX
ECX=ECX+ESI
ECX=ECX*EDX

-----------------------------------------------------------------------------------------

先看ECX的计算过程:

以我的第一位为例
1.
ESI=3D
EBX=FFFFFFFC
ESI=ESI*EBX=FFFFFF0C
ECX=ECX+ESI=FFFFFFC1+FFFFFF0C=FFFFFECD
2.
ESI=3B
EBX=3F
ESI=ESI*EBX=3B*3F=E85
ECX=ECX+ESI=FFFFFECD+E85=00000E52

然后看EDX的计算过程:(在上面)

EDX=EDX+ESI=FFFFFFFF+0=FFFFFFFF
1.
ECX=FFFFFFFF
EDX=EDX*ECX=00000001
2.
ECX=2
EBX=4
ECX=ECX+ESI=2
ECX=ECX*EBX=8
EDX=EDX+ECX=1+8=9
3.
ECX=07
EBX=05
ECX=ECX*EBX=23
EDX=EDX+ECX=9+23=2C
4.
ECX=05
EBX=01
ECX=ECX*EBX=5
EDX=EDX+ECX=5+2C=31

所以最终ECX:
ECX=ECX*EDX=D52*EDX=D52+31=28CB2

再进行右移三位,与上1F:
ECX=16

如果此时ECX的值小于A,ECX=ECX+50
如果此时ECX的值大于A,小于12,ECX=ECX+28
如果此时ECX的值大于12,ECX=ECX+2F

ECX=16+2F=45,转换为字符就是"E"

然后进行循环计算,共16位。结果即为注册码

【破解总结】

1.邮箱的总位数不能小于11位。
2.若邮箱位数小于16位则在邮箱后面跟上:"aaaaaaaa",若大于16位则不做处理。
3.算法第一部分——对邮箱的每一位进行计算,结果用于真码计算过程。
4.算法第二部分——其实这一部分可以固定取KEY值进行计算,主要是一个循环计算。

算法第二部分取位为循环取位。即

0→1   →2→   3→   4   →   5   →6
↑                                                                     ↓
↑                                                                      7
↑                                                                     ↓
15←14←13←12←11←10←9← 8

本人菜鸟,如有错误请大鸟们指出:keai

Hmily 发表于 2011-4-2 18:17

代码要是用上代码框就会好看很多了,很详细,加精鼓励!

yjd333 发表于 2011-4-2 18:21

排版也很好。支持

hbwazxf 发表于 2011-4-3 12:32

新手学习一下。。。

yechan1796 发表于 2011-4-9 01:29

虽然看不懂,但是好贴必须顶起来。谢谢分享。

heiketian10 发表于 2011-4-11 13:07

真用功,当时我先麻烦,就直接把邮箱限制在了16位;

B兄弟太有毅力了。。。。。

回帖支持

woaipo1323 发表于 2011-4-20 13:29

膜拜大婶。我都不懂

fhch6 发表于 2011-5-24 18:19

楼主,你真厉害,我太佩服你了!

cu629944 发表于 2011-5-24 18:21

要的就是算法分析!提高自己的实力!顶楼主了!

braintrust2003 发表于 2011-5-24 18:58

{:1_907:}楼主谦虚了,你这哪是菜鸟啊,你要是菜鸟,我就不知道咋称呼自己了。只看懂你的文章那么点点,我火候还不够
页: [1] 2
查看完整版本: Batch Image Resizer 算法分析