好友
阅读权限30
听众
最后登录1970-1-1
|
本帖最后由 海天一色001 于 2017-4-11 17:55 编辑
160个CrakeMe程序之001
4/7/2017 1:55:10 PM
CrakeMe第一个程序,是纯英文的。我先试着用在论坛中学习到的方法,在程序的三个窗口加了三张背景图片,把能汉化的全汉化了。这也花了我不少时间,也是在不停出错、更改中不断地加深了对Od和其他软件的理解。
汉化完之后其中还有一些问题,如原程序中有快捷键的地方,我没敢动英文,并且英文翻译过来也不一定准确,汉化不是很成功。但只是自己的一个练习,本应该是没什么问题的。
实际的破解中出现了新的问题:原程序中有一个注册码是英文的,我汉化后程序无法注册成功。将注册码改回英语试一试,改后正确,可能是程序不支持中文吧。后来又发现支持中文,只是因为字符串长度改错了,所以程序不支持了。
程序第一个界面弹出信息框,先不管它,把主程序先爆破了再说。因为在OD中进行的汉化,所以对跳转的地方很熟了,直接将其nop或者jnz(jz)改掉!!!!
程序中有两个子程序 ,一个是要求输入用户/注册码,另一个只输入注册码,所以有两处需要更改,一处是0042F4D5(注册码),另一处是0042FB03(用户/注册码),将jnz X001Acid_.0042F4F1和jnz X001Acid_.0042FB1F这两句改为nop或者用jz换掉jnz。但用了jz后会出现正确的注册码反而不能注册的问题,这也作为下一步一个学习内容,看看如何改才能不管正误都jz成功。
爆破成功。
再研究一下如何不改跳转。因为已经重载了很多次,对程序也比较了解了,直接来到下图这里,这个call的作用是比较注册码,结果存入Z标志位,那么我进入call,改一下试试:
第二次,F7进入call(004039FC)后,观察到多处跳转到00403A9A地址后是出栈命令,而后retn返回,
将关键跳转上面的比较cmp eax,edx改为cmp eax,eax后(爆破),程序出错,界面中按键上的字全都没有了,如果不管继续点注册按钮,则会出现如下图:
OD载入,在出错的地址下断,如图,此处的eax为0,地址ds:[eax]也只能是ds:[00000000]=??? ,程序无法找到数值,也就无法赋值,故出错。
将比较语句改回去后,程序恢复正常,说明此次尝试不改跳转只改判断语句不行。还是小白,搞不明白啊。先放一放,标记一下,到网上找找类似的情况学习后再进行下一步修改。另外,这个call(004039FC)只是判断注册码的地方,没有计算注册码的功能,所以在这里面全是调用寄存器的值,改了这个call里面的东西没什么用。
找注册算法:在这个call上面应该有注册算法,分析后从段首下断点,F8单步跟踪试一试:
0041AA58处的call应该是取用户名和用户名的长度,将长度给eax,用户名所在的地址给另一个寄存器:!!!!!!!!!!!本call返回的结果是注册码中间的4位数字,怎么计算的还没看明白,以后再研究吧!
在有用户名和注册码的子程序中:用户名的长度不能为空,否则报错!!!!!!!!
用户名的长度小于4个字符,也会报错!!!!!!!!!
在只有注册号的子程序中,注册号可以为空。
追注册码时发现,本子程序将真码固定为“hello Dude!”,在计算注册码时只是调用了常量hello加空格加Dude!这三个字符串组成了注册码。
4/9/2017 3:52:39 PM
爆破成功了,但是出现的前面的弹出Nag没杀掉!!!!注册算法没找出来!!!!
结合吾爱破解的官方教程中学到的方法,将messagebox函数及它的参数全部nop掉,看上去成功了,其实是错误的,将程序其他调用到messagebox之处全部干掉了,以后不管是正确还是错误的提示都出不来了!!!!!
如上图,messagebox的参数有4个,将上面的4个push全部nop,错了!!!!
(上面紫红色部分是nop掉的部分)
所以要修改的话,只能找到第一个弹窗的调用来源,将其nop掉或者说干脆转入程序第二个选择界面才行。
重新载入程序,单步运行,经过多次重新载入,下断,NAG的出现经过了四次call,在第三次调用上做文章吧(第四次是程序中其他部分都要调用的call,不能修改)。
看到此call上一句是mov eax,?????,下一句是xor eax,eax,猜测此call出来后只有eax的值有用,其他参数不能改变。所以单步跟入第三个call:
第一句是 push 0,下面是赋值给弹出信息框的参数字符串,最后调用弹出窗口的call,最后再返回第三个call的下一句,也就是xor eax,eax。对比了一下,在Nag弹出后的eax=1,所以在这个调用里就直接第一句mov eax,1,第二句返回retn!!!!试一下看看。
运行成功了!!!赶紧保存吧。
这个提示又让我心惊肉跳,咬牙点“是”,另存一个,马上运行一下,好在过去了,没白费功夫。
那么第三层调用call修改成功,第二层、第一层是不是也能修改一下?试!
重新载入,又折腾了好久,还是没成功,先这样吧,下回继续改。
补充:由于网友“xuanqing 发表于 2017-4-11 09:21
爆破也是有技术含量的
在哪里爆要分析出来才行”的意见,
我将爆破的过程补充如下:使用“中文搜索引擎”,找到错误提示信息框的提示文本,英文版是“Try,中文是“再试一次”,这里有两个,(见下图)分别对应只有注册码的子程序和有用户名/注册码的子程序。双击其中一个“再试一次”:(我点击的是下方那个)
进入CPU界面,程序就在这一句上了。向上查找跳转语句,向上两行就是一个jmp(无条件跳转),跳过注册失败,但是没有跳过,说明在这一句执行前有别的跳转跳过了它。
Jmp语句的下一句,是“0042FB1F |> \6A 00 push 0x0”,可以看出此处跳过了jmp,使程序走向了注册失败。
所以向上找到此处的来源:沿着红线直接来到了地址0042FB03处,也可以用下图的方法,在信息窗口中右键点击“跳转来自”这一句话,选择“转到jmp来自0042FB03”, 同样能够来到jnz跳转语句处。
将jnz X001Acid_.0042FB1F命令用nop填充掉;
然后返回到中文搜索引擎窗口,找到另一个“再试一次”的文本,同样的方法来到0042F4D5地址处,将这一句的jnz X001Acid_.0042F4F1语句nop掉;最后保存程序,运行一下,成功了。 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|