Android逆向实例笔记—破解第一个Android程序_crackme02
本帖最后由 牵走天涯 于 2016-8-25 12:31 编辑本实例来源于《Android软件安全与逆向分析》这本书,作者是看雪的非虫,感谢提供这么好的书和实例。
本人菜鸟一枚,初始Android逆向,这里写的很详细的过程以及apkIDE的使用。很适合入门的童鞋看看参考下。大神就路过吧。最后还要感谢吾爱提供这么好的学习平台。
一、工具
干什么都得一个好工具对吧。
1.apkIDE
反编译呢,我这里使用的是apkIDE(apk改之理),工具的话自己百度吧。个人不喜欢留一些不需要的东西在网盘里,难得整理,百度一大堆。我这里就给一个官网吧,免得有些童鞋找错了地方。现在这下下载网站一不小心,什么全家福都来了。好了,扯得有点远了。我用的就是最新版,我个人就喜欢最新版。(最新版可能有些问题)
http://www.popotu.com/popo/apkide.html
上个样图:
http://img.blog.csdn.net/20160824200112039?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
2.蓝叠
只要是模拟器都可以,我个人觉得这个好用。随便找一个都行。官网:http://www.bluestacks.cn/
样图:http://img.blog.csdn.net/20160824200125352?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
二、查看源程序
这里我们直接拖拽crackme02到蓝叠中,安装。
http://img.blog.csdn.net/20160824200501403?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
然后我们点开看看效果。
http://img.blog.csdn.net/20160824200616092?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
我们可以看到左上角有个程序未注册。我们随便输入字符,点击注册。发现Toast提示我们,无效用户名或注册码。
此时,我们就该上我们的工具了
三、反编译
1.工具的使用
这里详细介绍一下apkIDE的使用。
打开apkIDE
http://img.blog.csdn.net/20160825101837703?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
点击项目,然后点击打开apk,选择我们的crackme02。
看输出框的进度,之后就可以进行我们的操作了。
http://img.blog.csdn.net/20160825101932272?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
反编译之后的文件目录
http://img.blog.csdn.net/20160825102002298?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
其中smali中存放的是反汇编的代码。
res是所有的资源文件。
都与开发目录一致。
2.strings.xml
我们知道在开始的时候,我们一般会一些字符放到strings.xml文件中去。这里我就打开strings.xml文件。
文件在:res-values-strings.xml
http://img.blog.csdn.net/20160825102042445?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
现在我们看看strings.xml中的内容
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Crackme0201</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">crackme02</string>
<string name="info">Android程序破解演示实例</string>
<string name="username">用户名:</string>
<string name="sn">注册码:</string>
<string name="register">注 册</string>
<string name="hint_username">请输入用户名</string>
<string name="hint_sn">请输入16位的注册码</string>
<string name="unregister">程序未注册</string>
<string name="registered">程序已注册</string>
<string name="unsuccessed">无效用户名或注册码</string>
<string name="successed">恭喜您!注册成功</string>
</resources>
我们可以很容易的看到,Toast提示我们错误的地方
http://img.blog.csdn.net/20160825102648234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
3.public.xml
我们知道每个字符都有唯一的int类型的索引值。
于是我们打开strings.xml上面的public.xml文件。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<public type="drawable" name="ic_launcher" id="0x7f020001" />
<public type="drawable" name="ic_action_search" id="0x7f020000" />
<public type="layout" name="activity_main" id="0x7f030000" />
<public type="dimen" name="padding_small" id="0x7f040000" />
<public type="dimen" name="padding_medium" id="0x7f040001" />
<public type="dimen" name="padding_large" id="0x7f040002" />
<public type="string" name="app_name" id="0x7f050000" />
<public type="string" name="hello_world" id="0x7f050001" />
<public type="string" name="menu_settings" id="0x7f050002" />
<public type="string" name="title_activity_main" id="0x7f050003" />
<public type="string" name="info" id="0x7f050004" />
<public type="string" name="username" id="0x7f050005" />
<public type="string" name="sn" id="0x7f050006" />
<public type="string" name="register" id="0x7f050007" />
<public type="string" name="hint_username" id="0x7f050008" />
<public type="string" name="hint_sn" id="0x7f050009" />
<public type="string" name="unregister" id="0x7f05000a" />
<public type="string" name="registered" id="0x7f05000b" />
<public type="string" name="unsuccessed" id="0x7f05000c" />
<public type="string" name="successed" id="0x7f05000d" />
<public type="style" name="AppTheme" id="0x7f060000" />
<public type="menu" name="activity_main" id="0x7f070000" />
<public type="id" name="textView1" id="0x7f080000" />
<public type="id" name="edit_username" id="0x7f080001" />
<public type="id" name="edit_sn" id="0x7f080002" />
<public type="id" name="button_register" id="0x7f080003" />
<public type="id" name="menu_settings" id="0x7f080004" />
</resources>
找到我们需要的unsuccessed。如果觉得很难找,那么我们搜索功能就来了。
在搜索内容里面写上unsuccessed,然后搜索范围选择选中的文件或文件夹,左边我们选择public.xml。然后点击搜索全部。
http://img.blog.csdn.net/20160825102801818?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
我们可以看到下面的搜索结果显示了出来,我们双击这一行,就会跳到我们所需要找的位置。
http://img.blog.csdn.net/20160825102859097?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
然后我们记住id:0x7f05000c。
3.smali
这个时候我们还得使用我们的搜索。方法类似,不在赘述。我们要选择搜索smail
http://img.blog.csdn.net/20160825102938363?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
我们发现有两处。
第一处const v1, 0x7f05000c 于是我们双击过去。
然后往上找跳转的地方。
move-result v0
if-nez v0, :cond_0
这里第一行代码返回I的结果存到v0中去,第二行是对v0进行判断。如果值为0,就往下运行,也就是弹出未注册的地方。如果不为0,就跳转到cond_0处。
http://img.blog.csdn.net/20160825103131647?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
那么也就是这里如果跳转成功就会跳转,那么程序就是成功。
四、修改smali
这里是nez,不等于0,那我们就修改为eqz,等于0。
http://img.blog.csdn.net/20160825103219773?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
重点中的重点,修改完之后,一定记得保存。不然可能编译错误或者,没有编译修改后的代码。
然后我们点击编译,编译生成apk
http://img.blog.csdn.net/20160825103416775?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
看输出框的进度和文件路径,我们就去查找我们的apk。一般来说就在原apk旁边。重新编译签名后的apk名字前面会加上ApkIDE_
http://img.blog.csdn.net/20160825103454102?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
五、验证
重新编译好的apk我们需要来验证一下是否成功。
我们拖拽到蓝叠中,安装打开。
http://img.blog.csdn.net/20160825103542274?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
这里发现我们已经破解成功了。
最后给出apk的下载吧。
https://yunpan.cn/cMuPerPjatc6S访问密码 24ce
说的有错误或者不对的地方欢迎指正讨论。http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif
最后开心的给点热点和CB吧。{:17_1068:}(帖子反反复复改了三四次,只为了大家好看点,大家就多给点热心吧{:1_932:})
好吧,做事有始有终。虽然没有什么技术含量。我还是把它修改好了,图片重新加上了。
我发现,下面的图片加载不出来。仔细想了想。原来是前面的图片我是保存本地再上传的,后面我发现了直接截图粘贴就可以了,然后就偷懒了。结果就gg,不知道什么吾爱这样显示不出来,现在补图貌似有些麻烦。初学的同学就移步一下我的博客吧。这次实在不好意思了,对不起各位看官了,下次我一定注意,不敢偷懒了!
{:1_937:} 牵走天涯 发表于 2016-8-27 20:13
我也还没学脱壳的,反正我学一点,发一点嘛
啊哈哈希望看到你的教程,感觉写的很简单( ˙˙ ) 一楼我自己的。
CSDN我的博客。
http://blog.csdn.net/qq_24349189 这简直太让人伤心了。居然一个回复都没有 @猫子1992基础的话,首先是java,然后看看Android开发。 没有点编程基础,找关键跳真不容易 爱的漩涡 发表于 2016-8-25 12:27
没有点编程基础,找关键跳真不容易
那就的多学学java 牵走天涯 发表于 2016-8-25 12:30
那就的多学学java
谢谢你的建议:loveliness: 跟着楼主一起学习~~{:1_921:} i不错,感谢分享。