一种比较麻烦的注册方式
【文章标题】: 一种比较麻烦的注册方式【文章作者】: 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 分析得不错! 虽然提示注册成功.但还是没有注册成功!! 给我的感觉好象有什么暗桩! 不错,学习了 8错
8错 其实是明码来的!!! TEST AL,AL 应该是标专位的比较 这个软件玩过 分析得不错!
页:
[1]
2