• 标 题:疯狂注册表v1.0算法分析
  • 作 者:poppig
  • 时 间: 2004-1-17 周六, 下午2:14
  • 链 接:http://bbs.pediy.com

《疯狂注册表v1.0 Build 001》,是一款能够对注册表操作的软件,更体贴人的地方
是它可以告诉你如何操作,而且还可以生成修改项安装包,让你可以更加方便的使
用,而且它还提供了手工的修改,不仅包括Reg文件还包括INI文件.当然如果你感
兴趣的话可以到以下地址去下载(好像说明中没有提到主页哦):
http://www.softreg.com.cn/shareware_view.asp?id=/4D4FF8C0-471D-429C-AB17-116E06DC2C69/
  首先我们先脱掉它UPx的壳,然后开始行动吧!说起注册,这个软件有几个后门!
所以要注意啊!(不过这是破解完了的后话了^_^)(脱壳以后程序有2006KB)
  Let Begin:
注册名:dengkeng[DFCG]
注册码:1234567890abcdefghijklmno
软件序列号是:0C342D4FA2A61B2D5C50E838EC

  点击"确定",它会告诉你需要重新启动以便验证是否正确,这也是许多人不想破
解重起校验的软件的原因.开始我用RegShot备份了一下,然后在扫描,果然注册信
息生成在HKEY_LOCAL_MACHINESoftwareFolieRegReg下,可是这是你输入满足要
求才写入注册表,如果不满足要求则不写入.刚开始输入的注册码不满25位,它就根
本不写入注册表.我开始就上了当,然后用Filemon.exe进行跟踪,发现它在运行的
时候生成了一个FolieReg.ldb文件,而关闭程序则删除它.开始还以为是注册信息.
浪费了一些时间,后来才发现它不是什么注册信息.(可能是什么权限之类的?)
  所以只好硬着头皮跟踪了:


00551095   . 8A12           MOV DL,BYTE PTR DS:[EDX] ;取注册码的第1位
00551097   . 8850 01        MOV BYTE PTR DS:[EAX+1],DL
0055109A   . C600 01        MOV BYTE PTR DS:[EAX],1
0055109D   . 8D55 B8        LEA EDX,DWORD PTR SS:[EBP-48]
005510A0   . 8D45 B4        LEA EAX,DWORD PTR SS:[EBP-4C]
005510A3   . E8 D81EEBFF    CALL FOLIEREG.00402F80
005510A8   . 8D45 B0        LEA EAX,DWORD PTR SS:[EBP-50]
005510AB   . 8B55 F8        MOV EDX,DWORD PTR SS:[EBP-8]
005510AE   . 8A52 18        MOV DL,BYTE PTR DS:[EDX+18] ;取注册码的25位
005510B1   . 8850 01        MOV BYTE PTR DS:[EAX+1],DL
005510B4   . C600 01        MOV BYTE PTR DS:[EAX],1
005510B7   . 8D55 B0        LEA EDX,DWORD PTR SS:[EBP-50]
005510BA   . 8D45 B4        LEA EAX,DWORD PTR SS:[EBP-4C]
005510BD   . B1 02          MOV CL,2
005510BF   . E8 8C1EEBFF    CALL FOLIEREG.00402F50 ;两个字符连接起来
005510C4   . 8D45 B4        LEA EAX,DWORD PTR SS:[EBP-4C]
005510C7   . 50             PUSH EAX
005510C8   . 8D45 B0        LEA EAX,DWORD PTR SS:[EBP-50]
005510CB   . 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C] ;密码表为"AAF03FF95FB68665"
005510CE   . 8A52 06        MOV DL,BYTE PTR DS:[EDX+6] ;取密码表中的第7个字符
005510D1   . 8850 01        MOV BYTE PTR DS:[EAX+1],DL
005510D4   . C600 01        MOV BYTE PTR DS:[EAX],1
005510D7   . 8D55 B0        LEA EDX,DWORD PTR SS:[EBP-50]
005510DA   . 8D45 AC        LEA EAX,DWORD PTR SS:[EBP-54]
005510DD   . E8 9E1EEBFF    CALL FOLIEREG.00402F80
005510E2   . 8D45 A8        LEA EAX,DWORD PTR SS:[EBP-58]
005510E5   . 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C]
005510E8   . 8A52 03        MOV DL,BYTE PTR DS:[EDX+3] ;去密码表中的第4个字符
005510EB   . 8850 01        MOV BYTE PTR DS:[EAX+1],DL
005510EE   . C600 01        MOV BYTE PTR DS:[EAX],1
005510F1   . 8D55 A8        LEA EDX,DWORD PTR SS:[EBP-58]
005510F4   . 8D45 AC        LEA EAX,DWORD PTR SS:[EBP-54]
005510F7   . B1 02          MOV CL,2
005510F9   . E8 521EEBFF    CALL FOLIEREG.00402F50 ;两个字符连接起来
005510FE   . 8D55 AC        LEA EDX,DWORD PTR SS:[EBP-54]
00551101   . 58             POP EAX
00551102   . 33C9           XOR ECX,ECX
00551104   . 8A08           MOV CL,BYTE PTR DS:[EAX]
00551106   . 41             INC ECX
00551107   . E8 201FEBFF    CALL FOLIEREG.0040302C ;比较两个字符是否相等
0055110C   . 0F85 8B000000  JNZ FOLIEREG.0055119D ;相等就写入注册表,不等则不写入


  我们成功了吗?看看注册表中,已经写入了我们所输入的信息.下面就是关键了,
想必重新启动以后要RegQueryValueExA注册表了!用W32Dasm察看信息,找到了如下
的信息:
* Referenced by a CALL at Addresses:
|:00464764   , :00474F8E   , :004751EB   
|

* Reference To: advapi32.RegQueryValueExA, Ord:0000h
                                  |
:00406E7C FF255C925600            Jmp dword ptr [0056925C]
:00406E82 8BC0                    mov eaxeax
  有三处调用了这个信息,我们运行程序,显然是注册信息不对,因为程序不会这么
简单让我们25个注册信息,只是比较两个.运行完了以后,在看看注册表,里面的信息
自己删除了,这就是我们用RegShot没有得到信息的原因了!因为信息被删除了,所以
我们得再次输入信息:
注册名:dengkeng[DFCG]
注册码:F234567890abcdefghijklmn0
  根据上面已经得出的最后两位信息是F0,所以我们替换了1,25位.

1.在00474F8E下断点,狂按F8,到达下面:
00554742  |. 8D4D F0        LEA ECX,DWORD PTR SS:[EBP-10]
00554745  |. BA 504E5500    MOV EDX,FOLIEREG.00554E50     ;  ASCII "Serial"
0055474A  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
0055474D  |. E8 AE08F2FF    CALL FOLIEREG.00475000
00554752  |. 8D55 EC        LEA EDX,DWORD PTR SS:[EBP-14]
00554755  |. 8BC3           MOV EAX,EBX
00554757  |. E8 88D2FFFF    CALL FOLIEREG.005519E4
0055475C  |. 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]
0055475F  |. E8 E801EBFF    CALL FOLIEREG.0040494C
.....
.....从密码表中进行取数,取足7位
.....
00554C7E  |. B1 07          MOV CL,7
00554C80  |. E8 CBE2EAFF    CALL FOLIEREG.00402F50
00554C85  |. 8D55 90        LEA EDX,DWORD PTR SS:[EBP-70]
00554C88  |. 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18] ;一共从密码表里取了7位数
00554C8B  |. E8 60FCEAFF    CALL FOLIEREG.004048F0        ;以便和后面的注册码中的比较
00554C90  |. 8D45 BC        LEA EAX,DWORD PTR SS:[EBP-44] 
00554C93  |. 8B55 F0        MOV EDX,DWORD PTR SS:[EBP-10] ;注册码的地址
00554C96  |. 8A52 11        MOV DL,BYTE PTR DS:[EDX+11]   ;取其中第12位
00554C99  |. 8850 01        MOV BYTE PTR DS:[EAX+1],DL
.....
.....按照要求从注册码中取出7位,即后面的"hijklmn"
.....
00554D82  |. B1 07          MOV CL,7
00554D84  |. E8 C7E1EAFF    CALL FOLIEREG.00402F50
00554D89  |. 8D55 90        LEA EDX,DWORD PTR SS:[EBP-70]
00554D8C  |. 8D45 E0        LEA EAX,DWORD PTR SS:[EBP-20]
00554D8F  |. E8 5CFBEAFF    CALL FOLIEREG.004048F0
00554D94  |. 8D95 58FFFFFF  LEA EDX,DWORD PTR SS:[EBP-A8]
00554D9A  |. 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18]
00554D9D  |. E8 523EEBFF    CALL FOLIEREG.00408BF4 ;把密码表中取出的数字转换成大写
00554DA2  |. 8B85 58FFFFFF  MOV EAX,DWORD PTR SS:[EBP-A8]
00554DA8  |. 8B55 E0        MOV EDX,DWORD PTR SS:[EBP-20]
00554DAB  |. E8 E0FCEAFF    CALL FOLIEREG.00404A90 ;比较是否相等
00554DB0  |. 75 07          JNZ SHORT FOLIEREG.00554DB9

  到这里我们已经得到了第2部分的注册码,替换掉原有的hijklmn.
我们再次输入注册信息:
注册名:dengkeng[DFCG]
注册码:F234567890abcdefg7CAC5C50
  在运行软件看看,看看标题栏(上面写着已经注册了),也没有注册窗口了!
难道我们已经注册了??其实不然,这是程序给我们玩的一个花样!如果你
试着点反键,选择"查看详细信息",它会提示你注册哦!你在看看标题,又变成
了未注册的样子了,我想大家应该联想到了什么吧!不错!应该又重新读取注册
表的内容进行判断,所以我们必须继续跟踪注册表!
  我们还是输入上面的注册信息,用Ollydbg加载.

2.F9运行程序,bp 00474F8E下断点,在点反键选择"查看详细信息",被拦截了吧.
下面你所要做的是狂按F8:
.....
.....
.....
005524BB  |. 8B55 A8        MOV EDX,DWORD PTR SS:[EBP-58]
005524BE  |. B9 882A5500    MOV ECX,FOLIEREG.00552A88 ;ASCII "sTOP cRACKINg,Please ^_^"
这是作者给我们的信息,叫我们不要Cracking,^_^
.....
.....
.....
00552956  |. 8D45 E0        LEA EAX,DWORD PTR SS:[EBP-20]
00552959  |. E8 921FEBFF    CALL FOLIEREG.004048F0
0055295E  |. 8B45 E4        MOV EAX,DWORD PTR SS:[EBP-1C] ;真正的2~5位,是"C2B3"
00552961  |. 8B55 E0        MOV EDX,DWORD PTR SS:[EBP-20] ;注册码的2~5位,是"2345"
00552964  |. E8 2721EBFF    CALL FOLIEREG.00404A90 
00552969  |. 75 07          JNZ SHORT FOLIEREG.00552972
  这样我们又可以得到注册码的2~5位了.我们在修改注册信息:
注册名:dengkeng[DFCG]
注册码:FC2B367890abcdefg7CAC5C50
  现在我们可以"查看详细信息"了吧!我想接下来的地方应该知道是什么了吧!
就是剩下的两个部分:"生成安装包"和"生成注册表文件"这两个限制了!方法跟
上面的雷同,我就不在罗嗦了!
  下面两个你就自己跟踪吧!第3个信息得到的是"50DE"替换原来的0abc,第4个信息
得到的是将"C5AC"替换掉"defg".
  下面总结一下分析过程,首先判断是否是注册码是否25个,不是则退出并不写进注册表.
若是25个则通过取密码表,取出密码表的7,4位和注册码的1,25位比较如果相等则写进注
册表等待下次重起验证,否则不写进注册表.通过加载的时候读取注册表的信息参加运算
然后在从密码表中取出7个字符和注册信息的18~24位进行比较.如果成功则会提示你是所
谓"注册"的注册版本,否则删除注册表的注册信息.下面是有3个功能受到限制,你运行这3
个功能则又恢复成没有注册的版本了!你可以通过下断点,跟踪得到注册码2~5位的信息,
同理你也可以得到10~13位和14~17位的信息,显然6~9位信息没有使用!
  跟踪完了以后似乎和当时跟踪豪杰一样的感受,只要你有足够的耐心,就一定可以跟踪
出正确的注册码,如果哪位高手有时间写个注册机出来,记得Email一个给我啊!!
  所以完整的注册信息是:
注册名:dengkeng[DFCG]
注册码:FC2B3678950DEC5AC7CAC5C50
软件序列号是:0C342D4FA2A61B2D5C50E838EC




Made By dengkeng[DFCG]
E-mail:shellc0de@sohu.com
欢迎转载,请保持文章的完整性