jjdg 发表于 2006-7-13 19:29:44

一种比较麻烦的注册方式

【文章标题】: 一种比较麻烦的注册方式
【文章作者】: jjdg
【软件名称】: 光影魔术手 V0.21 简体中文版
【软件大小】: 1650k
【下载地址】: 自己搜索下载
【加壳方式】: ASPack 2.12 -> Alexey Solodovnikov
【使用工具】: OD PEID ASPACKDIE
【操作平台】: XP
【软件介绍】: “nEO iMAGING”〖光影魔术手〗是一个对数码照片画
【作者声明】: 只是感兴趣,没有其他目的。水平有限,失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
这个软件的注册方式个人感觉比较麻烦,而且,它对注册名和注册码的处理没看懂,所以,基本上没有追到注册码,不过,发现在注册成功以后,程序会自动产生一个lic文件,
用记事本打开,可以看见,里面的内容均为乱码,估计是程序对注册码做了处理以后保存在lic文件里面,在程序启动的时候检测其内容,如果正确就不出现“未注册”等
提示,下面就开始生成lic的过程吧!

安装后找到该程序,用Peid查看,ASPack 2.12 -> Alexey Solodovnikov,ok,用AspackDie1.41搞定它,脱壳完成。

直接用OD1.10打开,cpu窗口右击,超级字符串参考-->ASCII,找到关键处,如下:
0058D757PUSH Unpacked.0058D934   错误:〖注册姓名〗\n
0058D767PUSH Unpacked.0058D95C   长度太短,无法注册!
0058D7BDPUSH Unpacked.0058D980   错误:〖注册码〗\n
0058D7CDPUSH Unpacked.0058D99C   长度不符,无法注册!
0058D8B5MOV EAX,Unpacked.0058D9BC成功注册!感谢您的支持!
0058D8CCMOV EAX,Unpacked.0058D9E0注册失败:注册码无效!

好,依次看看:
0058D750|.83F8 04       CMP EAX,4                     <--这里应该是对注册名的长度做个比较| 可见,只要输入的注册名多于4个字符即可!
0058D753|.7D 3A         JGE SHORT Unpacked.0058D78F   <--大于等于就跳过下面这个错误对话框|
0058D755|.6A 00         PUSH 0
0058D757|.68 34D95800   PUSH Unpacked.0058D934                   ;错误:〖注册姓名〗\n
0058D75C|.FFB3 2C030000 PUSH DWORD PTR DS:
0058D762|.68 50D95800   PUSH Unpacked.0058D950                   ;\n
0058D767|.68 5CD95800   PUSH Unpacked.0058D95C                   ;长度太短,无法注册!
0058D76C|.8D45 F4       LEA EAX,DWORD PTR SS:
0058D76F|.BA 04000000   MOV EDX,4
0058D774|.E8 8378E7FF   CALL Unpacked.00404FFC
0058D779|.8B45 F4       MOV EAX,DWORD PTR SS:             ; |
0058D77C|.66:8B0D 74D95>MOV CX,WORD PTR DS:            ; |
0058D783|.B2 01         MOV DL,1                                 ; |
0058D785|.E8 D292EAFF   CALL Unpacked.00436A5C                   ; \Unpacked.00436A5C
0058D78A|.E9 47010000   JMP Unpacked.0058D8D6                     跳就挂


然后来看下面
0058D78F|> \8D55 F0       LEA EDX,DWORD PTR SS:
0058D792|.8B83 10030000 MOV EAX,DWORD PTR DS:            
0058D798|.E8 2386EEFF   CALL Unpacked.00475DC0
0058D79D|.8B55 F0       MOV EDX,DWORD PTR SS:
0058D7A0|.8D83 30030000 LEA EAX,DWORD PTR DS:
0058D7A6|.E8 2575E7FF   CALL Unpacked.00404CD0
0058D7AB|.8B83 30030000 MOV EAX,DWORD PTR DS:
0058D7B1|.E8 8677E7FF   CALL Unpacked.00404F3C
0058D7B6|.83F8 16       CMP EAX,16                                 |这里和上面一样也是做比较,应该是对注册码的长度做的,应该不小于22个字符
0058D7B9      74 3A         JE SHORT Unpacked.0058D7F5               |如果注册码长度正确就跳过下面的错误对话框!
0058D7BB|.6A 00         PUSH 0
0058D7BD|.68 80D95800   PUSH Unpacked.0058D980                   ;错误:〖注册码〗\n
0058D7C2|.FFB3 30030000 PUSH DWORD PTR DS:
0058D7C8|.68 50D95800   PUSH Unpacked.0058D950                   ;\n
0058D7CD|.68 9CD95800   PUSH Unpacked.0058D99C                   ;长度不符,无法注册!
0058D7D2|.8D45 EC       LEA EAX,DWORD PTR SS:
0058D7D5|.BA 04000000   MOV EDX,4
0058D7DA|.E8 1D78E7FF   CALL Unpacked.00404FFC
0058D7DF|.8B45 EC       MOV EAX,DWORD PTR SS:            ; |
0058D7E2|.66:8B0D 74D95>MOV CX,WORD PTR DS:            ; |
0058D7E9|.B2 01         MOV DL,1                                 ; |
0058D7EB|.E8 6C92EAFF   CALL Unpacked.00436A5C                   ; \Unpacked.00436A5C
0058D7F0|. /E9 E1000000   JMP Unpacked.0058D8D6                     跳就挂
0058D7F5|> |8BC3          MOV EAX,EBX                                 | 下断点!
0058D7F7|. |E8 FCFCFFFF   CALL Unpacked.0058D4F8                   ;| 可见,这个call里面就是注册码的校验部分了!
0058D7FC|. |84C0          TEST AL,AL                                  | 实际上,对同一个AL做test到底什么意思,我也不是很明白,有知道的请赐教!
0058D7FE   |0F84 BD000000 JE Unpacked.0058D8C1                     ;| 跳到注册失败
0058D804|. |8BC3          MOV EAX,EBX
0058D806|. |E8 E9FBFFFF   CALL Unpacked.0058D3F4
0058D80B|. |33F6          XOR ESI,ESI
0058D80D|> |8D85 E4FEFFFF /LEA EAX,DWORD PTR SS:


再看看后面的:
0058D8A1|.B2 01         MOV DL,1
0058D8A3|.8BC3          MOV EAX,EBX
0058D8A5|.E8 3EF9FFFF   CALL Unpacked.0058D1E8
0058D8AA|.6A 00         PUSH 0                                 ; /Arg1 = 00000000
0058D8AC|.66:8B0D 74D95>MOV CX,WORD PTR DS:            ; |
0058D8B3|.B2 02         MOV DL,2                                 ; |
0058D8B5|.B8 BCD95800   MOV EAX,Unpacked.0058D9BC                ; |成功注册!感谢您的支持!
0058D8BA|.E8 9D91EAFF   CALL Unpacked.00436A5C                   ; \Unpacked.00436A5C    |这个call应该是调用一个对话框来显示上面的消息的,不用管!
0058D8BF|.EB 15         JMP SHORT Unpacked.0058D8D6
0058D8C1|>6A 00         PUSH 0                                 ; /Arg1 = 00000000|注意啊:这个跳转来自 0058D7FE
0058D8C3|.66:8B0D 74D95>MOV CX,WORD PTR DS:            ; |
0058D8CA|.B2 01         MOV DL,1                                 ; |
0058D8CC|.B8 E0D95800   MOV EAX,Unpacked.0058D9E0                ; |注册失败:注册码无效!
0058D8D1|.E8 8691EAFF   CALL Unpacked.00436A5C                   ; \Unpacked.00436A5C
0058D8D6|>33C0          XOR EAX,EAX

好了,代码就看到这里!开始f9了

在注册处填入:jjdg1234567891234567891234(凑够22位即可)

先用f8走一下看看流程如何,
程序停在   0058D7F5|> \8BC3          MOV EAX,EBX
按一下f8,寄存器和堆栈都没有什么变化,
f8到
0058D7FE   /0F84 BD000000 JE Unpacked.0058D8C1      ;
的时候,堆栈显示:跳转已实现
0058D8C1=Unpacked.0058D8C1,

看来,前面那个call里面有名堂,进去看看,
重来,
f7跟进0058D7F7|.E8 FCFCFFFF   CALL Unpacked.0058D4F8       ;

f8来到0058D51A|.E8 1D7AE7FF   CALL Unpacked.00404F3C,可以看见,寄存器里面EAX 010164BCASCII"jjdg"哦
这个call的作用是对EAX中注册姓名取长度,然后将长度值放到EAX里面,

0058D51A|.E8 1D7AE7FF   CALL Unpacked.00404F3C                  |这个call的作用就是取字符串的长度
0058D51F|.83F8 04       CMP EAX,4                              ;比较注册姓名长度
0058D522|.7C 10         JL SHORT Unpacked.0058D534                |如果不足4位就跳走挂掉
0058D524|.8B83 30030000 MOV EAX,DWORD PTR DS:         ;把输入的注册码放到EAX里面
0058D52A|.E8 0D7AE7FF   CALL Unpacked.00404F3C
0058D52F|.83F8 16       CMP EAX,16                               ;比较注册码长度
0058D532|.74 07         JE SHORT Unpacked.0058D53B                |注册码长度正确就跳到验证处
0058D534|>33C0          XOR EAX,EAX
0058D536|.E9 A2000000   JMP Unpacked.0058D5DD                     |跳到挂掉处

f8来到下面:
0058D546|.8B83 2C030000 MOV EAX,DWORD PTR DS:         ;
发现,寄存器里面的EDX的值发生了变化,
EDX 00FD4428 ASCII "55661-640-0059266-23171",这个是不是就是真正的注册码呢?带进程序试试,不是!我尝试了几个不同的用户名都跟到了这个值,估计有名堂在里面!
继续往下,
0058D54C|.E8 7B15F7FF   CALL Unpacked.004FEACC
0058D551|.8D45 F8       LEA EAX,DWORD PTR SS:
0058D554|.50            PUSH EAX
0058D555|.8B83 30030000 MOV EAX,DWORD PTR DS:
0058D55B|.B9 04000000   MOV ECX,4
0058D560|.BA 13000000   MOV EDX,13
经过上面这段代码,jjdg变成了ooba

一路f8来到,
0058D7FE   /0F84 BD000000 JE Unpacked.0058D8C1                     ;跳到失败
改je为jne,
然后,f8来到
0058D8BA|.E8 9D91EAFF   CALL Unpacked.00436A5C                   ; \Unpacked.00436A5C
程序弹出对话框,显示注册成功!
打开C:\Program Files\nEO iMAGING,
你会发现,多了一个名为Unpacked.lic的文件,用记事本打开查看,内容如下:

SN=ooba                                             | 这个就是jjdg经过处理后的注册名
SC=47524;1<9<231<41>43123       | 这个就是正确的注册码处理后的样子,同样是22位哦!但是,直接用它注册还是不行哦!关于程序是如何处理的那段代码,不好意思,看不懂,所以就不理它,只好改跳转了!

可见,一旦注册成功,程序会生成一个和程序同名的lic文件。
这样,把Unpacked.lic改名为nEOiMAGING.lic不就可以了吗?

这个软件没有追出注册码,也没有看懂其对注册名和注册码的算法实在是遗憾!

如果有高手可以看看给我这样的菜鸟讲讲的话就太好了!

不过,菜鸟也可以都来试试!

                                                       2006年07月13日 18:27:14

绝恋风尘 发表于 2006-7-13 21:14:02

分析得不错!

bfqyygy 发表于 2006-7-13 22:18:05

虽然提示注册成功.但还是没有注册成功!!

hanxiucao 发表于 2006-7-16 02:24:43

给我的感觉好象有什么暗桩!

战佛 发表于 2006-7-18 02:24:12

不错,学习了

ynboyinkm 发表于 2006-7-26 23:22:29

8错
8错

冷血书生 发表于 2006-7-27 14:28:34

其实是明码来的!!!

爱我 发表于 2006-7-27 14:28:38

TEST AL,AL   应该是标专位的比较

joker27 发表于 2006-8-3 16:57:42

这个软件玩过

沙粒 发表于 2006-8-4 12:26:23

分析得不错!
页: [1] 2
查看完整版本: 一种比较麻烦的注册方式