Chapter2——如何分析Android程序
前几天买了《Android软件安全与逆向分析》这本书,决定在这里记一些笔记。
第一章介绍了如何搭建环境,此处略去;第二章开始讲分析Android程序。
下面按顺序记录关键内容。
--------------------------------------
2.1.编写一个需要填写注册码的APK
要破解要现有「试验品」,作者编写了一个叫做crackme02的APP,
主要代码有:
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.result();
digest.update(userName.getBytes());//采用MD5对用户名进行Hash
byte [] bytes = digest.digest();//将计算结果转换为长度32位的16进制字符串
StringBuilder sb = new StringBuilder();
for (int i = 0 ; i <hexStr.length() ; i += 2)//取字符串的奇数位重组为新的字符串,which is SN
sb.append(hexStr.charAt(i));
StringuserSN = sb.toString();
if(!userSN.equalsIgnoreCase(sn))
return false ;
题外话,介绍一下Hash:
Hash,一般翻译做“散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。
而MD5可以说是目前应用最广泛的Hash算法。
上面那段代码使用MD5算法计算用户名字符串的Hash,将计算所得的结果转换成长度32位的16进制字符串,然后取字符串的奇数位重新组合成新的字符串,也就成了注册码。然后就是一个判断语句。
接下来他写了一个简单的界面,要求填入用户名和注册码,然后点击注册按钮。
2.2破解第一个程序
破解2.1中写的那个程序。作者用Apktool反编译了apk,得到smali格式的反汇编代码,以及res文件夹中的资源。
突破口是之前编写的程序中的strings.xml中的错误提示。
打开strings.xml,定位到这一行:
<string name = "unsucceeded">无效的用户名或注册码</string>
strings.xml所有的字符串资源都在"gen/<package name>/R.java"文件的String类中被标示,如图:

每个字符串都有唯一的int类型的索引值。用Apktool反编译之后,所有的索引值都保存在strings.xml文件同名目录下的public.xml中,如下图:

(注意这两张图的app_name不是同一个应用的所以才不同。因为只有用apktool反编译之后才会产生res/public.xml,而得不到gen中的R.java。我没有特意去反编译这个应用而是随便找了个反编译好的apk。)
作者在public.xml中找到了unsucceeded对应的id:
<public type="string" name="unsucceeded" id="0x7f070024" />
然后在smali目录中搜索含有内容为0x7f070024的文件,发现只有MainActivity$1.smali文件一处调用。打开这个文件,代码一大堆,
找到关键的一段:
invoke-static {v0,v1,v2},Lcom/droider/crackme0201/MainActivity;->access$2.....;Ljava/lang/String;)Z #检测注册码是否合法
move-result v0
if-nez v0, :cond_0 #如果结果不为0,就跳转到cond_0:处
....
cond_0
....
把一个Boolean值保存到v0,如果条件为真则跳转到cond_0,否则顺序执行。
显然,把if-nez调成if-eqz就可以了。
然后用apktool b命令重新编译打包成apk。
接下来用signapk.jar对apk签名signapk是源码中的一个签名工具。可以用Android源码中的签名文件testkey.pk8,testkay.x509.pem作为签名文件。具体签名步骤就不介绍了,在书的26页。
然后是安装。他用了adb install signed.apk把这个安装到了AVD里面。然后只要在在注册码中输入任意的东西就可以了。
----------
这篇文章重要的点在于:
通过strings.xml中的文字来定位到unsucceeded,
然后在public.xml中找到它的id,
再在smali文件中找对应的smali文件
这三个步骤。
跟这个差不多:http://bbs.pediy.com/showthread.php?t=153295
Chapter2——如何分析Android程序的更多相关文章
- 在Eclipse中使用MAT分析Android程序内存使用状况(转)
对于Android这种手持设备来说,通常不会带有太大的内存,而且一般用户都是长时间不重启手机,所以编写程序的时候必须要非常小心的使用内存,尽量避免有内存泄露的问题出现.通常分析程序中潜在内存泄露的问题 ...
- 【Bugly干货分享】手把手教你逆向分析 Android 程序
很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...
- 分析Android程序之破解第一个程序
破解Android程序通常的方法是将apk文件利用ApkTool反编译,生成Smali格式的反汇编代码,然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口进行修改,最后使用ApkToo ...
- 如何用MAT分析Android程序的内存泄露
本文结合<Android开发艺术探索>书籍中的内存分析例子来讲解如何利用MAT工具来查找内存泄漏(以AndroidStudio开发工具为例). 1.下载MAT(Eclipse Memory ...
- Android程序backtrace分析方法
如何分析Android程序的backtrace 最近碰到Android apk crash的问题,单从log很难定位.从tombstone里面得到下面的backtrace. *** *** *** * ...
- Android 程序静态分析
简介 静态分析是探索Android程序内幕的一种最常见的方法,它与动态调剂双剑合璧,帮助分析人员解决分析时遇到的各种“疑难”问题. 静态分析是指在不运行的情况下,采用词法分析.语法分析等各种技术手段对 ...
- 1.3.4分析你的第一个Android程序——Android第一行代码(第二版)笔记
切换项目结构模式 Project模式的项目结构 我们将项目切换成Project模式,这就是真实的目录结构. .gradle和.idea 这两个目下放置的都是Android Studio自动生成的一些文 ...
- 分析你的第一个Android程序
目录 分析你的第一个Android程序 Android模式的项目结构 切换项目结构模式 Project模式的项目结构 .gradle和idea app build(没有发现这个文件夹) gradle ...
- Android 程序分析环境搭建-Android 9 -代码下载编译
Android 9 -代码下载编译 一,翻墙下载: 1.背景: 背景: 现在Android framework 开发的同学,整体在公司里面解一些无关痛痒的bug,对于Android framework ...
随机推荐
- 算法——字符串匹配之BM算法
前言 Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法(简称BM算法),后缀匹配就是模式串从右到左開始比較,但模式串的移动依旧是从左到右的.在实践中.BM算法效率高于前面介绍的<KM ...
- JavaWeb页面添加隐藏版权信息
JavaWeb页面添加隐藏版权信息. 首先,我推荐一个值得玩味的版权站点,有兴趣的朋友能够去看上一看.Nazo Level 1,这个demo中我能发掘到有5个步骤,你看你能发现几层? 接下来.我来介绍 ...
- python(16)- python内置函数
python内置了一系列的常用函数,以便于我们使用,python英文官方文档详细说明:https://docs.python.org/3/library/functions.html Buil ...
- MySQL 压缩解决方案
From:https://www.qcloud.com/community/article/876100 导语 描述 MySQL 压缩的使用场景和解决方案,包括压缩传输协议.压缩列解决方案和压缩表解决 ...
- crtmp Server 开启rtsp服务功能
Crtmp Server 包含了rtsp 服务功能,如果需要一个简单轻量的rtsp服务,Crtmp Server会是不错的选择. 默认情况下,rtsp功能是关闭的,需要在配置文件中打开.window环 ...
- 在Fedora24/25中轻松安装gcc 4.9
在Fedora24/25中轻松安装gcc 4.9 http://blog.csdn.net/u010158659/article/details/53608285 标签: gccgcc-4.9Fedo ...
- EasyDarwin开源流媒体server将select改为epoll的方法
本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org) 一. EasyDarwin网络模型介绍 EventContext负责监听全部网络读写事件.Even ...
- Visual Studio 2010无法启动调试
现象:Visual Studio 2010点击调试或者按F5.Visual Studio 2010没有什么反应,但又不报错. 而点击运行不调试(Ctrl+F5)却没有问题. 解决的方法:打开项目属性, ...
- iOS开发- OpenGL ES屏幕截图
之前写过一个常规的屏幕截图:http://blog.csdn.net/hitwhylz/article/details/17189351 可是发现这个办法对于OpenGL 无用. 获取到的数据为空. ...
- 51 NOD 1753 相似子串 字符串hash
1735 相似子串 基准时间限制:5 秒 空间限制:131072 KB 分值: 80 两个字符串相似定义为:1.两个字符串长度相等2.两个字符串对应位置上有且仅有至多一个位置所对应的字符不 ...