kaoyange 发表于 2014-8-28 16:48

【原创】【适合初学者】序列号保护基础知识之习题二详解

本帖最后由 kaoyange 于 2014-8-28 17:08 编辑

【适合人群】热爱算法分析的初学者【破解工具】OllyDbg【程序下载】----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、找关键跳转
1.      OD加载,F9试运行,任意输入一串字符,看有何结果,如图1.                                                                                 图1
2.    看到这儿我们一定心中窃喜,为什么呢?因为看到了错误提示Wrong S/N#,于是很自然地想到去搜索字符串:右键--------Search For----------All Referenced Text Strings,找到Wrong S/N#,双击之,来到图2.                                                                                             图23.   直觉告诉我们,关键跳转与关键算法就在附近,于是向上翻翻,果然找到了;由于本题不允许爆破,那我们就来分析算法吧,显然,要解密,就要跟进call 0040120B.让我们一鼓作气吧!----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------二、重点分析关键算法1. F7 跟进 call 0040120B,看到如下代码:0040120B/$C8 000000   enter   0, 0
0040120F|.53            push    ebx
00401210|.52            push    edx
00401211|.33C0          xor   eax, eax
00401213|.B8 A6204000   mov   eax, 004020A6                  ;ASCII "kaoyange"
00401218|.8038 00       cmp   byte ptr , 0
0040121B|.74 60         je      short 0040127D
0040121D|.33DB          xor   ebx, ebx
0040121F|.33D2          xor   edx, edx
00401221|>8A18          /mov   bl, byte ptr ;取出一个字符放入bl
00401223|.C1C3 08       |rol   ebx, 8                        ;将ebx循环左移8位
00401226|.03D3          |add   edx, ebx                ;edx为累加器
00401228|.40            |inc   eax
00401229|.8038 00       |cmp   byte ptr , 0      
0040122C|.^ 75 F3         \jnz   short 00401221
0040122E|.52            push    edx                              ; /<%lX>
0040122F|.68 54204000   push    00402054                         ; |Format = "%lX"
00401234|.68 BF204000   push    004020BF                         ; |s = crackme5.004020BF
00401239|.E8 8F000000   call    <jmp.&USER32.wsprintfA>          ; \wsprintfA
0040123E|.BB BF204000   mov   ebx, 004020BF
00401243|.803B 38       cmp   byte ptr , 38
00401246|.75 35         jnz   short 0040127D
00401248|.807B 01 44    cmp   byte ptr , 44
0040124C|.75 2F         jnz   short 0040127D
0040124E|.807B 02 43    cmp   byte ptr , 43
00401252|.75 29         jnz   short 0040127D
00401254|.807B 03 41    cmp   byte ptr , 41
00401258|.75 23         jnz   short 0040127D
0040125A|.807B 04 46    cmp   byte ptr , 46
0040125E|.75 1D         jnz   short 0040127D
00401260|.807B 05 33    cmp   byte ptr , 33
00401264|.75 17         jnz   short 0040127D
00401266|.807B 06 36    cmp   byte ptr , 36
0040126A|.75 11         jnz   short 0040127D
0040126C|.807B 07 38    cmp   byte ptr , 38
00401270|.75 0B         jnz   short 0040127D
00401272|.B8 01000000   mov   eax, 1
00401277|.5A            pop   edx
00401278|.5B            pop   ebx
00401279|.C9            leave
0040127A|.C2 0400       retn    4
0040127D|>33C0          xor   eax, eax
0040127F|.5A            pop   edx
00401280|.5B            pop   ebx
00401281|.C9            leave
00401282\.C2 0400       retn    4

2.先不急于去分析汇编指令,弄清逻辑结构更为关键,仔细看下原来大致步骤是:将你输入的字符串的每个字符取出来,然后做移位和相加运算,最后得到一个结果,将这个结果与正确结果(Ox8DCAF368)作比较,如果相等则成功,否则失败。还是挺简单的吧!
3.理清了程序的结构,那么我们就要来好好分析下这个所谓的“移位和相加运算”,明眼人一看就知道00401221到0040122C是这个运算的核心过程,因为弄清了这个过程,我们的序列号就能轻松搞定了,为了便于讲解,我们不妨假设输入的字符串为ABCD(注:这里的ABCD是四个未知的字符,因为我们不知道正确的序列号,所以要逆求正解),那么我们就可以建立一个简单的数学模型,EDX 为累加器,无需关注,我们只要盯着每次都加上的EBX即可。
第一次要加上的EBX:0 0 A 0
第二次要加上的EBX: 0 A B 0
第三次要加上的EBX:A B C 0
第四次要加上的EBX: B C D A
而正确结果我们是只知道的,所以此时我们只需要求解一个四元一次方程即可:
A + B= 8D         ------------------------------------- (1)A + B+ C = CA   ------------------------------------- (2)A + B+ C + D = F3 ------------------------------------- (3)A =68             -------------------------------------(4)联立(1)(2)(3)(4)得到一个解:h%=),快去试试吧,如图3                                                                                                 图3其实看到这儿,应该就能明白为什么我要输入四个字符来讲解了,它的本质就是4个方程来解n元一次方程,如果n = 4,那么刚好可以得到唯一解;如果n > 4,那么解就可以是多个了。同时,如果你敏感的话,肯定很容易想到如果相加有进位呢?没错,这个留给爱思考的你。你会发现如果不考虑进位:序列号的形式为XXXXXXXXXXXXX%=)      如果考虑到进位:序列号的一种形式为XXXXXXXXX$=)----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------三、后记Q:这个CrackMe的算法很easy啊,你为啥还要写篇文章?Ans:主要理由我觉得有两点:首先就是纯算法类型的CrackMe我也破解过一些,而且在大学时也搞过一段时间的ACM/ICPC,本身对算法就很热爱,自己真正分析出来的多少会有兴奋之情,如果只是一味地练习CrackMe,对我而言可能会失去热情,倒不如分享一下,写写自己的破解过程,保持对破解的一些新鲜感,这样会更好;其次就是我觉得“雁过留痕”,自己曾经做过的事总得留下些什么。

kaoyange 发表于 2014-8-31 12:09

zmjxx341 发表于 2014-8-30 19:34
N   > 4   怎么 逆

举个例子:在不考虑进位的前提下,假设N = 6,输入的字符为ABCDEF,根据之前的分析很容易得到最后三个字符为%=),再由方程得A + B + C = 0x68,这是个不定方程,只要满足这个等式都是解,对照着ASSIC表,找到其中一组解就是A = !,B = ",C = %.那么一组完整解就是!"%%=)

希望对你有帮助

zmjxx341 发表于 2014-9-1 13:10

kaoyange 发表于 2014-8-31 12:09
举个例子:在不考虑进位的前提下,假设N = 6,输入的字符为ABCDEF,根据之前的分析很容易得到最后三个字 ...

谢谢指导

飘舞的雪花 发表于 2014-8-28 16:54

顶楼主。

xiaowenyu520 发表于 2014-8-28 16:57

zuolu 发表于 2014-8-28 17:02

很好的新手模学习。

Tong 发表于 2014-8-28 19:39

多谢楼主分享

rain灿 发表于 2014-8-28 19:53

{:301_1001:}不错哦。。

zmjxx341 发表于 2014-8-30 19:34

N   > 4   怎么 逆

旋冰 发表于 2014-10-1 03:05

好长,看不懂!!!
页: [1] 2
查看完整版本: 【原创】【适合初学者】序列号保护基础知识之习题二详解