首页
社区
课程
招聘
[旧帖] [原创]投机取巧crack一只老虎 0.00雪花
发表于: 2009-6-23 23:15 3720

[旧帖] [原创]投机取巧crack一只老虎 0.00雪花

2009-6-23 23:15
3720
【文章标题】: 投机取巧crack一只老虎
【文章作者】: karas
【软件名称】: 一只老虎crackme
【软件大小】: 664KB
【下载地址】: 看雪论坛
【加壳方式】: NO
【编写语言】: Borland Delphi
【使用工具】: "W32dsm8.93+"+IDA
【操作平台】: XP SP3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  W32dsm8.93+反汇编,查看函数参考,很快找到关键跳转(下图中B),修改之,结果失败
  开始跟踪注册码计算过程,发现对用户名和注册码的长度有一定要求(下面会说到)
  当时没有想到输入规定长度的用户名和注册码再修改关键跳转试试(一大疏忽!)
  接着跟到一个循环,循环次数N多次(又是耽误跟踪时间的循环),大概跟了几遍
  这次没立刻修改以减少循环,而是把断点改设在循环后面继续跟踪
  后来跟到一串字符(长度是17,在规定的注册码长度之内,记录下来)与输入的注册码比较
  最后跟踪结束,输入规定长度的用户名和刚才记录下来的那一串字符,还是失败
  难道是遇到了传说中的暗码比较?
  
  最近一直在跟踪一个共享软件的关键代码
  其实仔细地跟踪一个软件的关键代码真的很累,而且不可能一次就把程序流程理清楚
  前几天跟踪一个修饰图片的共享软件,关键代码部分很多call
  有的call调用不同的地址却是相同的功能,有的call代码看似相同却是有关键的不同
  软件作者就是要这样把你整糊涂,把你搞得晕乎晕乎的
  非常仔细地注释主要代码,花了一个通宵时间,跟到最后居然跳出注册成功!
  当时真是傻眼了,原来软件有bug(估计软件作者把自己也整得晕乎晕乎了)
  输入8位注册码和12位激活码就能注册成功
  而跟踪的时候输入的注册码和激活码居然就是8位和12位
  这能说是超级好运气吗!当时差点没把李云龙那句"揍它XXXX!"骂出来
  总的来说,crack需要无限的执着!
  提到这些其实是想引出程序流程这个东西
  以前在跟踪著名ciba的时候,也是遇到很多的call
  在暴力crack过程中描画过一部分关键代码的流程图,不过非常费劲
  前几天开始使用IDA,发现这个工具暴强,居然能把代码转成布局图和流程图
  她正是我梦寐以求的功能,当时惊叹得以"神器"来形容她
  
  于是乎用IDA打开"一只老虎",把关键代码转成布局图,如下(终于说到重点了-_-!):
  
  ;布局图------------------------------------------------------
  
  ;布局图------------------------------------------------------
  
  先说一下布局图的箭头(自己猜测,错误请指出):
  ;亮蓝色箭头只在前面出现,应该是指示程序的入口;深蓝色箭头指示流程的顺序走向
  ;红色箭头指示跳转失败(False)的流程走向;绿色箭头指示跳转成功(True)的流程走向
  ;粗绿色箭头指示循环跳转
  图中关键信息和跳转已用粗红线条或字母标出
  从下面看起,先看A,粗红线标出"恭喜你"、"注册成功!..."是注册成功的提示信息
  我们做的一切都是为了要使程序跑到A这里,那么程序是从哪里跑到A的呢?
  一看就知道是从B跑到A的,B有一个跳转(就是一开始修改的关键跳转)
  True就跳走,False才能跑到A,所以这里要修改,把她nop掉
  再看看程序从哪里跑到B的呢?有2个地方,一是C,一是E
  先看C,C的跳转是循环跳转,循环结束自然而然就会跑去B,所以这里跳转不修改
  再看C的上面是D,而D的上面正好就是E
  E的跳转不管是True还是False,最后都是能够跑到B的,所以这里也不修改
  再来看程序从哪里跑到E的呢?也是2个地方,一是F,一是J
  F上面是G,再上面是H,G是一个小循环,而F、G、H则构成一个大循环
  不管怎么循环,循环多少次,最后还是要跑到E的,所以里面的循环跳转不管
  大循环上面是I,再上面是J,哈哈,跟前面的情况一样是吧
  J的跳转不管是True还是False,最后都是能够跑到E的,所以这里也不修改
  就是这样一步一步的往上反推,K也是循环,不管
  注意L,L的跳转False能顺利跑到K,但是True的话就跳到后面,跳过A,所以要修改
  同理M、N、O都是要修改才能使程序最终顺利到达A
  不过前面跟踪程序的时候知道L、M、N、O这4个地方是用来判断用户名和注册码长度的
  O的cmp eax,0Ah(=10)和N的cmp eax,10h(=16)限定用户名长度X:X>=10且X<=16
  M的cmp eax,11h(=17)和L的cmp eax,16h(=22)限定注册码长度Y:Y>=17且Y<=22
  所以,只要我们输入的用户名和注册码长度符合程序的规定,也是能够顺利跑到K
  
  综上所述,只要我们输入的用户名和注册码长度符合程序的规定
  再把B的跳转nop掉,就能达到目的,注册成功!(此修改测试通过)
  其实你也可以修改L、M、N、O这4个地方,破除程序对用户名和注册码的规定!
  还有,注册码的生成过程也在布局图里,算法暂时不分析(不知道能不能分析总结出来)
  
  看到这里是不是觉得暴力crack很简单?
  只要能找到关键代码,再把代码转成布局图,暴力crack就会变得很轻松愉快^_^
  要是在crack前面提到的那个修饰图片的软件的时候
  用IDA得到关键部分的布局图(可惜当时不知道IDA有这个功能)
  估计不会跟踪到最后才发现程序的bug
  
  如果能把程序流程描绘出来,修改会变得游刃有余
  而且可以大刀阔斧,甚至充满想象力,暴力crack真的可以很暴力
  
  下面通过一种大胆的修改,展示一下充满想象力的暴力^_^
  注意O的跳转,False跳到N,True的话跳到A下面的P
  我把O的jl loc_48C844改成jmp loc_48C81F(这是B的地址,B的第一行标出该地址)
  作用是把指向P的箭头强行拉去指向B,等于删除O与B之间的大部分代码
  再把B的跳转nop掉,猜猜看会发生什么情况?
  现在输入任意用户名和注册码或者不输入任何字符都能注册成功!(此修改测试通过)
  哈哈,是不是有点神奇?!
  也许你们会想到:能不能从O直接跳到A,只能说是个未知数(高手也许可以解答)
  以前尝试过这种更大胆的跳转,但是没有成功,会报内存出错
  所以,就算这个crackme可以成功,也不能保证其他的都能成功
  
  PS:
  你也可以在两点之间插入自己的代码,不过更加困难(好像涉及PE的修改)
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年06月22日 23:14:30

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 47
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错啊。支持~~~
2009-6-26 11:13
0
雪    币: 199
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
经典,狂顶!!!再出几篇这样的
2010-3-5 14:36
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持!!!!!支持!!!
2010-3-5 15:52
0
游客
登录 | 注册 方可回帖
返回
//