首页
社区
课程
招聘
一种比较麻烦的注册方式
发表于: 2006-7-13 19:26 6664

一种比较麻烦的注册方式

2006-7-13 19:26
6664
【文章标题】: 一种比较麻烦的注册方式
【文章作者】: 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,找到关键处,如下:
  0058D757  PUSH Unpacked.0058D934     错误:〖注册姓名〗\n
  0058D767  PUSH Unpacked.0058D95C     长度太短,无法注册!
  0058D7BD  PUSH Unpacked.0058D980     错误:〖注册码〗\n
  0058D7CD  PUSH Unpacked.0058D99C     长度不符,无法注册!
  0058D8B5  MOV EAX,Unpacked.0058D9BC  成功注册!感谢您的支持!
  0058D8CC  MOV 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:[EBX+32C]
  0058D762  |.  68 50D95800   PUSH Unpacked.0058D950                   ;  \n
  0058D767  |.  68 5CD95800   PUSH Unpacked.0058D95C                   ;  长度太短,无法注册!
  0058D76C  |.  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]
  0058D76F  |.  BA 04000000   MOV EDX,4
  0058D774  |.  E8 8378E7FF   CALL Unpacked.00404FFC
  0058D779  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]             ; |
  0058D77C  |.  66:8B0D 74D95>MOV CX,WORD PTR DS:[58D974]              ; |
  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:[EBP-10]
  0058D792  |.  8B83 10030000 MOV EAX,DWORD PTR DS:[EBX+310]            
  0058D798  |.  E8 2386EEFF   CALL Unpacked.00475DC0
  0058D79D  |.  8B55 F0       MOV EDX,DWORD PTR SS:[EBP-10]
  0058D7A0  |.  8D83 30030000 LEA EAX,DWORD PTR DS:[EBX+330]
  0058D7A6  |.  E8 2575E7FF   CALL Unpacked.00404CD0
  0058D7AB  |.  8B83 30030000 MOV EAX,DWORD PTR DS:[EBX+330]
  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:[EBX+330]
  0058D7C8  |.  68 50D95800   PUSH Unpacked.0058D950                   ;  \n
  0058D7CD  |.  68 9CD95800   PUSH Unpacked.0058D99C                   ;  长度不符,无法注册!
  0058D7D2  |.  8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]
  0058D7D5  |.  BA 04000000   MOV EDX,4
  0058D7DA  |.  E8 1D78E7FF   CALL Unpacked.00404FFC
  0058D7DF  |.  8B45 EC       MOV EAX,DWORD PTR SS:[EBP-14]            ; |
  0058D7E2  |.  66:8B0D 74D95>MOV CX,WORD PTR DS:[58D974]              ; |
  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:[EBP-11C]
  
  
  再看看后面的:
  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:[58D974]              ; |
  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:[58D974]              ; |
  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了
  
  在注册处填入:jjdg  1234567891234567891234(凑够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 010164BC  ASCII"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:[EBX+330]           ;  把输入的注册码放到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:[EBX+32C]           ;  
  发现,寄存器里面的EDX的值发生了变化,
  EDX 00FD4428 ASCII "55661-640-0059266-23171",这个是不是就是真正的注册码呢?带进程序试试,不是!我尝试了几个不同的用户名都跟到了这个值,估计有名堂在里面!
  继续往下,
  0058D54C  |.  E8 7B15F7FF   CALL Unpacked.004FEACC
  0058D551  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
  0058D554  |.  50            PUSH EAX
  0058D555  |.  8B83 30030000 MOV EAX,DWORD PTR DS:[EBX+330]
  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的文件,用记事本打开查看,内容如下:
  [LIC]
  SN=ooba                         | 这个就是jjdg经过处理后的注册名
  SC=47524;1<9<231<41>43123       | 这个就是正确的注册码处理后的样子,同样是22位哦!但是,直接用它注册还是不行哦!关于程序是如何处理的那段代码,不好意思,
  看不懂,所以就不理它,只好改跳转了!
  
  可见,一旦注册成功,程序会生成一个和程序同名的lic文件。
  这样,把Unpacked.lic改名为nEOiMAGING.lic不就可以了吗?
  
  这个软件没有追出注册码,也没有看懂其对注册名和注册码的算法实在是遗憾!
  
  如果有高手可以看看给我这样的菜鸟讲讲的话就太好了!
  
  不过,菜鸟也可以都来试试!
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年07月13日 18:27:14

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 434
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
最近的破解很让我失望!要找出一个软件的注册码,我发现几乎是不可能的,现在的软件,稍微有点保护的都是;注册码是看不见的;反汇编的;反od的;等等.我在想,真正的高手究竟可以到达那个境界呢?
2006-7-13 19:55
0
雪    币: 233
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
都这份上了  应该再追进去看看
可以用kanal查查有没有什么经典算法。
2006-7-13 20:52
0
雪    币: 241
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 okdodo 发布
都这份上了 应该再追进去看看
可以用kanal查查有没有什么经典算法。

不好意思,问一句:kanal是什么啊?
2006-7-14 08:57
0
雪    币: 44229
活跃值: (19960)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
最初由 jjdg 发布
不好意思,问一句:kanal是什么啊?


Peid的一个插件,默认就有。
2006-7-14 09:04
0
雪    币: 151
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
test al,al = cmp al,0
一般的函数都是以eax作为返回值,这句话可以看成对成功失败的判断
2006-7-14 09:46
0
雪    币: 151
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
EDX 00FD4428 ASCII "55661-640-0059266-23171",这个是不是就是真正的注册码呢?带进程序试试,不是!我尝试了几个不同的用户名都跟到了这个值,估计有名堂在里面!

这个是你的机器码,在注册的时候看到的是它的加密结果

继续往下,
0058D54C |. E8 7B15F7FF CALL Unpacked.004FEACC
。。。。。。
经过上面这段代码,jjdg变成了ooba

这里是在加密你的用户名,其算法和加密机器码一样


0058D554 |. 50 PUSH EAX
0058D555 |. 8B83 30030000 MOV EAX,DWORD PTR DS:[EBX+330]
0058D55B |. B9 04000000 MOV ECX,4
0058D560 |. BA 13000000 MOV EDX,13

就要到关键地方了,这里是取注册码的后4位XXXX,接下来的运算会得到一个4位数,它和XXXX比较,相同就可喜可贺了

你都已经跟到关键点了呢
2006-7-14 10:33
0
雪    币: 241
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最初由 请哥慢捂 发布
test al,al = cmp al,0
一般的函数都是以eax作为返回值,这句话可以看成对成功失败的判断

谢谢你的帮助!
2006-7-14 11:41
0
雪    币: 241
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
最初由 kanxue 发布
Peid的一个插件,默认就有。

你好!
我的peid是Peid_0.94的!
就只有一个文件,481k大,没有看见它的插件啊!
2006-7-14 11:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
最初由 jjdg 发布
你好!
我的peid是Peid_0.94的!
就只有一个文件,481k大,没有看见它的插件啊!


你文件的根目录中难道没有plugins这个目录?
2006-7-14 12:58
0
雪    币: 241
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
最初由 jshx 发布
你文件的根目录中难道没有plugins这个目录?

没有
我的peid0.94里面就一个文件
2006-7-14 21:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
0058D5CF  |.  8B45 F8       mov     eax, [ebp-8] '最后四位假码位置
0058D5D2  |.  8B55 F4       mov     edx, [ebp-C]‘最后四位真码位置
0058D5D5  |.  E8 AE7AE7FF   call    00405088
我发现这个软件只判断最后4位,就可以了。

2006-7-15 19:59
0
雪    币: 3515
活跃值: (4042)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
13
楼上的都错了。

1、那个带640的,是你安装的系统的序列号比如是WINXP SP2的。

2、oobe不是加密后的用户名而是xp激活的那个oobe

3、最后4位比较是假注册,还有其他位的比较的。
2006-7-15 20:49
0
游客
登录 | 注册 方可回帖
返回
//