- UID
- 59317
注册时间2009-1-28
阅读权限40
最后登录1970-1-1
独步武林
TA的每日心情 | 无聊 2024-1-15 22:57 |
---|
签到天数: 3 天 [LV.2]偶尔看看I
|
【破文标题】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严格的限制不适应,一直在为冒号和分号而奔忙。
两组可用的注册码:
【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢! |
评分
-
查看全部评分
|