好友
阅读权限 40
听众
最后登录 1970-1-1
本帖最后由 Blackk 于 2011-4-2 18:26 编辑
heiketian10兄的注册机原帖地址:
http://www.52pojie.cn/thread-85075-1-1.html
【破文标题】Batch Image Resizer 算法分析
【破文作者】Blackk[PYG]
【作者邮箱】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:[0]
00405DCD |. 50 push eax
F8单步走
00405E73 |. 8379 F8 0B cmp dword ptr [ecx-8], 0B ; 邮箱总位数不小于11位
00405E77 |. 7D 08 jge short 00405E81
00405E79 |. 899D C8000000 mov dword ptr [ebp+C8], ebx
00405E7F |. EB 6D jmp short 00405EEE
00405E81 |> 51 push ecx
00405E82 |. 8D5424 14 lea edx, dword ptr [esp+14]
00405E86 |. 8BCC mov ecx, esp
00405E88 |. 896424 20 mov dword ptr [esp+20], esp
00405E8C |. 52 push edx
00405E8D |. E8 58080100 call <jmp.&MFC42.#535>
00405E92 |. 8D4424 1C lea eax, dword ptr [esp+1C]
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:[0]
00405F2D |. 50 push eax
00405F2E |. 64:8925 00000>mov dword ptr fs:[0], 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 [esp+edx+20] ; (initial cpu selection)
00405F91 |. |8A040E |mov al, byte ptr [esi+ecx] ; 循环取邮箱每位的16进制值放入AL中
00405F94 |. |3C 61 |cmp al, 61 ; 若字符处于a-f之间
00405F96 |. |8801 |mov byte ptr [ecx], 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 [ecx], al
00405FA2 |> |8A01 |mov al, byte ptr [ecx]
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 [ecx], al
00405FB5 |. |83FA 10 |cmp edx, 10 ;
00405FB8 |.^\7C D3 \jl short 00405F8D
邮箱输入:191477631@qq.com .那么[ECX]中为
位 数: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 [eax-6] ; 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 [eax+1] ; EDI=EAX+1
00405FD8 |. |0FBE5C1C 28 |movsx ebx, byte ptr [esp+ebx+28] ; 取第EBX位。(从第6位开始依次取,放入EBX)
00405FDD |. |0FBE540C 28 |movsx edx, byte ptr [esp+ecx+28] ; 取第ECX位。(从第0位开始依次取,放入EDX)
00405FE2 |. |8D48 FC |lea ecx, dword ptr [eax-4] ; ecx=eax-4
00405FE5 |. |03D6 |add edx, esi ; edx=edx+esi
00405FE7 |. |83E1 0F |and ecx, 0F
00405FEA |. |0FBE4C0C 28 |movsx ecx, byte ptr [esp+ecx+28] ; 取第ECX位。(从第2位开始依次取放入ECX)
00405FEF |. |0FAFD1 |imul edx, ecx ; EDX=EDX*ECX
00405FF2 |. |8D48 FD |lea ecx, dword ptr [eax-3]
00405FF5 |. |83E1 0F |and ecx, 0F
00405FF8 |. |0FBE4C0C 28 |movsx ecx, byte ptr [esp+ecx+28] ; 取第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 [eax-5]
00406007 |. |8D58 FF |lea ebx, dword ptr [eax-1]
0040600A |. |83E1 0F |and ecx, 0F
0040600D |. |83E3 0F |and ebx, 0F
00406010 |. |0FBE4C0C 28 |movsx ecx, byte ptr [esp+ecx+28] ; 取第ECX位。(从第1位开始依次取放入ECX)
00406015 |. |0FBE5C1C 28 |movsx ebx, byte ptr [esp+ebx+28] ; 取第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 [eax-2]
00406022 |. |8BDF |mov ebx, edi
00406024 |. |83E1 0F |and ecx, 0F
00406027 |. |83E3 0F |and ebx, 0F
0040602A |. |0FBE4C0C 28 |movsx ecx, byte ptr [esp+ecx+28] ; 取第ECX位。(从第4位开始依次取放入ECX)
0040602F |. |0FBE5C1C 28 |movsx ebx, byte ptr [esp+ebx+28] ; 取第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 [eax+3]
0040603C |. |83E1 0F |and ecx, 0F
0040603F |. |8D58 07 |lea ebx, dword ptr [eax+7]
00406042 |. |83E3 0F |and ebx, 0F
00406045 |. |0FBE4C0C 28 |movsx ecx, byte ptr [esp+ecx+28] ; 取第ECX位。(从第9位开始依次取放入ECX)
0040604A |. |0FBE5C1C 28 |movsx ebx, byte ptr [esp+ebx+28] ; 取第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 [eax+2]
00406057 |. |83E3 0F |and ebx, 0F
0040605A |. |0FBE5C1C 28 |movsx ebx, byte ptr [esp+ebx+28] ; 取第EBX位。(从第8位开始依次取放入EBX)
0040605F |. |03DE |add ebx, esi ; ebx=ebx+esi
00406061 |. |8D70 04 |lea esi, dword ptr [eax+4]
00406064 |. |83E6 0F |and esi, 0F
00406067 |. |0FBE7434 28 |movsx esi, byte ptr [esp+esi+28] ; 取第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 [eax-8]
00406074 |. |8D58 06 |lea ebx, dword ptr [eax+6]
00406077 |. |83E6 0F |and esi, 0F
0040607A |. |83E3 0F |and ebx, 0F
0040607D |. |0FBE7434 28 |movsx esi, byte ptr [esp+esi+28] ; 取第ESI位。(从第14位开始依次取放入ESI)
00406082 |. |0FBE5C1C 28 |movsx ebx, byte ptr [esp+ebx+28] ; 取第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 [eax-7]
0040608F |. |8D58 05 |lea ebx, dword ptr [eax+5]
00406092 |. |83E6 0F |and esi, 0F
00406095 |. |83E3 0F |and ebx, 0F
00406098 |. |0FBE7434 28 |movsx esi, byte ptr [esp+esi+28] ; 取第ESI位。(从第15位开始依次取放入ESI)
0040609D |. |0FBE5C1C 28 |movsx ebx, byte ptr [esp+ebx+28] ; 取第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 [eax+ebp], cl ; 注册码放入[EAX+EBP]
004060CA |. |8BC7 |mov eax, edi
004060CC |. |8D50 FA |lea edx, dword ptr [eax-6]
004060CF |. |83FA 10 |cmp edx, 10 ; 共循环16次,即注册码固定为16位。
004060D2 |.^\0F8C F0FEFFFF \jl 00405FC8
-----------------------------------------------------------------------------------------
我们可以从上面代码中看出真码是对ECX的值处理得来的。
-----------------------------------------------------------------------------------------
00406098 |. |0FBE7434 28 |movsx esi, byte ptr [esp+esi+28] ; 取第ESI位。
0040609D |. |0FBE5C1C 28 |movsx ebx, byte ptr [esp+ebx+28] ; 取第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
本人菜鸟,如有错误请大鸟们指出
免费评分
查看全部评分