这是系列文章的第四篇
我们继续
Android Studio本身并不可以反编译APK 开发用的比较多
它通过导入反编译出来的完整的的Smali代码,然后设置好调试所需的条件,设置断点
断点准备好的条件后,连接模拟器运行待调试的APK的应用程序,然后执行程序的流程运行到Smali代码的时候,断点处会触发一个断点会自动断下来,从而可以进一步分析和调试,整个程序会非常的清晰。
首先来安装一下
https://ibotpeaches.github.io/Apktool/
https://bitbucket.org/JesusFreke/smali/downloads/
https://developer.android.google.cn/studio/
一路默认过去就可以
然后一路next
既然Android Studio不可以反编译
那么我们就首先把APK丢到Android Killer中
我们要的就是这个 反编译完的项目包--Project
然后继续一路默认即可
自定义Name 端口不要被占用 选中项目文件夹 即可
adb devices
这个就是我的安卓机
adb shell
之前有提到过的
安卓的底层操作系统是Linux操作系统
这个安卓机 我已经将它root过了
adb shell ps
参数解释
adb shell ps
PID:ID
PPID:父进程ID
VSIZE:进程的虚拟内存大小kb单位RSS:实际占用的大小
RSS:实际占用的大小
WCHAN:进程睡眠的函数名称
PC∶电脑内核函数名称
NAME:包名
安卓机中打开注册机程序
我们找一下
然后我们重新看进程
adb shell ps
PID就是:2550
进行转发端口 进行调试
简单来讲 就是把模拟器中的注册机程序和Android Studio进行联动起来
adb forward tcp:8700 jdwp:13362
设置好指定程序后
成功连接
这里记录一个
万能重启命令
adb kill-server
adb start-server
adb remount
我们找到checkSN()
下断点
然后上安卓机
打开注册机APK
点击注册
这时候会自动断点跳转到const/4 v7, 0x0
F7:单步步入F8:单步步步F9:跳转到下一个断点
当我们F8 一步步向下走之后
看到了跳转MD5算法 开始拼接sb
继续向下走
开始循环拼接sb
userSN="8d9d5d4c03dd33d5"
这个就是我们的注册码
总共循环了32次
在往下走 就跳出循环了
尝试注册码 注册
可以看这里:安卓(一)
当我们拿到一个APK
进行Android Killer进行反编译
导出文件
我们找的就是这个.so
文件
当我们把so文件直接丢进来之后
会有一个弹窗
IDA提供了两种方法去解析
ELF
就是so的一个文件格式
Binary file
是二进制文件格式
那肯定是选第一个咯
然后呢
这个包下除了.so
文件 还多出好多文件
IDA是递归下降的反汇编工具
地址越来越大
这里是导航条
蓝色:表示常规的指令函数- 深蓝:用户写的函数编译后的代码区- 浅蓝:编译器自己添加的函数,像启动函数,异常函数等等黑色:节与节之间的间隙#禁区,不存在任何数据银白色:数据内容粉色:表示外部导入符号#有关输入表的一些数据信息暗黄色:表示IDA未识别的内容
IDA View三种反汇编视图:文本视图、图表视图、路径视图Hex View:十六进制窗口Imports:导入函数窗口Struceures:结构体窗口Exports:导出函数窗口Enums:枚举窗口Strings:字符串窗口
十六进制 修改 按F2即可
默认是6张表
表的添加这里
空格键:切换文本视图与图表视图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:搜索十六进制
首先来到IDA的dbgsrv
目录
C:\IDA 7.0\dbgsrv
我把它复制到桌面了
然后利用adb把android_server
push到指定目录下
adb push C:\Users\Administrator\Desktop\android_server data/local/tmp
这边我还是上我的安卓机
进行查看
chmod 777 android_server
这里还要提一句 : 记住安卓的底层是Linux的操作系统
因为安卓的机制问题 进行更名
mv android_server a001
可以看到它监听的是23946端口
注:指定端口:
./a001 -p1-65535
我们继续
adb forward tcp:23946 tcp:23946
这次使用的是install
adb install C:\Users\Administrator\Desktop\javandk1.apk
进行Debugge选择
进行配置
23946就是默认端口
调出安卓机的进程窗口
ctrl+f :进行搜索ndk
双击选择之后进来ndk
分别代表
库挂起入口点开始结束加载卸载
表示程序在运行中只要涉及到进程的入口点、涉及到线程的开始和结束、涉及到库的加载和卸载
都可以让程序进行 debugger(断点)操作!
左上角小三角 或者F9都可以
运行android_server
因为安卓的在调试的时候apk等安全机制会对 android_server进行关键名称检测
所以我做了修改
端口转发
adb forward tcp:23946 tcp:23946
挂起程序(需要程序的包名+类名)
使用AndroidKiller进行反编译APK
adb shell am start -D -n com.example.javandk1/.MainActivity
注:类名前面要加斜杠相对路径
安卓机弹出一个窗口
小图标变红色了
进行连接
还是要记得加载模块列表
然后运行
查看下调试程序的端口号:8600
命令
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8600
图标变成了绿色
IDA也成功加载so文件
ndk1-1/oat/arm/base.odex
双击进入
#include <stdio.h>int main (){printf("a001")return 0;}
mk文件就是在构建工具时,会被 Build System解析多次!
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)
代码分析
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)
APP_ABI := x86 armeabi-v7a
这里说明一下
v7a
是可以兼容armeabi
的,一般就加上就好
v7a
的意思是第7代及以上的ARM处理器,目前大部分都支持,为了性能优化,都会写上!
x86是可以兼容armeabi
的
那么在不设计到平台情况下,只需要改MODULE
和SRC_FILES
即可!
放在jni目录下
编译
可看到生成了两个文件:libs
、obj
armeabi-v7a
和x86
下面的文件是ELF文件
都是linux下的文件
注:PIE安全机制从4.1引入
但是 Android L之前的系统版本并不会去检验可执行文件是否基于PIE编译岀的。因此不会报错。
但是 Android L已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行。
所以需要在Android.mk
中加入flag
LOCAL_CFLAGS += -pie -fPIELOCAL_LDFLAGS += -pie -fPIE
adb push C:\Users\Administrator\Desktop\libs\armeabi-v7a\aaa data/local/tmp
加权
chmod +x
执行
请注意:这里使用的技术仅用于学习知识目的,如果列出的技术用于其他任何目标,我概不负责。
OK!就到这里
36 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!