Mac OSX 之自己动手初步学习破解软件入门

本软件破解学习教程,仅用于学习软件原理知识,还请各位童鞋(尤其是软件开发的童鞋)养成知识产权的保护意识,拒绝盗版,尊重他人.本篇通过手动创建一个Mac osx应用,然后进行破解学习,一步一步分析,到最后完成破解目标,通篇没有高深的理论术语,因此仅用来作为初步学习的一个引子,供各位童鞋或爱好者在软件运行原理的学习中提供一个微薄的参考而已...

0. 学前准备:

1. Mac OSX下的反汇编工具: Hopper Disassembler (本示例使用v4.0.8)

2. 基本的汇编指令(比如mov ,xor ,jmp,je 等)

3. 没有其他啦,马上开始动手吧

1. 先手动创建一个简单的Mac OSX应用

关于如何具体创建简单的Mac OSX 应用,请移步我之前翻译的三篇系列入门一步一步,开始上手Mac开发

或者可以从这里下载示例中的应用demo工程:github.com/Alexiuce/Tip-for-day/tree/master/CrackDemo

我们创建的这个简单应用,是模仿注册码验证的一个逻辑判断(其实你也可以把这个当作是登录验证,道理是相同的),如果用户输入1234,我们认为是正确的结果,显示验证通过,否则都会显示验证码错误这样的提示信息

应用的界面大致如下图:

示例界面

从Xcode工程中提取应用

运行工程后,会在Products中,生成一个 "项目名称.app"的应用,这个就是我们的目标应用,然后在finder中找到它,并拷贝到桌面备用(我们后续的破解都是针对这个来进行的~)


提取项目工程中的应用程序

先来运行一下破解前的程序,它的样子差不多跟下面图片相似

破解前的运行情况

开启破解之旅

1 打开Hopper Disassembler

Hopper Disassembler工具的默认启动界面

2. 将需要破解的应用(就是demo.app)拖入到Hopper中

拖入我们的demo.app到Hopper中

确认选择界面

确认

加载后的界面,入下图

加载后的界面

这个界面的布局和Xcode非常相似,大家不要被一些看不懂的内容界面和工具栏迷惑而感到微微的手足无措(笔者第一次看到这个界面,也是茫然的~),我们下面把基本上常用的会一一介绍,其他的的功能按钮,先当作不存在(催眠式提升信心法~~),好,我们先来看一下工具栏下面的左侧Labels窗口:

Labels窗口

这个Labels窗口中列出的是应用被反编译后可以识别出来Objective-c方法,看到这些熟悉的方法名,小伙伴们是不是一下子感觉又回到Xcode代码中啦,让我们先忘记掉我们之前写过的工程代码,从这个列表里,我们根据方面名称,大致可以推断(破解的一个要素就是要有根据的猜测)出这几个方法的用途:

[ViewController viewDidLoad] ====>  视图生命周期方法,加载视图的时候调用

[ViewController checkCode:] ====>  从名字可以看着,这个方法是用来做验证检查的(后面会进一步分析)

[ViewController textField] : ====>  get方法,获取文本输入控件

[ViewController setTextField: ] ====> set方法,设置文本输入控件

[ViewController tintLable]  ==== >  get方法,获取提示文本控件

[ViewController setTintLabel:]   ====> set方法,设置提示文本控件

3.查看checkCode:方法

我们根据方法名列表,最值得怀疑的就是checkCode:(就像如果破解一个软件的vip身份,那么如果看到isVip就应该给予特别注意一样)

查看checkCode:的逻辑(右侧显示的部分很重要)

从这个图里的右侧流程部分,我们可以看出checkCode这个方法的执行逻辑是这样的:

checkCode方法入口---> 执行一些代码(我们先不管这些代码在做什么)--->选择两个分支代码段中的一个执行---> 再执行一些代码后,checkCode方法结束

checkCode:方法的逻辑流程图

4.假设阶段

查看汇编代码

这三行汇编代码是:

mov al,byte [rbp+var_29]     ====> 这句汇编的含义相当于我们使用高级语言里的赋值语句,例如 al = 123(这里是为了理解写al = 123来举例,程序运行真实的al值并不是123),我们先把al当作一个变量来看,不去想al寄存器的事情

cmp al,0x0    ====> 这个汇编的含义是进行两个值的比较 ,我们可以把它想象成一个高级语言的比较函数,后面是两个参数,例如cmp(a,b), 执行后返回比较的结果,汇编执行比较,其实是做减法运算,因此两个数相减会有三种情况,分别是大于零,等于零,小于零,这三种结果,有可以简单分为两个:相等,或不相等

je loc_10001054  ====> 这个汇编的含义,我们可以认为是 相等(equality), 不相等是jne, 在汇编中,一般cmp后面都会根上类似的判断跳转语句. 因此这行代码下面会有两个分支(参考方法的流程图),如果cmp的比较结果是相等,就执行 loc_10001054 这个分支,否则就执行另外的那个分支(方法流程图中红色线条指向的那个分支)

从这个代码逻辑,我们可以简单的猜测出来应用里判断验证码的逻辑是这样的:

if (输入的内容 == 验证码) {显示正确结果(分支1)}else{显示错误结果分支2)}

5.求证阶段

现在我们面临的问题是,哪个分支才是正确结果的那个部分呢?

我们不必去读懂两个分支的汇编代码(如果你有兴趣另说),只需要修改逻辑并根据执行结果来验证就好了,比如,我们去除掉je loc_10001054 这个相等就执行的汇编代码,这样,checkCode的执行逻辑就被我们修改为没有分支loc_10001054的直线流程了.好,先动手试试

切换工具栏按钮

替换掉je loc_10001054这条汇编指令(就是去掉条件判断,不管比较结果如何,都会执行固定的分支)

替换空指令
替换后的结果

保存修改后的结果,生成新的可执行文件

保存修改结果,生成新的可执行文件

保存的路径一定不能与demo.app相同!

保存的路径一定不能与demo.app相同!!

保存的路径一定不能与demo.app相同!!!

保存新的可执行文件

使用新的可执行文件,替换掉破解前的可执行文件:

在demo.app上点击右键,显示包内容
用破解的文件替换原来的
替换后示例

运行破解后的demo.app

破解的运行结果

小结与讨论

到这里我们貌似已经完成了破解工作,但其实是有很大的运气成分(我们只选了一个分支就碰巧是验证通过的那个代码分支),大家可以考虑如果我们这个分支是无论怎么输入都是显示错误的那个分支,应该怎么办呢?其实很简单,就是把je换成jne就可以了,有兴趣的可是试试,我这里就不再详细描述了(点选Modify菜单->Assemble Instruction 可以手动输入新的汇编指令,把je 替换成jne就可以哦)

最后,给有兴趣的童鞋留个疑问,如果找到原来正确的验证码呢? 大家自己动手看看吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容

  • 8086汇编 本笔记是笔者观看小甲鱼老师(鱼C论坛)《零基础入门学习汇编语言》系列视频的笔记,在此感谢他和像他一样...
    Gibbs基阅读 37,223评论 8 114
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,223评论 25 707
  • 先放张图镇楼,哈哈,之前看到在简书上别人发的苹果,画的特别好,大家都说零基础也可以画,我就想自己也尝试一下。远光感...
    蹒跚学步_阅读 179评论 0 0