Macc 发表于 2017-5-9 17:00

2016腾讯游戏安全第一题

本帖最后由 Macc 于 2017-5-11 18:02 编辑

这个题去年腾讯游戏安全挑战赛的时候做过,没有做粗来,一直留在我的电脑里,前几天逛看雪的时候看到一个分析贴,才想着把它做了
这个程序未加壳。用OD载入,Ctrl+N在GetWindowTextA下断点,未断下
GetDlgItem断下,单步走发现SendMessage
mov   eax, dword ptr           ; |
mov   edi, dword ptr [<&USER32.SendMes>; |USER32.SendMessageA
push    eax                              ; |hWnd
call    edi                              ; \SendMessageA
执行到SendMessage后,看栈里面
0012F5B4   000201B6|hWnd = 201B6
0012F5B8   0000000D|Message = WM_GETTEXT
0012F5BC   00000040|Count = 40 (64.)
0012F5C0   0012F660\Buffer = 0012F660
消息方式WM_GETTEXT
MSDN: Copies the text that corresponds to a window into a buffer provided by the caller.
把窗口对应的文本复制到调用者提供的缓冲区中
这里提供的缓冲区是0x0012F660,执行SendMessage后,0x0012F660处的内容由0变为了我输入的用户名

0x01 用户名第一次计算

在0012FF60设置硬件访问断点,然后运行,断在下面
mov   cl, byte ptr
inc   eax
cmp   cl, bl
jnz   short 00401F85                            ;用户名长度
接下来把用户名长度-6后与0x0E比较,如果大于0x0E就直接注册失败,说明长度不能大于20或者小于6
sub   eax, edx
mov   edi, eax
lea   eax, dword ptr
ja      004021E7
下面是对用户名username的计算
(0x1339E7E+i) x username x strlen(username) 每计算一次加原先的结果
mov   eax, ecx
cdq
idiv    edi
lea   esi, dword ptr
inc   ecx
movsx   eax, byte ptr
lea   edx, dword ptr
imul    eax, edx
imul    eax, edi
add   dword ptr , eax
cmp   ecx, 10                                 ;循环16次
jl      short 00401FE0
0x02 序列号计算
序列号长度mov   cl, byte ptr
inc   eax
cmp   cl, bl
jnz   short 00402053call 401960是序列号的计算xor   edi, edi
mov   al, byte ptr
lea   ebx, dword ptr
mov   byte ptr , al
call    00402420                     ;索引
mov   byte ptr , al
inc   edi
cmp   edi, 4
jl      short 00401A72call 00402420是对输入的序列号进行了一个在”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@%”中获取索引的操作(在这之前也判断了序列号是否是这个字符串当中的字符)例如字符’y’,处于上面那个字符串的第50位,返回的索引值就是0x32然后是一个计算

PS:上图的按位与符号写错了,应该是&这里就是让序列号每四个字节为一组,形如,,通过上面的运算,每四个字节会得到三个字节结果
key_=key<<6+key
key_=key<<4^(key>>2&F)
key_=4key+key>>4&3
到下面有一个计算的值与0x14比较,这里比较的内容就是刚才计算的key值长度,这里说明计算后的key应该有20字节,说明计算前的key应该有24+3=27字节
cmp   edx, 14
je      short 004020D8
0x03 用户名第二次计算
这里有一个计算,观察数据窗口以及地址可以发现这里参与计算的值就是刚才用户名第一次计算的结果mov   ecx, dword ptr
mov   eax, 66666667
imul    ecx
sar   edx, 2
mov   ecx, edx
shr   ecx, 1F
add   ecx, edx      ;result_name/10
mov   edx, dword ptr
sub   edx, edi
mov   dword ptr , ecx   
cmp   esi, edx
jb      short 00402131
call    0041105A
mov   edi, dword ptr
mov   eax, dword ptr
mov   dword ptr , eax
add   esi, 4
cmp   esi, 14
jl      short 00402102
(上面这段代码涉及到除法的优化,具体内容参考《C++反汇编与逆向分析》第四章)
再往下,就到了一个比较的地方
mov   ecx, dword ptr           ;name_0
mov   eax, dword ptr           ;key_4
lea   edx, dword ptr          ;name_0+key_4
mov   ecx, dword ptr           ;key_2
cmp   edx, ecx                         ;key_2==key_4+name_2
jnz   short 004021AB
mov   edx, dword ptr           ;name_1
add   edx, ecx                         ;name_1+key_2
add   eax, eax                         ;key4+key4
cmp   edx, eax                         ;name_1+key_2==key_4*2
jnz   short 004021AB
mov   ecx, dword ptr           ;key_3
mov   eax, dword ptr           ;name_2
mov   edx, dword ptr           ;key_0
lea   esi, dword ptr          ;key_3+name_2
cmp   esi, edx                         ;key_0==key_3+name_2
jnz   short 004021AB
mov   esi, dword ptr           ;name_3
add   esi, edx                         ;key_0+name_3
add   ecx, ecx                         ;key_3+key_3
cmp   esi, ecx                         ;key_0+name_3==key_3+key_3
jnz   short 004021AB
mov   edx, dword ptr           ;name_4
mov   ecx, dword ptr           ;key_1
add   ecx, edx                         ;key_1+name_4
lea   edx, dword ptr        ;name_2*3
cmp   ecx, edx                         ;name_2*3==key_1+name_4
jnz   short 004021AB
0x05 注册机
源码和程序

加一个原程序下载链接
http://pan.baidu.com/s/1sltvlG5

Imbacong 发表于 2017-5-10 14:32

非常感谢你的分享破解过程,对于一个不懂破解的人来说,是莫大的好处,可以跟着做,尝试破解的滋味,我就是一个自学破解的人,当然有人教是更好了,这不没经济没条件,所以想自学,有一个叫看雪的我看他的讲得一点都看不进学不到,对于有基础或懂的人还差不多,可是懂的人就不会看他的了。那样的教程和枯萎。我也想下载这个软件来跟着你做下,不知道你这个够不够清楚,步数对小白到不到位,我不记得在那下载了个很短的教程,直接破解飞扬软件的,跟着做,既然成功了,新手就是需要这样的教程,我那是第一次破解,以前从来没碰过,也没学习和了解过。只晓得有破解这词,和下载用一些破解软件。

花语 发表于 2019-9-24 21:16

junmx 发表于 2017-5-9 17:18

看不懂,支持                     

老男孩小川 发表于 2017-5-9 17:26

汇编大神 膜拜膜拜

Macc 发表于 2017-5-9 17:33

老男孩小川 发表于 2017-5-9 17:26
汇编大神 膜拜膜拜

不敢当..也只是跟着调试器才能看懂呀{:1_931:}

SSY忘情 发表于 2017-5-9 18:56

感谢发布原创作品,吾爱破解论坛因你更精彩!

17605202756 发表于 2017-5-9 19:05

你好,你被我们腾讯公司看中了,明天直接来上班吧!!!!

nmsl 发表于 2017-5-9 19:23


感谢发布原创作品,吾爱破解论坛因你更精彩!

儒雅小白鼠 发表于 2017-5-9 19:27

谢谢楼主分享

明天就好好学习 发表于 2017-5-9 19:45

感谢分享啊

zhisou2006 发表于 2017-5-9 20:17

表示根本不懂。
页: [1] 2 3 4 5 6
查看完整版本: 2016腾讯游戏安全第一题