首页
论坛
专栏
课程

[DES+异常]难度更大-xxxx人事法规大全xxxx

2006-4-2 21:51 6969

[DES+异常]难度更大-xxxx人事法规大全xxxx

cyto
31
2006-4-2 21:51
6969
中国劳动人事法规大全  200601

这个DES难度更强,如果输入的注册码加密结果不满足要求,就利用异常改变线路继续下一个key的加密,总共6次。

1.基本情况:
机器码:177861865
注册码:87654321-12345678-11223344-55667788
确认后提示:注册码不正确。

PEID:ASPack 2.12 -> Alexey Solodovnikov
脱壳后:Borland Delphi 6.0 - 7.0
运行出错。
OD载入未脱壳程序,运行到OEP(0052F6D8)后,运行ImportREC,OEP添0012F6D8,自动搜索IAT,RVA=001361B4,Size=00000E20,Get Imports,没有无效的函数,修复。
修复后运行ok。
OD载入脱壳后程序,ImportREC查看RVA=001361B4,Size=000007C4,看来是脱壳后IAT的Size不够引进的函数识别错误。另外:Size添大了,好多无效函数,cut后修复一样可以运行,看来宁可添大也不要小了。

2.OD载入,搜索串参考:
地址=0052CBC2 反汇编=mov edx,Labor_La.0052CBFC 文本字符串=注册码不正确。
往上找,一直到起点:0052C990     55              push ebp
下断,F9运行程序,跳出注册框,输入注册码后确认,断下,F8往下走,先是取得各个输入的注册码,然后连接成字符串,来到:
0052CA97     E8 2C83EDFF     call Labor_La.00404DC8              ; 连接注册码
0052CA9C     8B45 E4         mov eax,dword ptr ss:[ebp-1C]       ; 注册码
0052CA9F     E8 6046FEFF     call Labor_La.00511104              ;  估计是计算核心
0052CAA4     85C0            test eax,eax
0052CAA6     0F8E FD000000   jle Labor_La.0052CBA9               ; 跳往注册码错误的地方,可爆破?

3.DES加解密:
查到DES加密。
在0052CA9C处HR EAX,层层下断跟踪对注册码的处理。

字符转换成字节:
00510E0F     8D45 F0            lea eax,dword ptr ss:[ebp-10]
00510E12     50                 push eax
00510E13     8BD6               mov edx,esi
00510E15     03D2               add edx,edx
00510E17     42                 inc edx
00510E18     B9 02000000        mov ecx,2
00510E1D     8B45 FC            mov eax,dword ptr ss:[ebp-4]
00510E20     E8 4341EFFF        call Labor_La.00404F68
00510E25     8B45 F0            mov eax,dword ptr ss:[ebp-10]
00510E28     E8 9BFEFFFF        call Labor_La.00510CC8
00510E2D     8BD0               mov edx,eax
00510E2F     8D45 EC            lea eax,dword ptr ss:[ebp-14]
00510E32     E8 F93DEFFF        call Labor_La.00404C30
00510E37     8B55 EC            mov edx,dword ptr ss:[ebp-14]
00510E3A     8D45 F4            lea eax,dword ptr ss:[ebp-C]
00510E3D     E8 CE3EEFFF        call Labor_La.00404D10
00510E42     46                 inc esi
00510E43     4B                 dec ebx
00510E44   ^ 75 C9              jnz short Labor_La.00510E0F

017C6F10  87 65 43 21 12 34 56 78  ?C!4Vx
017C6F18  11 22 33 44 55 66 77 88  "3DUfw

以不同方法转移:
0012F4C8  87 65 43 21 12 34 56 78  ?C!4Vx
0012F458  87 65 43 21 12 34 56 78  ?C!4Vx

然后分组转移:从0012F4C8到0012F4C0  
0012F4C0  87 65 43 21 12 34 56 78  ?C!4Vx
0012F4C8  87 65 43 21 12 34 56 78  ?C!4Vx
DES的加密前总是经过相同的转移,使得[地址]&[地址+8]的值相同(也就是待加密的值)。
估计下个硬件访问中断就是IP置换。

对12F4C0下断,断下后取消断点,然后返回:
005106B8     8B45 0C            mov eax,dword ptr ss:[ebp+C]         ; 待加解密的数据
005106BB     8B55 08            mov edx,dword ptr ss:[ebp+8]
005106BE     E8 81F9FFFF        call Labor_La.00510044                ; IP置换
005106C3     84DB               test bl,bl                            ; 返回处
005106C5     0F85 B5000000      jnz Labor_La.00510780                 ; 判断加解密

找到IP置换就好办了,DES加解密的汇编代码几乎一样(可能用到的编程的东西一样吧)。
在005106BE下断,F9发现有6×2次中断,因为注册码转换后是16个字节,分两次加密,那么应该有6次循环加密,加密的字符串都是输入的注册码的字节形式,可能key变了。
参考《[DES]YAHOO通群发器》的破解,以下就不分析了,几乎一样,我们关注加密后的处理。

4.加密后的处理:
从IP置换一直返回到:
00511171     E8 42FCFFFF        call Labor_La.00510DB8                  ; 加解密
00511176     8B45 EC            mov eax,dword ptr ss:[ebp-14]           ; 值,返回处
00511179     E8 4289EFFF        call Labor_La.00409AC0                  ; 检查?异常?

如果加密值不对的话,在00511179的call会有异常:
00409AC9     8BC3               mov eax,ebx                    ; 加密值
00409ACB     E8 8899FFFF        call Labor_La.00403458         ; 转换成十六进制
        hr eax,断下后单步跟进,发现:
        004034AA     80EB 30            sub bl,30
        004034AD     80FB 09            cmp bl,9
        004034B0     77 25              ja short Labor_La.004034D7
        跳就退出,这样的话得到的加密值不能大于39,只能是数字?
00409AD0     8BF0               mov esi,eax
00409AD2     833C24 00          cmp dword ptr ss:[esp],0
00409AD6     74 19              je short Labor_La.00409AF1      ; 往下就异常

异常提示:
0012F4D8   017C6F50  ASCII "'%s' is not a valid integer value"
这么说加密后的值只能是数字+字母A到F?

修改加密值为8765432187654321,但是进入00409ACB处出来还是异常,好像值太大了。
修改加密值为0000000000000123,这下满足要求了,00409AD6处跳转过异常,然后返回。
如果加密值不满足要求的话产生异常,然后程序改变路线不是返回到下面的0051117E,而是又循环加密,直到加密值满足要求。

然后返回到:
00511179     E8 4289EFFF       call Labor_La.00409AC0          ; 检查?异常?
0051117E     99                cdq                             ; 返回到此
0051117F     52                push edx
00511180     50                push eax
00511181     8B45 F8           mov eax,dword ptr ss:[ebp-8]
00511184     33D2              xor edx,edx
00511186     3B5424 04         cmp edx,dword ptr ss:[esp+4]
0051118A     75 03             jnz short Labor_La.0051118F     ; 不会跳
0051118C     3B0424            cmp eax,dword ptr ss:[esp]      ; 加密值的十六进制与A99F4E9比较
0051118F     5A                pop edx
00511190     58                pop eax
00511191     75 0D             jnz short Labor_La.005111A0     ; 这个关键,跳的话继续循环

如果加密值的十六进制=A99F4E9的话,那么退出,否则的话继续循环加解密(加密的key可能不一样),转换比较等等6次,第几次相等的话返回值就等于几。

返回:
0052CA9F     E8 6046FEFF       call Labor_La.00511104   ; 计算核心的地方
0052CAA4     85C0              test eax,eax             ; 返回值
0052CAA6     0F8E FD000000     jle Labor_La.0052CBA9

好思路清晰了:
程序先对输入的注册码连接成串,总共是8×4=32个字符,分成2分进行DES加解密,得到的值再连接起来,然后转换成字符(如果不能转换为字符的话就异常,然后改变路线继续循环),再将字符(好像不能太大,大的话也异常)转换成十六进制,然后与A99F4E9比较,如果不等的话就继续下一个加解密循环(key改变,6次),如果相等的话,返回值就=相等的循环次数值。

5.反推注册码:
A99F4E9=177861865(D)(呵呵,就是机器码)
177861865=31 37 37 38 36 31 38 36 35
位数不够,前面以30补充凑足16个字节:30 30 30 30 30 30 30 31 37 37 38 36 31 38 36 35
也就是加密后要等于该值。

利用程序本身的加解密进行解密(修改IP置换前的数据,再修改加解密判断跳转):
0012F4C0  DD 4C F4 7D 9E 7A 0F 7A  萏酏?z
0012F4C0  B7 53 D7 2B AA FB D4 0B  酚???
DD4CF47D-9E7A0F7A-B753D72B-AAFBD40B

在最后判断0052CAA4      test eax,eax  返回值的时候竟然eax=0。
看来加解密的十六进制值还不能在第一次循环的时候相等?
那好我搞定6次的结果。

第二次循环反推的注册码:
0012F4C0  BF 5A 60 F5 7B 4E C9 FD  口`觖N升
0012F4C0  C0 D3 56 99 5B 35 AA 71  烙V?5?
BF5A60F5-7B4EC9FD-C0D35699-5B35AA71

第3次循环反推的注册码:
0012F444  8A A1 44 16 8A 60 1B 96  ?D?
0012F444  6A D2 46 DC BE 8F 01 38  j移芫?8
8AA14416-8A601B96-6AD246DC-BE8F0138

第4次循环反推的注册码:
0012F444  86 58 BA 67 FF A9 95 C0  ?虹??
0012F444  A4 1E 98 53 24 CA 25 D2  ??$?
8658BA67-FFA995C0-A41E9853-24CA25D2

第5次循环反推的注册码:
0012F444  DC D1 EA AE CB DA 15 8D  苎戤粟
0012F444  BE 8F 2F F8 66 21 EB 63  ?/?!脬
DCD1EAAE-CBDA158D-BE8F2FF8-6621EB63

第6次循环反推的注册码:
0012F444  10 63 F1 BF D1 61 1C E1  c窨厌
0012F444  F9 FA 1A AF C8 BA 5C AA  ??很
1063F1BF-D1611CE1-F9FA1AAF-C8BA5CAA

一一试过后发现,虽然提示恭喜注册,但是重新启动程序后注册框是空白的,点击要看的内容出错。
于是上网查找了下《中国劳动人事法规大全》,下了个最新版,覆盖安装后解决问题。

机器码:177861865
注册码:8AA14416-8A601B96-6AD246DC-BE8F0138

至少有5组注册码可以,然后写入注册表:
HKLM\Software\Labor_Law\RegisterCode        SUCCESS        "8AA144168A601B966AD246DCBE8F0138"

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (12)
ah007 2 2006-4-2 22:08
2
0
好,坐!!!
koala 3 2006-4-2 22:55
3
0
好文,支持
china 5 2006-4-2 23:15
4
0
好文支持!!!
9494 2006-4-2 23:43
5
0
DES研究过,但这样使用还没见过,学习了!
lei_z_r 2006-4-3 00:43
6
0
不错,我最烦跟算法
pendan2001 4 2006-4-3 03:26
7
0
好文支持!!!
林海雪原 6 2006-4-3 10:44
8
0
好好学下..
xingbing 2006-4-3 13:10
9
0
好文,算法看的真烦。
lrlzzgs 2006-4-3 15:49
10
0
像这样经典的破解能否制作成动画让俺们小菜学习学习
kkbing 3 2006-4-3 17:51
11
0
好文,继续发些,顶!
cyto 31 2006-4-3 18:52
12
0
跟踪算法是很烦,我是用工具查的,然后跟踪对注册码的处理,找到加密的地方就基本ok,然后套用路数就下来了。
像DES,我都不找key了,只要知道加密第一步IP置换在哪里,然后加密的数据什么,对加密完的数据又怎么处理。这样思路就很清晰了。
个人观点,不妥之处请指出。
yujinjianx 2006-4-3 19:17
13
0
好文,顶!
游客
登录 | 注册 方可回帖
返回