初练160个CrakeMe程序之001
本帖最后由 海天一色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:也只能是ds:=??? ,程序无法找到数值,也就无法赋值,故出错。
将比较语句改回去后,程序恢复正常,说明此次尝试不改跳转只改判断语句不行。还是小白,搞不明白啊。先放一放,标记一下,到网上找找类似的情况学习后再进行下一步修改。另外,这个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掉;最后保存程序,运行一下,成功了。 灰太狼大王 发表于 2017-4-10 18:21
我找到注册码了,运行程序的弹窗想去掉,结果全不弹了,不知道哪里不对
程序的弹窗有五个,一个是进入主程序之前的NAG(不知道中文该说什么),两个注册成功,两个注册失败,都调用的messagebox函数,如果你在最后一层也就是直接调用函数时跳过或者nop掉,所有的调用都调不到了,肯定是不仅NAG被杀,注册成功或失败的弹出消息框也没了。
我在上面也谈到了,比如杀NAG时,最好是在第一层调用时(也就是说不影响其他地方的调用)改,第二层、第三层call处可能都有来自其他地方的调用,修改后可能导致其他程序段失败。 Adieus阿斗 发表于 2017-4-28 19:13
楼主,调用子程序出现access violation错误的话应该怎么解决呢?
你好!这个问题我也不知道该怎么解决。
我的理解是这样的:出现这种错误,一是作者原程序未考虑到,未进行错误处理,如用户名为空,程序中要调用用户名时一些函数不接受空或0(如除法中的除数不能为0),而作者因各种原因未处理这个错误,导致系统出错;另一种就是我在修改时改变了程序的流程,或者是错误的修改了数据,同样导致了系统不能正常运行。以我目前初学者的水平,现在真的是无法解决这个问题。
如果你有什么好的办法,希望能告诉我一下!! 自己回复一下,为了上图累得够呛,从word文档中复制到编辑框中一看只有文字了!只好将图片一张张地粘贴到画图中保存,上传,再找到对应的位置加上,一不小心还加错了!
由此对论坛中上传教程的大神们更加佩服了,真的感谢论坛里的所有无私奉献的大神们! 加油!加油! 加油,好久没来了 支持楼主,谢谢分享, 楼主加油 我找到注册码了,运行程序的弹窗想去掉,结果全不弹了,不知道哪里不对 感谢楼主分享经验 哇塞,之前学过一段时间,后来因为考试耽搁了,,然后就没继续,现在连之前学的那点东西都要忘了。时间真的是挤出来的{:301_1009:} 加油 同楼主一样学习