逆向学习(二) 安卓逆向

安卓逆向

0、准备工作和大纲

JAVA环境、apktool、android APK、JADX、keytool、jarsigner(最后两个为JAVASDK自带工具)

java基本知识:源代码文件为XXX.java;是编译性语言,编译后才可以运行(PYTHON是解释性语言,直接可以运行);JAVA编译后的文件是XXX.class,class文件是可执行文件;JAVA虚拟机运行可以运行XXX.class方法为java XXX.class
安卓下面的xxx.dex dex是安卓里可执行文件

安卓软件包:APK。即一个压缩文件,用zip压缩解压。

JADX:把dex文件转化为java代码。

APKTOOL:反编译apk包。

签名

adb命令使用
adb devices    安卓设备列表
adb shell    进入安卓shell
adb logcat    adb logcat -s keyword    安卓日志
adb push    把文件推送进安卓设备
adb shell dumpsys activity top    adb shell dumpsys package packagename    打印AndroidManifest.xml
adb install XXX.apk    adb uninstall XXX.apk    安装卸载apk
adb pull android-path local-path    拉取安卓文件到本地
adb push local-path android-path    推送本地文件到安卓
网易模拟器:adb connect 127.0.0.1:7555

smali语法

破解安装签名校验

APK启动加载

APP四大组件

加固后的APK包

加固原理

脱壳

java编译运行

反混淆:
混淆工具:proguard;自己混淆。
jadx jeb2 日志打印
站在程序设计的角度上思考,程序要健壮、安全、性能高。
isNetworkAvailable

APP抓包。
代理被检测如何抓包;使用xpose模块;手动该smali

Frida开发
基础开发;Hook安装签名;Hook token;Hook so文件。

IDA动态调试:
网易模拟器:adb connect 127.0.0.1:7555
IDA动态调试配置:
adb push android_x86_server(cpu型号要对应,模拟器是x86)/data/local/tmp/    把本地文件推送进手机目录
adb shell    进入手机shell
cd /data/local/tmp/    进入tmp目录
ls -l    查看文件是否存在和确定文件权限。
chomd 777 android_x86_server    修改权限需要确定有root权限
./android_x86_server    运行
adb forward tcp:23946 tcp:23946    在本地执行adb做端口转发
静态调试,动态调试,反调试

IDA手动脱壳

1、安卓基础与逆向工具

安卓项目目录结构为:
assets:资源文件(图片,网页,视频)不会被编译。
res:资源文件(静态文本,图片,关键资源)汉化,要被编译。
lib:.so库,系统库,自己打包的库。有的把加密/token生成方式放在.so文件里
META-INF:签名信息
AndroidManifest.xml:配置信息(关键),举例:修改权限
classes.dex:android dalvik虚拟机可执行文件
resources.arsc:资源索引/对应文件

APP四大组件:
Activity:一个Activity通常就是一个界面。
Service:后台服务,播放音乐,处理数据等。
Broadcase receiver:异步接收广播
Content provider:内容共享

JADX:把dex文件转化为java代码。

APKTOOL:反编译apk包。用法:apktool d test.apk。结构:
AndroidManifest.xml    APP权限配置,也是程序入口
smali文件(一种汇编代码)    .smali可以和.dex相互转换;修改apk代码通常修改smali文件(重新修改.java源代码的话重新编译的困难太大);baksmali.jar smali.jar对dex和smali文件做转换
classes.dex    源代码在classes.dex文件里,可以反编译出.java代码
过程:.smali--->.dex---->.java
利用APKTOOL漏洞的apk会反编译失败,只能等升级或者找老版本。
重新打包apk方法:apktool b 目录

签名:keytool jarsigner 工具是JAVAJDK自带的。
生成证书:keytool -genkey -keystore my-release-key.keystore -alias my_alias -keyalg RSA -keysize 4096 -validity 10000
用证书给apk签名:jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore -signedjar com.dahuodong.veryevent_4.6.2_60_sign.apk com.dahuodong.veryevent)4.6.2_60.apk my_alias
未签名APK不能再安卓手机上安装,APP在启动时会对签名进行校验,要逆APP就要跳过校验。

2、smali基本语法,安卓加载原理,破解安装签名

smali是Dex文件逆向后的一种语法,一种反汇编语言。smali代码和.java代码对应看会比较容易。.line和.java的代码行数对应。

下面是网上找的一篇关于smali的语法的简单介绍:
文章来源:http://www.brogrammer.cn/android/smali/

安卓加载
1、Dex加载流程(安卓源代码):
Davlivk虚拟机加载dex文件
  Java层Dex加载流程:BootClassLoader ---> PathClassLoader ----> DexClassLoader
  Native层Dex加载流程:libdvm.so(重编译system.img) OpenDexFileNative
2、点击图标,APP加载流程:一个APK只有一个Application。每个Apk运行时都需要有一个Application对象。Application对象执行onCreate方法时,APP就开始运行。

破解安装签名:修改smali文件;hook技术
用apktool反编译apk,得到AndroidManifests.xml,找到程序入口Application,对比java代码(使用jadx打开apk,查找程序入口对应的Application名),然后找Sig,sign等签名相关内容,最后在smali文件中找到对应的Application文件,将Java 代码中执行检查操作的代码的行数对应的smali代码删掉/改掉,让他不执行,之后用apktool打包。

3、加固脱壳,破解app请求token

加固apk的特征(各家.so文件名特征,需使用软件检测)(腾讯乐加固,360,梆梆,爱加密等);三方加固/自己加固(一般在哪家应用市场发布就要用哪家的加固方案);为什么要加固(一定程度保护源代码);加固方式(.dex/.so加固)
不同厂商对APP的加固特征:
爱加密:libexec.so, libexecmain.so, ijiami.dat
梆梆:libsecexe.so, libsecmain.so, libDexHelper.so
360:libprotectClass.so, libjiagu.so, libjiagu_art.so, libjiagu_x86.so
百度:libbaiduprotect.so
腾讯:libshellx-2.10.6.0.so, libBugly.so, libtup.so, libexec.so, libshell.so
网易易盾:libnesec.so

加固原理:源APK加密后+脱壳Dex = 新的Dex = 新的Apk
新APK运行:先加载壳APP--->壳APP读Dex文件末尾的源APKD大小--->在内存中壳APP解密出源APP--->运行源APP
壳APK有自己的Application对象,源APK由自己的Application对象,壳APK启动时,在AndroidManifest.xml里找源APK的Application执行它的onCreate方法,启动源APK。

脱壳:
脱壳原理:在壳APK解密源APK后,源APK被加载前,拦截这个过程中的系统函数,把内存中Dex,dump出来

方法:Hook:先取得要Hook函数/方法的控制权,这样不用破坏程序;动态调试:反编译,汇编,计算内存地址。
Hook技术(系统进程注入):在系统每调用函数前

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值