本帖最后由 Chief 于 2013-10-13 21:50 编辑
前几天跟着学习shark恒的破解教程,刚把第一季学完,感觉真是受益匪浅,学到了很多破解方面的知识。
首先,非常感谢恒大,给我们带来精彩的破解教程。
学完第一季的教程, ,所以想看能不能分析下其注册码的生产原理,写出一个注册机,所以拿第三课的软件进行了实验,相关链接是
http://www.52pojie.cn/thread-196018-1-1.html
整个破解过程如下:
实验环境:Win7+ OD 破解对象:Shark破解教程中的第三课样本 分析结果:写出一个与之对应的注册机 整个分析过程如下: 2. 密钥生成算法分析 3. 注册机的实现 一、 壳识别与脱壳处理 虽然加壳与否不影响注册机的实现,但是为了便于调试,还是进行一下简单的脱壳处理。 首先用PEiD进行壳的识别,是UPX2.93 – 3.00,利用ESP定律下断点,找到程序OEP,DUMP下入口点出的程序,然后用ImportREC修复导入表,即可得到脱壳后的程序。下面是几张截图:
图1 PEiD识别出壳类型为UPX
图2 找到OEP,DUMP程序
图3 进行导入表修复 最后,得到脱壳后的程序Test_.exe。 二、 密钥生成算法分析 分析的关键在于准确定位密钥生成的函数位置。 分析过程中首先通过字符串定位判跳转的位置,然后在其附近寻找注册码生成的函数。 用OD挂起Test_.exe,让程序运行起来,随便输入一个用户名和注册码,弹出一个“信息:”提示框,依据框中的内容定位判跳转的位置如下图所示: 图4 依据字符串找到判跳转的位置 在此处下个断点,然后逐步网上寻找,查找生成注册码的位置。通过栈中的ret找到外层函数位置,然后重新注册,找到本段函数的起始位置,如图所示: 图5 注册码生成与比对函数入口点 逐步往下分析,有一个函数将用户名“123”和字符串“121110”压栈,而返回值恰好是包含注册码的字符串“75,66,4C”,故而推测可能是在这个函数中完成了注册码的生成过程,在此处下断点,如图所示: 图6 注册码生成函数 进入这函数就可以看到整个密钥生成的过程,整个过程有点长,简要概述如下: 1. 分配两个大小为0x100的空间ADDR1,ADDR2; 2. 将ADDR1中填充0x00----0xFF的内容,将ADDR2中填充“121110”循环的内容; 3. 结合这两个空间中的内容,生成一张0x100大的加密表,如图所示: 图7 加密表 这个加密表是逐次变化的,比如开始时是6C和D0交换位置,接着是11和41,分析发现每次变化后的结果是相同的!所以可以将其看做是静态的分析值。 4. 逐个取用户名的字符与相应的加密字符异或运算,得到一个8位长的值,将该值转化为字符串便是对应用户名字符的注册码。如图所示:
图8 生成单字符注册码 其中,在栈中的-7Ch处是用来异或的密钥,-88h处是用户名的单字符值。再往下的函数就是将得到的字符转化为字符串,如图所示: 图9 生成单字符注册码字符串 然后通过一个循环的过程得到包含用户名对应的注册码的字符串。 5.由于得到的每个单字符注册码之间以“,”隔开,接下来调用函数将其归并到一起,如图所示: 图10 去掉“,”得到注册码 至此,主要的注册码获取过程已经结束,然后就是与输入的密码进行比对,判跳转,如图所示: file:///C:\Users\ZQ\AppData\Local\Temp\msohtmlclip1\01\clip_image021.png
图11 将输入与真实注册码比较
三、 注册机的实现 通过前面的分析可以知道,想写入注册机只要知道生成注册码的密钥就可以实现。 由于还没有分析清楚每次密钥产生的算法原理,所以采用记录的方式还原密钥。 在用户名中填入2016个“0”,然后在图11的位置下断点,从内存中获得所有注册码,然后让每个单字符注册码与0x30异或,还原出密钥表如图所示:
file:///C:\Users\ZQ\AppData\Local\Temp\msohtmlclip1\01\clip_image023.png
图12 密钥表 然后写一个小程序,输入用户名,然后通过相应的单字符注册码异或生成算法,生成相应的注册码就可以了,效果图如下:
file:///C:\Users\ZQ\AppData\Local\Temp\msohtmlclip1\01\clip_image025.png
图13 注册机效果图 后记: 开始不知道“121110”有什么意义,后来在查看恒大的个人信息时发现其**就是121110,所以前面推断121110就是关键密钥是正确的。 再次感谢恒大,教程非常精彩,确实受益匪浅。
|