zaas 发表于 2010-5-26 10:33

India Ink 1.9.9.3 算法分析及第一次用delphi算法注册机

【破文标题】India Ink 1.9.9.3 算法分析及第一次用delphi算法注册机
【破文作者】zaas
【破解工具】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 , esi
3BE097DC    E8 3FFFFFFF   call    3BE09720                         ; 取得假码
3BE097E1    8D4C24 18       lea   ecx, dword ptr
3BE097E5    51            push    ecx
3BE097E6    E8 A58EFCFF   call    3BDD2690                         ; 假码长度
3BE097EB    8D5424 18       lea   edx, dword ptr
3BE097EF    8D4424 1C       lea   eax, dword ptr
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
3BDF9FC5    53            push    ebx
3BDF9FC6    85C0            test    eax, eax
3BDF9FC8    C64424 06 00    mov   byte ptr , 0
3BDF9FCD    B3 01         mov   bl, 1
3BDF9FCF    C64424 07 00    mov   byte ptr , 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                ; 假码长度
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 , 20         ; 空格检查
3BDF9FFB    74 5B         je      short 3BDFA058
3BDF9FFD    8A4C24 0F       mov   cl, byte ptr
3BDFA001    84C9            test    cl, cl
3BDFA003    74 09         je      short 3BDFA00E
3BDFA005    0FBFCE          movsx   ecx, si
3BDFA008    803C01 20       cmp   byte ptr , 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
3BDFA017    84C9            test    cl, cl
3BDFA019    75 22         jnz   short 3BDFA03D
3BDFA01B    0FBFCE          movsx   ecx, si
3BDFA01E    803C01 2D       cmp   byte ptr , 2D         ; “-”号检查
3BDFA022    75 19         jnz   short 3BDFA03D
3BDFA024    C64424 0E 01    mov   byte ptr , 1
3BDFA029    EB 2D         jmp   short 3BDFA058
3BDFA02B^ 7E D0         jle   short 3BDF9FFD
3BDFA02D    0FBFCE          movsx   ecx, si
3BDFA030    803C01 20       cmp   byte ptr , 20
3BDFA034^ 75 C7         jnz   short 3BDF9FFD
3BDFA036    C64424 0F 01    mov   byte ptr , 1
3BDFA03B    EB 1B         jmp   short 3BDFA058
3BDFA03D    0FBFCE          movsx   ecx, si
3BDFA040    8A0C01          mov   cl, byte ptr          ; 取字符
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 , cl
3BDFA054    EB 02         jmp   short 3BDFA058
3BDFA056    32DB            xor   bl, bl
3BDFA058    66:0FB608       movzx   cx, byte ptr
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 , dl
3BDFA074    81E1 FF000000   and   ecx, 0FF
3BDFA07A    84DB            test    bl, bl
3BDFA07C    C64401 01 00    mov   byte ptr , 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
3BDF8B68    50            push    eax
3BDF8B69    8B46 24         mov   eax, dword ptr
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
3BDF8B77    83C4 1C         add   esp, 1C
3BDF8B7A    3C 01         cmp   al, 1                            ; al为标志位,爆破点
3BDF8B7C    8B51 0C         mov   edx, dword ptr
3BDF8B7F    8B02            mov   eax, dword ptr
3BDF8B81    75 58         jnz   short 3BDF8BDB                   ; 关键跳,跳了就死
3BDF8B83    8B4E 20         mov   ecx, dword ptr
3BDF8B86    56            push    esi
3BDF8B87    8948 0C         mov   dword ptr , ecx
3BDF8B8A    8B56 04         mov   edx, dword ptr
3BDF8B8D    8B42 0C         mov   eax, dword ptr
3BDF8B90    8B56 24         mov   edx, dword ptr
3BDF8B93    8B08            mov   ecx, dword ptr
3BDF8B95    8951 10         mov   dword ptr , edx
3BDF8B98    8B46 04         mov   eax, dword ptr
3BDF8B9B    8B48 0C         mov   ecx, dword ptr
3BDF8B9E    8B46 28         mov   eax, dword ptr
3BDF8BA1    8B11            mov   edx, dword ptr
3BDF8BA3    8942 14         mov   dword ptr , 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;
   Forz:=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严格的限制不适应,一直在为冒号和分号而奔忙。
两组可用的注册码:

47819650
77361916

【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

156283559 发表于 2010-5-27 20:13

坐坐沙发

chinasmu 发表于 2010-5-29 09:14

学习学习

楼主贴出下载的地址啊

kankan007 发表于 2010-6-11 10:44

学习了,谢谢分享
页: [1]
查看完整版本: India Ink 1.9.9.3 算法分析及第一次用delphi算法注册机