Android逆向实例笔记—破解第一个Android程序_crackme02

来源:互联网 发布:linux shell脚本编写 编辑:程序博客网 时间:2024/06/05 04:43
本实例来源于《Android软件安全与逆向分析》这本书,作者是看雪的非虫,感谢提供这么好的书和实例。

一、工具
干什么都得一个好工具对吧。
1.apkIDE
反编译呢,我这里使用的是apkIDE(apk改之理),工具的话自己百度吧。个人不喜欢留一些不需要的东西在网盘里,难得整理,百度一大堆。我这里就给一个官网吧,免得有些童鞋找错了地方。现在这下下载网站一不小心,什么全家福都来了。好了,扯得有点远了。我用的就是最新版,我个人就喜欢最新版。(最新版可能有些问题)
http://www.popotu.com/popo/apkide.html
上个样图:

2.蓝叠
只要是模拟器都可以,我个人觉得这个好用。随便找一个都行。官网:http://www.bluestacks.cn/
样图:

二、查看源程序
这里我们直接拖拽crackme02到蓝叠中,安装



然后我们点开看看效果。






我们可以看到左上角有个程序未注册。我们随便输入字符,点击注册。发现Toast提示我们,无效用户名或注册码。
此时,我们就该上我们的工具了

三、反编译

1.工具的使用
这里详细介绍一下apkIDE的使用。
打开apkIDE


点击项目,然后点击打开apk,选择我们的crackme02。

看输出框的进度,之后就可以进行我们的操作了。



反编译之后的文件目录



其中smali中存放的是反汇编的代码。
res是所有的资源文件。
都与开发目录一致。

2.strings.xml

我们知道在开始的时候,我们一般会一些字符放到strings.xml文件中去。这里我就打开strings.xml文件。
文件在:res-values-strings.xml



现在我们看看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提示我们错误的地方



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。然后点击搜索全部。



我们可以看到下面的搜索结果显示了出来,我们双击这一行,就会跳到我们所需要找的位置。



然后我们记住id:0x7f05000c。
3.smali
这个时候我们还得使用我们的搜索。方法类似,不在赘述。我们要选择搜索smail



我们发现有两处。
第一处const v1, 0x7f05000c   
于是我们双击过去。
然后往上找跳转的地方。
    move-result v0
    if-nez v0, :cond_0

这里第一行代码返回的结果存到v0中去,第二行是对v0进行判断。如果值为0,就往下运行,也就是弹出未注册的地方。如果不为0,就跳转到cond_0处。



那么也就是这里如果跳转成功就会跳转,那么程序就是成功。

四、修改smali
这里是nez,不等于0,那我们就修改为eqz,等于0。



重点中的重点,修改完之后,一定记得保存。不然可能编译错误或者,没有编译修改后的代码。

然后我们点击编译,编译生成apk



看输出框的进度和文件路径,我们就去查找我们的apk。一般来说就在原apk旁边。重新编译签名后的apk名字前面会加上ApkIDE_




五、验证
重新编译好的apk我们需要来验证一下是否成功。
我们拖拽到蓝叠中,安装打开。


这里发现我们已经破解成功了。

最后给出apk的下载吧。
https://yunpan.cn/cMuPerPjatc6S  访问密码 24ce
说的有错误或者不对的地方欢迎指正讨论。大笑

3 0