好友
阅读权限 40
听众
最后登录 1970-1-1
zaas
发表于 2010-5-26 10:33
【破文标题】India Ink 1.9.9.3 算法分析及第一次用delphi算法注册机
【破文作者】zaas[PYG]
【破解 工具】OllyICE,PEiD v0.94
【破解平台】WinXP
【更新时间】2010-5-24
【软件类别】国外软件/图像处理
【软件语言】英文
【应用平台】WinXP/2000/2003/Vista
【软件性质】共享(收费)软件
【软件大小】2373KB
【保护方式】注册码
【软件简介】photoshop插件。India Ink是一个彩色图片转换器,是不寻常的黑与白半色调开发插件。或使用它的颜色模式,产生奇怪的蚀刻效果。
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享
【破解说明】第一次破解photoshop插件;该公司的插件算法都类似;第一次学习用delphi写注册机。
--------------------------------------------------------------
【破解内容】
--------------------------------------------------------------
**************************************************************
photoshop插件实际就是个dll文件。
**************************************************************
启动photoshop,OD附加。输入假码,下getwindowtexta断点,确定。成功断下:3BE097D8 897424 14 mov dword ptr [esp+14], esi
3BE097DC E8 3FFFFFFF call 3BE09720 ; 取得假码
3BE097E1 8D4C24 18 lea ecx, dword ptr [esp+18]
3BE097E5 51 push ecx
3BE097E6 E8 A58EFCFF call 3BDD2690 ; 假码长度
3BE097EB 8D5424 18 lea edx, dword ptr [esp+18]
3BE097EF 8D4424 1C lea eax, dword ptr [esp+1C]
3BE097F3 52 push edx
3BE097F4 50 push eax
3BE097F5 E8 C607FFFF call 3BDF9FC0 ; 假码字符串转数值
3BE097FA 83C4 18 add esp, 18
3BE097FD 84C0 test al, al
注册名假码都读出来了,跟进call 3BDF9FC0看看做了什么。3BDF9FC0 51 push ecx
3BDF9FC1 8B4424 08 mov eax, dword ptr [esp+8]
3BDF9FC5 53 push ebx
3BDF9FC6 85C0 test eax, eax
3BDF9FC8 C64424 06 00 mov byte ptr [esp+6], 0
3BDF9FCD B3 01 mov bl, 1
3BDF9FCF C64424 07 00 mov byte ptr [esp+7], 0
3BDF9FD4 75 05 jnz short 3BDF9FDB
3BDF9FD6 32C0 xor al, al
3BDF9FD8 5B pop ebx
3BDF9FD9 59 pop ecx
3BDF9FDA C3 retn
3BDF9FDB 8A08 mov cl, byte ptr [eax] ; 假码长度
3BDF9FDD 33D2 xor edx, edx
3BDF9FDF 56 push esi
3BDF9FE0 80F9 01 cmp cl, 1
3BDF9FE3 BE 01000000 mov esi, 1
3BDF9FE8 72 7E jb short 3BDFA068
3BDF9FEA 57 push edi
3BDF9FEB 84DB test bl, bl
3BDF9FED 74 73 je short 3BDFA062
3BDF9FEF 66:85D2 test dx, dx
3BDF9FF2 75 37 jnz short 3BDFA02B
3BDF9FF4 0FBFCE movsx ecx, si
3BDF9FF7 803C01 20 cmp byte ptr [ecx+eax], 20 ; 空格检查
3BDF9FFB 74 5B je short 3BDFA058
3BDF9FFD 8A4C24 0F mov cl, byte ptr [esp+F]
3BDFA001 84C9 test cl, cl
3BDFA003 74 09 je short 3BDFA00E
3BDFA005 0FBFCE movsx ecx, si
3BDFA008 803C01 20 cmp byte ptr [ecx+eax], 20
3BDFA00C 75 48 jnz short 3BDFA056
3BDFA00E 66:85D2 test dx, dx
3BDFA011 75 2A jnz short 3BDFA03D
3BDFA013 8A4C24 0E mov cl, byte ptr [esp+E]
3BDFA017 84C9 test cl, cl
3BDFA019 75 22 jnz short 3BDFA03D
3BDFA01B 0FBFCE movsx ecx, si
3BDFA01E 803C01 2D cmp byte ptr [ecx+eax], 2D ; “-”号检查
3BDFA022 75 19 jnz short 3BDFA03D
3BDFA024 C64424 0E 01 mov byte ptr [esp+E], 1
3BDFA029 EB 2D jmp short 3BDFA058
3BDFA02B ^ 7E D0 jle short 3BDF9FFD
3BDFA02D 0FBFCE movsx ecx, si
3BDFA030 803C01 20 cmp byte ptr [ecx+eax], 20
3BDFA034 ^ 75 C7 jnz short 3BDF9FFD
3BDFA036 C64424 0F 01 mov byte ptr [esp+F], 1
3BDFA03B EB 1B jmp short 3BDFA058
3BDFA03D 0FBFCE movsx ecx, si
3BDFA040 8A0C01 mov cl, byte ptr [ecx+eax] ; 取字符
3BDFA043 80F9 30 cmp cl, 30
3BDFA046 72 0E jb short 3BDFA056
3BDFA048 80F9 39 cmp cl, 39
3BDFA04B 77 09 ja short 3BDFA056 ; 是不是在0-9之间
3BDFA04D 42 inc edx
3BDFA04E 0FBFFA movsx edi, dx
3BDFA051 880C07 mov byte ptr [edi+eax], cl
3BDFA054 EB 02 jmp short 3BDFA058
3BDFA056 32DB xor bl, bl
3BDFA058 66:0FB608 movzx cx, byte ptr [eax]
3BDFA05C 46 inc esi
3BDFA05D 66:3BF1 cmp si, cx
3BDFA060 ^ 7E 89 jle short 3BDF9FEB ; 过滤掉非法字符
3BDFA062 66:85D2 test dx, dx
3BDFA065 5F pop edi
3BDFA066 75 08 jnz short 3BDFA070
3BDFA068 32DB xor bl, bl
3BDFA06A 5E pop esi
3BDFA06B 8AC3 mov al, bl
3BDFA06D 5B pop ebx
3BDFA06E 59 pop ecx
3BDFA06F C3 retn
3BDFA070 8BCA mov ecx, edx
3BDFA072 8810 mov byte ptr [eax], dl
3BDFA074 81E1 FF000000 and ecx, 0FF
3BDFA07A 84DB test bl, bl
3BDFA07C C64401 01 00 mov byte ptr [ecx+eax+1], 0
3BDFA081 74 27 je short 3BDFA0AA
3BDFA083 66:83FA 0A cmp dx, 0A ; 假码长度是否大于10位
3BDFA087 7F 0C jg short 3BDFA095
3BDFA089 40 inc eax
3BDFA08A 50 push eax
3BDFA08B E8 62FE0000 call <jmp.&MSVCRT.atol> ; 字符串转数值
软件比较人性化,输入的如果有非数字的其他字符,则过滤掉。然后做完数值转16进制。继续返回,来到:3BDF8B65 8B56 28 mov edx, dword ptr [esi+28]
3BDF8B68 50 push eax
3BDF8B69 8B46 24 mov eax, dword ptr [esi+24]
3BDF8B6C 52 push edx
3BDF8B6D 50 push eax
3BDF8B6E 51 push ecx
3BDF8B6F E8 AC010000 call 3BDF8D20 ; 关键call
3BDF8B74 8B4E 04 mov ecx, dword ptr [esi+4]
3BDF8B77 83C4 1C add esp, 1C
3BDF8B7A 3C 01 cmp al, 1 ; al为标志位,爆破点
3BDF8B7C 8B51 0C mov edx, dword ptr [ecx+C]
3BDF8B7F 8B02 mov eax, dword ptr [edx]
3BDF8B81 75 58 jnz short 3BDF8BDB ; 关键跳,跳了就死
3BDF8B83 8B4E 20 mov ecx, dword ptr [esi+20]
3BDF8B86 56 push esi
3BDF8B87 8948 0C mov dword ptr [eax+C], ecx
3BDF8B8A 8B56 04 mov edx, dword ptr [esi+4]
3BDF8B8D 8B42 0C mov eax, dword ptr [edx+C]
3BDF8B90 8B56 24 mov edx, dword ptr [esi+24]
3BDF8B93 8B08 mov ecx, dword ptr [eax]
3BDF8B95 8951 10 mov dword ptr [ecx+10], edx
3BDF8B98 8B46 04 mov eax, dword ptr [esi+4]
3BDF8B9B 8B48 0C mov ecx, dword ptr [eax+C]
3BDF8B9E 8B46 28 mov eax, dword ptr [esi+28]
3BDF8BA1 8B11 mov edx, dword ptr [ecx]
3BDF8BA3 8942 14 mov dword ptr [edx+14], eax
3BDF8BA6 E8 65B7FDFF call 3BDD4310
3BDF8BAB 68 1C59E23B push 3BE2591C ; ASCII "***"
3BDF8BB0 68 1859E23B push 3BE25918 ; ASCII "**"
3BDF8BB5 68 1459E23B push 3BE25914
3BDF8BBA 68 50D0E13B push 3BE1D050 ; ASCII "India Ink"
3BDF8BBF E8 4C89FEFF call 3BDE1510
3BDF8BC4 68 F858E23B push 3BE258F8 ; ASCII "THANKYOU",注册成功提示
3BDF8BC9 E8 A28CFEFF call 3BDE1870
有标志位比较,显然可以跟进关键call看看算法了。核心算法只有寥寥几句。3BDF8CEE 81FE 2B0A6F61 cmp esi, 616F0A2B ; esi为假码数值
3BDF8CF4 7E 0C jle short 3BDF8D02 ; 应小于等于0x616F0A2B
3BDF8CF6 81FE 320A6F61 cmp esi, 616F0A32
3BDF8CFC 7D 04 jge short 3BDF8D02
3BDF8CFE 32C0 xor al, al
3BDF8D00 5E pop esi
3BDF8D01 C3 retn
3BDF8D02 8BCE mov ecx, esi ; 假码数值
3BDF8D04 8BC6 mov eax, esi
3BDF8D06 83E1 1F and ecx, 1F ; and 0x1F
3BDF8D09 5E pop esi
3BDF8D0A 99 cdq
3BDF8D0B 81C1 0D400000 add ecx, 400D ; 结果+0x400d
3BDF8D11 F7F9 idiv ecx ; 假码数值除以上边的数值
3BDF8D13 81FA A6000000 cmp edx, 0A6 ; 余数应等于0xA6
3BDF8D19 0F94C0 sete al
3BDF8D1C C3 retn
【算法总结】算法可以用一个方程式描述:
X mod((X and 1F)+0x400D)=0xA6
就这么简单。
写这篇破文的目的之一也是想用用Delphi。这个软件的算法相对简单,适合用来实践中学习。
以前只会用VB写注册机,看了两天delphi的书,觉得和VB比较相像,但功能比VB强大,一边google一边写,权作练习吧。
Delphi代码如下:procedure TForm1.BitBtn1Click(Sender: TObject);
Var
x,y,z:longint;
begin
Randomize ;
x:=random(100)*1017010;
For z:=x To (x+1000000) do
Begin
y:=z and 31;
if (z mod (y+16397))=166 then
Begin
Edit1.Text:=IntToStr(z);
Break;
end;
end;
end;
end.
想了好久没想到完美的转换方程式的方法,最后干脆用枚举来解决了。软件对注册码的最小值有限制,有兴趣的可以自己跟一下。
代码也很短,写的也很快,但是要命的是对delphi严格的限制不适应,一直在为冒号和分号而奔忙。
两组可用的注册码:【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!