Apk 分析与Hook技术

个人博客 http://blog.csdn.net/qq_22329521/article/details/52335180
Android技术防范与揭秘总结

APK静态分析##

静态分析指,在不允许代码的情况下,通过词法分析,语法分析,控制流,数据流

分析等技术对程序代码进行扫描,验证代码是否满足规范性,安全性可靠性,可维

护行等指标的一种代码分析技术。

常用的分析利器##

查看源码工具dex2jar jd-gui
dex2jar 将apk中的class.dex 转化为jar文件,而jd-gui是一个反编译工具,可以

直接查看jar包中的源代码
使用命令 d2j-dex2jar classes.dex

dex2jar 官网地址 http://code.google.com/p/dex2.jar
jd-gui 官网地址http://jd.benow.ca

APK逆向工具 APKTool
使用apltool d xxx.apk -o c://xxxx
apktool 官网地址 https://code.google.com/p/android-apktpool/

android 逆向助手 是国人常使用的的工具分装的工具箱 包括了apktool,jd-gui

dex2jar 等,主要有反编译apk 打包apk 对apk签名等

反汇编IDA pro

APP种类##

目前的应用分为3类 WebApp,Hybrid App Native App 分析各自的优劣

原生app
优点:用户体验好,性能稳定,操作速度快,上手流 畅,访问本地资源(通讯录,相册),设计动效和 转场
通知和体系,用户留存率高
缺点:分发成本高(不同平台不同的开发语言和界面适配);维护成本高(最新版为V5 但是还有v2 v3的用户) 更新缓慢,根据不同平台的审核提交的流程复杂

网页app
优点 :开发成本低,更新快 更新无需通知用户,不需要手动升级,能够跨平台和终端
缺点:临时的入口,无法获取系统级别的通知,提醒 动效等用户留存率低,设计受限制诸多,体验较差

反编译后的结构##

  1. assets 声音,字体 网页等资源
  2. org 第三方库 如org.appache.http
  3. com 第三方库
  4. lib 应用中使用到的库
  5. -armebi .so 文件 c/c++代码库文件
  6. -META-INF APK签名文件
  7. -classes.dex java源代码编译后的代码文件
  8. -resources.arsc 编译后的资源文件

在反编译后得到的smaill的代码,如果要插入自己的smaill代码 大多均是将自己写好的java代码反编译后为smali代码将其拷贝到其中

常用的smail代码##

//增加log信息
const-string v3,"SN"
invoke-static {v3,v0}, Landroid/util/Log;->v

(Ljava/lang/String;Ljava/lang/String;)I


//2.弹出消息框
new AlertDialog.Builder(self)
.setTitle("普通对话框")
.setMessage("你好,Android!")
.show();


new-instance v1,Landroid/app/AlertDialog$Builder;

invoke-direct {v1,p0}, Landroid/app/AlertDialog$Builder;->

(Landroid/content/Context;)V

.line 29
.local v1,builder:Landroid/app/AlertDialog$Builder;
const-string v2,"\u666e\u901a\u5bf9\u8bdd\u6846"

invoke-virtual {v1,v2}, Landroid/app/AlertDialog$Builder;->setTitle

(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;

.line 31
const-string v2,"\u4f60\u597d\uff0cAndroid!"

invoke-virtual {v1,v2},Landroid/app/AlertDialog$Builder;->setMessage

(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;

.line 52
invoke-virtual {v1},Landroid/app/AlertDialog$Builder;->create

()Landroid/app/AlertDialog;

move-result-object v2

invoke-virtual {v2},Landroid/app/AlertDialog;->show()V

分析SO文件##

在Android 上使用NDK 进行Java+C编程
jni-》c/c++代码 -》编译-》ndk-》so文件

NDK开发##

在AS环境下 http://blog.csdn.net/why7788521521/article/details/51537207
http://blog.csdn.net/yanbober/article/details/45309049

反汇编##

在Android设备上反汇编指的是针对NDK开发出来的SO文件进行逆向。
反汇编是指将目标代码转化为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码,低级转高级, 因为c/c++ pascal等高级语言编译会生成计算机语言,不像java的虚拟机指令集,所以我们能够对计算机语言进行逆向,即反汇编。

ida pro 下载地址

http://download.csdn.net/detail/equationdz/9340659#comment
打开.so 文件 在左侧可以查看到

Apk 分析与Hook技术_第1张图片
这里写图片描述

在JNI函数中 都是以java+包名开头, 所以为什么试试java开头是我们相关的函数

按住f5 上面提供了
伪代码插件,可以很我们的源代码相比较,除了变量名名称变化了以外,其他均相

int __fastcall 

Java_com_example_ndkproject_NdkJniUtils_getCLanguageString(int a1)
{
  return (*(int (**)(void))(*(_DWORD *)a1 + 668))();
}

APK动态分析##

在真实或模拟的环境下执行程序进行分析的方法。多用于性能测试,功能测试,内

存泄漏测试等
调试工具为DDMS,emulator ,AndBug,IDA PRI等测试工具

分析##

  1. 代码安全分析
  2. 组件安全分析:针对Android 的四大组件,组件间的通信,以及他们权限的使用不当如恶意调用,恶意接受数据,恶意发送广播,拦截有序广播等
  3. 存储安全分析常见问题:对数据库文件,私有文件证书等,进行安全验证分析,特别是对明文存储敏感数据(将隐私数据明文存储在外部存储,将系统数据明文保持在外部存储,将软件运行时依赖的数据保持在外部缓存,将软件安装包或者二级制代码保持在外部存储,全局可读写的内部文件存储)
  4. 通行安全分析:对敏感数据进行传输采用基于SSL/TLS的HTTPS传输。
  5. Log进行逻辑跟踪,如果程序原本没有log 可以根据跟踪,注入log分析,为了避免被注入,在xml中的Application加入android:debuggable="false" 系统会终止调试属性,Log也就出不来
  6. TraceView进行方法跟踪,在DDMS下


    这里写图片描述

    得出数据图


    Apk 分析与Hook技术_第2张图片
    这里写图片描述

    可以对每一个方法与每一个进程占用的时间面板,显示该方法所占用的现场CPU使用率,cpu执行时间,等参数
  7. 网络抓包 采用Fiddler这个工具,能够记录你电脑上与互联网之间的http通行,设置断点,和所有数据
    抓包的原理:Fiddler以代理Web服务器的形式工作,设备上的所有网络请求,响应优先给代理服务器,然后由代理服务器转发,Fiddler的功能能够修改断点,在设置好断点中修改response,和Request 包括host cookie 返回的json等数据
  8. AndBug http://bbs.pediy.com/showthread.php?t=183412
    AndBug 最重要的功能就是断点分析 使用步骤 确定需要调试的类和方法,查找定位该方法,设置断点,断点分析查看该变量。在实际情况下,应用的逻辑往往很复杂,我们需要多次反复执行以上步骤,才能够分析应用中的逻辑。
  9. Chrmoe插件调试, facebook推出的 Stetho和一个叫Firebug 可以结合Chrome 对App进行调试
  10. WebView的漏洞问题:WebView 在使用jaddJavascripInterface 天加一个js调用本地方法的命令,造成WebView显示网页的时候,在javascript会存在一个本地引用,远程的网页可以从此类使用反射来执行的command
  11. 网络钓鱼:模仿二维码生产一个test2.com 与test.com 在扫描恶意的二维码,在浏览器上弱化了网址显示
  12. SQLite注入攻击(应该都会注意)构造一个正确的sqlite拼接

Hook##

在Android操作系统中系统维护着自己的一套事件分发机制。应用程序,包括应用触发事件和后台逻辑处理,也是根据事件流程一步步的向下执行。而“钩子”的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子勾上事件一样。并且能够在勾上事件时,处理一些自己特定的事件如图

Apk 分析与Hook技术_第3张图片
这里写图片描述

它的作用,它能够将自身的代码融入到被勾住的程序的进程中,成为目标进程的一部分。Android的系统使用了沙盒机制,普通用户进程空间都是独立的,程序的运行彼此不受干扰。所以我们希望能通过一程序改变其程序的某些行为。

Hook原理##

hook其本质就是挟持函数的调用,由于每个进程都是独立的,所以必先注入到所需要hook的进程空间,修改其内存中的进程代码,替换其过程表的符号地址。在Android中一般都是通过ptrace函数附加进程,然后想远程进程注入so库,从而达到监控以及远程进程关键函数挂钩。

Hook的工作流程##

注入代码所需要解决的问题
需要注入的代码我们存放到哪里?
如何注入代码
我们不能只在自己的进程中载入动态链接库,如何使进程附上目标进程
如何让目标进程调用我们的动态链接库

在Android的内核中有一个函数叫ptrace,它能够动态的attach(跟踪一个进程),detach (结束一个进程),peektext(获取内存字节),poketext(向内存写入地址),它能够满足我们的需求。而Android另一个内核函数dlopen ,能够指定模式打开指定的动态链接库文件,对于程序的指向流程,我们可以调用ptrace让pc指向LR堆栈 ,最后调用。对目标进程调用dlopen则能够将我们希望注入的动态库注入至目标进程。

步骤

  1. 用ptrace函数attach上目标进程
  2. 发现装载共享库so函数
  3. 装载指定的.so
  4. 让目标进程执行的流程跳转到注入的目标代码中执行
  5. 使用ptrace函数detach释放目标进程

常用的Hook工具

  1. Xposed框架
  2. Cydistrate框架
  3. ADBI/DDI框架

Hook能做什么

  1. 修改系统API
  2. 给指定应用注广告
  3. App登录挟持
  4. 对Native层hook,替换方法
  5. 对广告进行拦截

你可能感兴趣的:(Apk 分析与Hook技术)