问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
安卓学习思路方法总结(四)
移动安全
分享者才是学习中最大的受益者
这是系列文章的第四篇 我们继续 Android Studio动态调试 ------------------ ### 前言 Android Studio本身并不可以反编译APK 开发用的比较多 它通过导入反编译出来的完整的的Smali代码,然后设置好调试所需的条件,设置断点 断点准备好的条件后,连接模拟器运行待调试的APK的应用程序,然后执行程序的流程运行到Smali代码的时候,断点处会触发一个断点会自动断下来,从而可以进一步分析和调试,整个程序会非常的清晰。 ### 安装 首先来安装一下 ```php https://ibotpeaches.github.io/Apktool/ https://bitbucket.org/JesusFreke/smali/downloads/ https://developer.android.google.cn/studio/ ```  一路默认过去就可以     然后一路next  ### 导入项目包 既然Android Studio不可以反编译 那么我们就首先把APK丢到Android Killer中    我们要的就是这个 反编译完的项目包--Project    然后继续一路默认即可   ### 添加插件    ### 给项目root权限   ### 设置sdk    ### 远程调试    自定义Name 端口不要被占用 选中项目文件夹 即可  ### 安装补丁  adb基本操作 ------- #### 识别设备 ```php adb devices ```  这个就是我的安卓机 #### 进入安卓机 ```php adb shell ```  之前有提到过的  安卓的底层操作系统是Linux操作系统 这个安卓机 我已经将它root过了 #### 查看进程 ```php adb shell ps ```  参数解释 ```php adb shell ps PID:ID PPID:父进程ID VSIZE:进程的虚拟内存大小kb单位RSS:实际占用的大小 RSS:实际占用的大小 WCHAN:进程睡眠的函数名称 PC∶电脑内核函数名称 NAME:包名 ``` 注册机破解 ----- 安卓机中打开注册机程序 ### 项目的入口点 我们找一下  然后我们重新看进程 ```php adb shell ps ```  PID就是:2550 进行转发端口 进行调试 简单来讲 就是把模拟器中的注册机程序和Android Studio进行联动起来 ```php adb forward tcp:8700 jdwp:13362 ```  设置好指定程序后 ### 进行debug  成功连接 这里记录一个 万能重启命令 ```php adb kill-server adb start-server adb remount ``` 我们找到`checkSN()`下断点  然后上安卓机 打开注册机APK   点击注册  这时候会自动断点跳转到`const/4 v7, 0x0`  ```php F7:单步步入F8:单步步步F9:跳转到下一个断点 ``` 当我们F8 一步步向下走之后  看到了跳转MD5算法 开始拼接sb 继续向下走  开始循环拼接sb   ```php userSN="8d9d5d4c03dd33d5" ``` 这个就是我们的注册码 总共循环了32次 在往下走 就跳出循环了  尝试注册码 注册  IDA动态调试 ------- ### 安装 可以看这里:[安卓(一)](https://www.freebuf.com/articles/mobile/280471.html) ### Android Killer反编译APK 当我们拿到一个APK 进行Android Killer进行反编译  导出文件     我们找的就是这个`.so`文件 ### 打开IDA   当我们把so文件直接丢进来之后 会有一个弹窗  IDA提供了两种方法去解析 `ELF`就是so的一个文件格式 `Binary file`是二进制文件格式 那肯定是选第一个咯  然后呢 这个包下除了`.so`文件 还多出好多文件  IDA是递归下降的反汇编工具  地址越来越大 这里是导航条  ```php 蓝色:表示常规的指令函数- 深蓝:用户写的函数编译后的代码区- 浅蓝:编译器自己添加的函数,像启动函数,异常函数等等黑色:节与节之间的间隙#禁区,不存在任何数据银白色:数据内容粉色:表示外部导入符号#有关输入表的一些数据信息暗黄色:表示IDA未识别的内容 ``` ### 主界面 ```php IDA View三种反汇编视图:文本视图、图表视图、路径视图Hex View:十六进制窗口Imports:导入函数窗口Struceures:结构体窗口Exports:导出函数窗口Enums:枚举窗口Strings:字符串窗口 ```   十六进制 修改 按F2即可 默认是6张表 表的添加这里  ### 快捷键 ```php 空格键:切换文本视图与图表视图ESC:返回上一个操作地址G:搜索地址和符号N:对符号进行重命名冒号键:常规注释分号键:可重复注释ALt+M:添加标签Ctrl+M:查看标签Ctrl+S:查看段的信息so代码数据切换C--代码D--数据A--ascii字符串U--解析成未定义的内容X:查看交叉应用F5:查看伪代码ALt+T:搜索文本ALt+B:搜索十六进制 ``` **G:搜索地址和符号**  **Ctrl+S:查看段的信息so**  **ALt+T:搜索文本**  **ALt+B:搜索十六进制**  环境安装 ---- ### 上传android\_server 首先来到IDA的`dbgsrv`目录 ```php C:\IDA 7.0\dbgsrv ```  我把它复制到桌面了 然后利用adb把`android_server`push到指定目录下 ```php adb push C:\Users\Administrator\Desktop\android_server data/local/tmp ``` 这边我还是上我的安卓机   进行查看  ### 进行加权 ```php chmod 777 android_server ```   这里还要提一句 : 记住安卓的底层是Linux的操作系统 因为安卓的机制问题 进行更名 ```php mv android_server a001 ```  ### 运行a001  可以看到它监听的是23946端口 **注:指定端口:** ```php ./a001 -p1-65535 ``` 我们继续 ### 端口转发 ```php adb forward tcp:23946 tcp:23946 ```  ### 安装APK到安卓机上 这次使用的是install ```php adb install C:\Users\Administrator\Desktop\javandk1.apk ```  IDA中Debugger调试 -------------- **进行Debugge选择**   进行配置  23946就是默认端口  调出安卓机的进程窗口 ctrl+f :进行搜索ndk  双击选择之后进来ndk    加载模块列表 ------   分别代表 ```php 库挂起入口点开始结束加载卸载 ``` 表示程序在运行中只要涉及到进程的入口点、涉及到线程的开始和结束、涉及到库的加载和卸载 都可以让程序进行 debugger(断点)操作! 运行IDA ----- 左上角小三角 或者F9都可以  普通调试 ---- ### 环境调整 运行android\_server 因为安卓的在调试的时候apk等安全机制会对 android\_server进行关键名称检测 所以我做了修改 端口转发 ```php adb forward tcp:23946 tcp:23946 ```  ### 挂起程序 挂起程序(需要程序的包名+类名) 使用AndroidKiller进行反编译APK  ```php adb shell am start -D -n com.example.javandk1/.MainActivity ``` **注:类名前面要加斜杠相对路径** 安卓机弹出一个窗口  ### 运行ddms  小图标变红色了 ### 运行IDA 进行连接   还是要记得加载模块列表  然后运行  IDA加载so文件 --------- ### 打开ddms  查看下调试程序的端口号:8600 命令 ```php jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8600 ```   图标变成了绿色  IDA也成功加载so文件 ### Moules模块 ```php ndk1-1/oat/arm/base.odex ```  双击进入  安卓逆向-JNI -------- ### 1、编写C代码 ```php #include <stdio.h>int main (){printf("a001")return 0;} ``` ### 2、编写.mk文件代码 mk文件就是在构建工具时,会被 Build System解析多次! ```php LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := a001LOCAL_SRC_FILES := a001.c LOCAL_ARM_MODE := arm LOCAL_LDLIBS += -llog include $(BUILD_HARED_LIBRARY) ``` 代码分析 ```php 1、LOCAL_PATH := $(call my-dir):获取JNI文件路径每个mk必须以 local开始,my-dir是由 Build System提供的,返回的是一个包含mk文件的路径,要获取相应的文件目录路径去调用JNI属性2、include $(CLEAR_VARS) :CLEAR VARS变量也是由 Build System提供,指定清理 LOCAL_开头的文件,但不会清理 LOCAL_PATH开头的3、LOCAL_MODULE := a001:定义的模块名称,如果这里编译岀so文件前面+lib后面+so4、LOCAL_SRC_FILES := a001.c:表示同文件目录下c文件5、LOCAL_ARM MODE:=arm:编译后的指令集,arm每个指令有四个字节6、include $(BUILD_HARED_LIBRARY):把文件构建成可执行程序如果是动态链接库就用:include(shared library)如果是静态链接库:include $(static library) ``` ### 3、编写application.mk代码 ```php APP_ABI := x86 armeabi-v7a ``` 这里说明一下 `v7a`是可以兼容`armeabi`的,一般就加上就好 `v7a`的意思是第7代及以上的ARM处理器,目前大部分都支持,为了性能优化,都会写上! x86是可以兼容`armeabi`的 那么在不设计到平台情况下,只需要改`MODULE`和`SRC_FILES`即可! ### 4、进行编译  放在jni目录下  编译  可看到生成了两个文件:`libs`、`obj`  `armeabi-v7a`和`x86`下面的文件是ELF文件  都是linux下的文件 注:PIE安全机制从4.1引入 但是 Android L之前的系统版本并不会去检验可执行文件是否基于PIE编译岀的。因此不会报错。 但是 Android L已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行。 所以需要在`Android.mk`中加入flag ```php LOCAL_CFLAGS += -pie -fPIELOCAL_LDFLAGS += -pie -fPIE ``` 5、进行adb push上传 -------------- ```php adb push C:\Users\Administrator\Desktop\libs\armeabi-v7a\aaa data/local/tmp ```  加权 ```php chmod +x ``` 执行  **请注意:这里使用的技术仅用于学习知识目的,如果列出的技术用于其他任何目标,我概不负责。** OK!就到这里 转载于:<https://www.freebuf.com/articles/mobile/284486.html>
发表于
阅读 ( 7146 )
分类:
漏洞分析
0 推荐
收藏
0 条评论
请先
登录
后评论
略略略
36 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!