精华内容
下载资源
问答
  • 2021-10-05 16:31:49





    一、Android 逆向用途



    Android 逆向用途 :

    • 软件防护 : 根据逆向的方法针对性的开发防护策略 ;
    • 算法研究 : 在没有源码的前提下 , 通过反编译 , 反汇编 , 拿到 Smali 代码 , 研究其产品的算法 , 实现途径 ;
    • 接口分析 : 接入一个没有源码的第三方库 , 无法进行调试 , 出现问题后 , 可以使用逆向的方法 , 查找问题原因 , 解决相关问题 ; 找到问题后 , 修改汇编代码 , 然后重新打包 ;
    • 数据采集 : 分析应用的数据 , 获取该应用的更新内容 , 运营信息 , 在 APP 中可以拿到一些非公开的数据 ;
    • 应用破解 : 单机游戏玩家需求 , 游戏修改器 , 或者应用停止运营 , 没有付费渠道 , 可以进行破解使用 ;
    • 调试分析 : 应用打包 , 混淆 , 加固 后上传到应用市场 , 如果某个分发渠道版本出现问题 , 可能就需要调试分析具体的这个 APK 包的问题 ; 结合源码与渠道包进行逆向分析, 查找问题原因 ;




    二、Android 逆向原理



    Android 逆向原理 :

    • 静态分析 : 反编译 , 反汇编 , 从 .so , .a , .dex 等函数库中提取相应信息 , 主要是分析静态文件二进制数据 ;
    • 动态分析 : 将程序运行起来 , 运行中动态分析数据 ; 如 : 做一些函数拦截 , 拦截 Java 的字符串 String 的 构造函数 或 追加函数 , 按照时间顺序 , 记录函数的结果 , 然后找到关键信息的拼接过程 , 如 : 访问网络时 , 必然拼接 URL 地址 , 这些都是字符串 , 比较容易分析 ;
    • 结合分析 ( 使用最多 ) : 先通过静态分析 , 确认一些信息 , 然后通过 动态分析 , 进一步进行调试 ;

    静态分析 和 动态分析 , 对于简单防护的应用 , 是有效的 ;

    如果应用做了很复杂的防护 , 需要使用结合分析 ;

    更多相关内容
  • Android逆向基础入门

    千次阅读 2022-01-14 22:16:08
    目录一、基础App数据抓取1、App抓包知识了解二、Android_apk逆向1、Android逆向名称2、jadx反编译工具3、JEB反编译工具 一、基础App数据抓取 1、App抓包知识了解 常用的拦截抓包工具有Charles、Fiddler、mitmproxy...

    一、基础App数据抓取

    1、App常用抓包工具

    • 常用的拦截抓包工具有fiddler、mitmproxy、charles手机端需和电脑端在同一个网络下,且手机端要配置相应的证书,手机端还要设置手动代理):大部分app使用的数据通信协议基于http/https,可通过抓包查看来模拟url请求。
    • 对于安卓手机抓包建议使用charles,因SSL Pinning(证书锁定)无法对https协议的请求抓包,此时可尝试以下几种方式①使用android 7 以下的系统解除限制,②xposed + JustTrustMe,③ VirtualXposed + JustTrustMe ④ Frida + DroidSSLUnpinning ;只有抓到包我们才知道需要哪个参数
    • 常用的自动化工具有uiautomatorviewer、Appium、Airtest手机与电脑端通过usb数据线连接,同时手机需要打开usb调试功能进入开发者模式):就相当于web端的selenium

    2、fiddler抓包工具

    3、mitmdump抓包工具

    • mitmproxy安装与抓包分析, 需要手动设置浏览器局部代理不太方便但还行;强大功能在于mitmdump可以实时抓包,然后给python等处理
    • mitmdump实时抓包使用介绍:分析抓包逻辑编写好python处理脚本 > mitmdump -s py文件 -p 端口号 > 滑动app(设置代理)或者web(设置局部代理)

    4、charles抓包工具

    • charles安装与抓包分析,Charles免费使用30分钟,然后需要重启再次使用,貌似设置了SSL Proxying证书,可以抓SSL Pining的包(低于7版本的安卓系统)

    5、uiautomatorviewer / appium自动化工具

    6、Airtest自动化工具

    • Airtest相关操作使用,与手机通过usb数据线连接,可以操作多个手机实现群控,可通过录制功能自动生成python代码,功能十分强大

    二、js逆向与app逆向的区别

    • app逆向比js逆向繁琐很多,掌握的知识点也要更多,难度根本不在一个层次
    • js逆向:全部在web页,抓包只需chrome浏览器,js逆向分析也只需chrome浏览器,也就是整个分析过程在chrome上就可以完成,一些偶尔使用的辅助工具油猴,fiddler,ast,几乎就没了
    • app逆向:最好有一个手机,https的抓包可能会抓不到,有壳的还要脱壳,需要反编译或者反汇编才能看到java或者C的代码,有时候甚至要看汇编的,需要掌握的知识点根本不是一个量级
    • js逆向与app逆向的区别会进一步完善修改,以下可能会有些许错误
      在这里插入图片描述

    三、Android_apk逆向

    1、app逆向名词

    • .apk:每个android app都有对应的安装包,以.apk为后缀 ,.apk文件类似压缩包,将后缀名改成.zip可以进行解压,里面的.dex文件可以用反编译工具进行反编译获得源码;所以一般app都会加壳,将真正的源码隐藏起来
    • Java层:Java代码
    • Native层:C/C++代码,也称为so层,保存在.so文件下
    • 反编译工具:jadx、JEB、Apktool:因SSL Pinning导致无法正常抓包时,或则是抓包后要分析某个参数的生成逻辑时,需要反编译apk文件,还原成可读性高的java代码进一步分析
    • Hook工具:Xposed、Frida:可以通过hook拦截和改写逻辑,获取关键加密数据,hook或模拟Java层Native层(即so层由C/C++等实现)的代码;其中Xposed只能Hook Java层逻辑,且Xposed整个模块逻辑需要使用Java语言实现;因此Frida更强大、方便、灵活
    • 反汇编工具:IDA Pro工具:逆向分析、调试、模拟Native层(so层由C/C++`等实现)的代码实现逻辑
    • Java调C的接口:JNI(Java Native Interface):即Java的本地接口,是Java调用Native即C/C++编写的代码,C/C++编写的代码会被编译到.so后缀的文件里,还原so需要反汇编,增加了逆向难度
    • 混淆工具:OLLVM(Obfuscator-LLVM):在Native层实现混淆,即针对LLVM(编译器和工具链的集合,把C/C++转化成目标机器执行的代码)的代码混淆工具;
    • 当有如上OLLVM混淆时,要分析其内部调用逻辑,十分困难,一个方法是硬刚逆向so文件和通过动态调试进行分析;另一个方法就是利用RPC、unidbg等模拟执行so文件的逻辑
    • 模拟执行so层逻辑:Frida-RPC、AndServer-RPC、unidbg:模拟执行so文件的逻辑,不关心so文件的内部逻辑,直接调用so文件,传入对应的参数,得到执行结果;如果被风控检测到执行环境不正常,会拒绝返回数据或者是返回假数据

    2、jadx反编译工具

    • jdk1.8_java环境安装(目录3)
      在这里插入图片描述

    • adb安装(目录2)

    • jadx工具:jadx-gui反编译图形界面工具,jadx下载 , 解压后运行exe文件,然后打开加载apk文件即可

    • 常用功能:文本搜索(导航),右击代码查找方法声明,右击代码查找用例,反混淆(工具),日志查看器(帮助),设置选项里面也有很多功能
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    3、JEB反编译工具

    (1)JEB常用功能介绍
    • JEB反编译器使用详细介绍

    • JEB下载安装,windows运行.bat文件,然后加载apk文件,即可看到右侧Smali代码,通过编译也可以转到java代码看
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    • 常用功能1:ctr+f图一进行文本字符串搜索定位,并勾选环绕搜索,或者图二ctr+f搜索
      在这里插入图片描述

    在这里插入图片描述

    • 常用功能2:右击代码编译可以转到java代码声明处,或者再次右击相应代码字符串会回到Smali代码用例
      在这里插入图片描述
      在这里插入图片描述
    (2)JEB动态调试功能
    • 常用功能3:使用JEB动态调试功能验证,在猜测的代码位置添加断点,然后app滑动加载数据,然后看断点位置是否停止运行

    • ① 首先手机与电脑通过usb数据线连接 > 然后手机端要打开USB调试功能,进入开发者模式 > 然后将电脑端的.apk文件放到手机存储中>然后手机点击apk文件即可安装

    • ② 然后cmd运行如下命令(该命令让手机端的app以调试的模式启动) ,之后手机会显示wating for debugger, -D指定App以调试模式启动-n指定启动入口
      在这里插入图片描述

      adb shell am start -D -n com.goldze.mvvmhabit/.ui.MainActivity
      
    • ③ 然后JEB界面 `在目标代码行ctr+b下断点 > 点击Debug按钮 > 然后调试,滑动app,然后就会断在断点处,多出的右侧界面也可以看字段值变化
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    • ④ 发现加密点,进入encrypt函数内部继续调试,亦可右击代码编译直接看java代码,然后逻辑找到要么python还原,要么写个java爬虫都可以
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    4、Frida之Hook工具

    • Hook工具Frida详细介绍,是一个基于Python和JavaScript的Hook与调试框架,可以Hook Java层或者Native层,通过python注入js脚本操作手机上的java代码
    • Frida安装:按如下命令进行安装
      pip install frida -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
      pip install frida-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/
      
      在这里插入图片描述
    (1)真机下载frida-server文件
    • 准备一部已经root的手机

    • 手机下载frida-server文件,通过数据线usb与电脑连接,在cmd窗口输入以下命令查看cpu类型,如这里需要下载的包对应arm64 ,然后下载frida服务端frida-server(注意这里的版本和Frida的版本是一致的15.1.14)

      adb shell 
      getprop ro.product.cpu.abi
      

      在这里插入图片描述
      在这里插入图片描述

    • 将解压后的文件夹通过adb push将frida-server发送到android设备/data/local/tmp目录中,进入了adb shell操作窗口,并修改可执行权限

      ######## 1、将解压后的文件夹通过adb push将frida-server发送到android设备/data/local/tmp目录中
      adb push "D:\Package\frida-server-15.1.14-android-arm64" /data/local/tmp
      
      ######## 2、进入了adb shell操作窗口,修改可执行权限
      adb shell
      cd /data/local/tmp
      ls
      chmod 777 frida-server-15.1.14-android-arm64
      

      在这里插入图片描述

    • 手机运行frida服务 ./frida-server-15.1.14-android-arm64 &,起好服务后未报错,则保持当前cmd窗口不要关闭

      ######## 3、手机端后台运行frida服务
      su
      ./frida-server-15.1.14-android-arm64
      
    • 如上frida服务起好后,新开一个cmd窗口,执行如下命令

      ######## 4、在cmd新的窗口下执行如下命令
      adb forward tcp:27042 tcp:27042 
      adb forward tcp:27043 tcp:27043
      frida-ps -U
      

      在这里插入图片描述

    (2)夜神模拟器下载frida-server文件
    • 准备下载夜神模拟器

    • 下载,自定义安装路径,直接下一步即可安装,可以将安装路径D:\Program Files\Nox\bin添加到环境变量;默认打开是平板模式,打开设置>性能设置>分辨率改为手机模版;
      在这里插入图片描述

    • 连接夜神模拟器设备:打开cmd命令行,进入夜神安装的bin目录,执行如下命令,出现黄色区域内容即连接成功:

      nox_adb.exe connect 127.0.0.1:62001
      adb devices
      

      在这里插入图片描述
      在这里插入图片描述

    • 模拟器下载frida-server文件,cmd输入以下命令查看cpu类型,如这里需要下载的包对应是x86 ,然后下载frida服务端frida-server(注意这里的版本和Frida的版本是一致的15.1.14)

      adb shell 
      getprop ro.product.cpu.abi
      

      在这里插入图片描述
      在这里插入图片描述

    • 将解压后的文件夹通过adb push将frida-server发送到android设备/data/local/tmp目录中,进入了adb shell操作窗口,并修改可执行权限

      ######## 1、将解压后的文件夹通过adb push将frida-server发送到android设备/data/local/tmp目录中
      adb push "D:\Package\frida-server-15.1.14-android-x86" /data/local/tmp
      
      ######## 2、进入了adb shell操作窗口,修改可执行权限
      adb shell
      cd /data/local/tmp
      ls
      chmod 777 frida-server-15.1.14-android-x86
      
    • 模拟器运行frida服务, ./frida-server-15.1.14-android-x86,起好服务后未报错,则保持当前cmd窗口不要关闭

      ######## 3、模拟器运行frida服务,并保持当前adb shell窗口一直开着,不能关,否则服务也关了
      ./frida-server-15.1.14-android-x86
      
    • 如上frida服务起好后,新开一个cmd窗口,执行如下命令,控制台输出如下图片内容,则证明已连接成功

      ######## 4、新开一个cmd窗口,执行如下命令
      adb forward tcp:27042 tcp:27042 
      adb forward tcp:27043 tcp:27043
      frida-ps -U
      

      在这里插入图片描述

    (3)Hook Java层的逻辑
    • ① 以夜神模拟器为例子,打开已下载的app
      在这里插入图片描述

    • ② cmd窗口起frida服务,如图,然后编写hook逻辑的js文件以及相应的python文件

      adb shell
      su
      cd /data/local/tmp
      ./frida-server-15.1.14-android-x86
      

      在这里插入图片描述

    • ③ 了解编写hook java 的js代码逻辑, 以及python固定脚本,固定代码结构如下,需要填充的就三处:待连接的app进程名,待hook的文件类名,待hook的函数方法js逻辑代码
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

      js_text = """
          Java.perform(function() {
              var MainActivity = Java.use('文件类名,可以直接右键复制文件类名');  
              // 待编写该类下面的函数的hook逻辑
          })
      """
      
      
      # python固定代码,其中js_text是待编写的hook逻辑
      def on_message(message, data):
          print(message)
      
      
      # 2、获取当前设备连接并调用设备的attach方法挂载对应的进程, 并往进程中注入Hook脚本
      process = frida.get_usb_device().attach('app进程名称,需通过frida-ps -U查看获得')
      script = process.create_script(js_text)
      # 3、监听message事件, 回调方法是on_message, js代码中任何通过send方法发送的数据,on_message方法都会接收到对应的内容
      script.on('message', on_message)
      script.load()
      sys.stdin.read()
      
    • ④ 按如上要写的代码结构编写python与js脚本,然后运行python脚本,然后再操作app相关步骤触发,进而hook到;
      在这里插入图片描述

    • 打印调用堆栈

      Java.perform(function(){
          // 打印调用堆栈
          function printStackTrace(){
      		console.log(Java.use("android.util.Log") .getStackTraceString(Java.use("java.lang.Exception") .$new()));
      	}
      })
      
    (4)Hook Native层的逻辑
    • ① 下载相关.apk文件安装到模拟器或者手机,本案例以模拟器为例
    • ② cmd窗口起frida服务,如下,然后编写hook逻辑的js文件以及相应的python文件,并打开相应的app
      adb shell
      su
      cd /data/local/tmp
      ./frida-server-15.1.14-android-x86
      
    • ③ 编写hook native 的js代码逻辑, 以及python脚本,然后运行python脚本,然后再操作app相关步骤,进而hook到;与hook java层不同的地点在于js代码的编写,python部分完全一样且固定
      在这里插入图片描述

    5、app的壳与脱壳

    (1)app的壳特征
    • 如果一个.apk,可以直接通过jadx等直接反编译获得源码是比较危险的,所以为了保护源码,基本上apk都会加壳,目前有三代壳
    • 一代壳:对原有的dex文件整体加密生成一个新的壳dex文件;反编译后只能看到继承Application类的壳代码,android的四大组件被隐藏;壳的种类:诸如免费加固服务:360加固、腾讯加固、阿里加固、爱加密;查壳工具有:PKID;脱壳工具有:frida_dump、FRIDA-DEXDump等
    • 二代壳:将dex文件中的某些方法置空,只有在被调用时才会解密加载;反编译后Java代码的方法实现是空的, Smali代码有很多nop指令;脱壳工具有FART
    • 三代壳:有VMP壳和dex2C壳,将java层的方法Native化;反编译后方法被Native化了;没有成熟的脱壳工具
    (2)一代壳frida_dump脱壳
    • 利用frida_dump脱壳: 下载frida_dump,并解压有如下文件,其原理是通过文件头的内容搜索dex文件并dump下来
      在这里插入图片描述

    • 起好frida服务,手机上安装好app,然后执行frida -U -f com.goldze.mvvmhabit -l dump_dex.js --no-pause

      # cmd窗口执行
      adb shell
      su
      cd /data/local/tmp
      ./frida-server-15.1.14-android-arm64
      # 然后另开一个cmd窗口
      frida -U -f com.goldze.mvvmhabit -l dump_dex.js --no-pause
      

      在这里插入图片描述

    • 脱壳完毕后结果在/data/data/com.goldze.mvvmhabit/files/dump_dex_com.goldze.mvvmhabit文件夹下,有8个dex文件,把它拉取到电脑上
      在这里插入图片描述

    • adb pull 可能会出现Permission denied错误,此时将该目录下的dex文件cp -r 路径 目标路径复制到/scard下:然后在adb pull 路径 目标路径拉取到电脑上 ,然后选择较大的dex文件用jadx反编译打开即可看到源码了
      在这里插入图片描述

      adb shell
      su
      cp -r /data/data/com.goldze.mvvmhabit/files/dump_dex_com.goldze.mvvmhabit /sdcard 
      # 新开一个cmd窗口直接执行
      adb pull /sdcard/dump_dex_com.goldze.mvvmhabit E:\AppPrj\app_apk\app7_tuoke
      

      在这里插入图片描述

    (3)一代壳frida_dexdump脱壳
    • 利用frida_dexdump脱壳:frida-DEXDump,通过pip3 install frida-dexdump安装,其原理是根据一些暴力内存搜索的原理实现脱壳,对于完整的dex文件,搜索dex035找壳,或者匹配特征如DexHeader的长度信息、索引指向找壳
      在这里插入图片描述

    • 起好frida服务,手机上安装好app,然后执行frida-dexdump -U -f 包名

      # cmd窗口执行
      adb shell
      su
      cd /data/local/tmp
      ./frida-server-15.1.14-android-arm64
      # 然后另开一个cmd窗口
      frida-dexdump -U -f com.iCitySuzhou.suzhou001
      
    • 如图,加了壳的反编译目录
      在这里插入图片描述

    • 脱壳完毕后会在当前目录下生成文件夹存储dex文件,然后选择较大的dex文件,用jadx反编译即可看到相应的源码了尝试搜索搜索
      在这里插入图片描述
      在这里插入图片描述

    • 然后我们搜索,在classes02.dex文件里面找到了目标字符串,同时对代码进行了反混淆
      在这里插入图片描述
      在这里插入图片描述

    (4)二代壳FART脱壳
    • 利用FART脱壳:FART

    6、IDAPro反汇编工具

    (1)静态分析
    • IDAPro下载安装查看
    • 查看手机是哪种处理器:adb shell getprop ro.product.cpu.abi,则选择对应文件夹下的.so文件
      在这里插入图片描述
      在这里插入图片描述
    • 右击选择对应的.so文件打开
      在这里插入图片描述
      在这里插入图片描述
    • 然后到了如下界面,左侧是so文件中的一些方法声明,右侧是对应的反汇编结果
      在这里插入图片描述
    • 然后将汇编代码还原成C/C++,如图操作即可
      在这里插入图片描述
      在这里插入图片描述
    (2)动态调试
    • ida动态调试,需要起个服务android_server64,如图
      在这里插入图片描述

      adb push android_server64 /data/local/tmp
      adb shell
      su
      cd /data/local/tmp
      chmod 777 android_server64
      ./android_server64
      # 新开一个cmd窗口
      adb forward tcp:23946 tcp:23946
      

      在这里插入图片描述
      在这里插入图片描述

    • 然后打开ida,选择Go
      在这里插入图片描述

    • 然后在Debugger选项卡上选择如下选项
      在这里插入图片描述
      在这里插入图片描述

    • 然后选择对应app的包名,之后稍等片刻,ida pro会自动停下来
      在这里插入图片描述

    • 然后在右侧的Modules面板选择对应的.so文件,并双击进入
      在这里插入图片描述

    • 然后选择目标定义的方法,左侧会出现对应的汇编代码
      在这里插入图片描述

    • 然后下断点,运行,然后滑动手机,然后单步调试
      在这里插入图片描述

    未完待学习完善修正中

    展开全文
  • android逆向基础教程一

    千次阅读 2021-12-03 16:47:22
    熟练使用jadx ,Androidkiller frida,了解android逆向流程分析,熟悉Smali汇编以及Frida脚本编写,通过Jadx 流程分析android 中逻辑代码。AndroidKiller修改Smali汇编方式修改执行流程重新打包绕过某些逻辑条件判断...

    工具 :Jadx AndroidKiller frida

    熟练使用jadx ,Androidkiller frida,了解android逆向流程分析,熟悉Smali汇编以及Frida脚本编写,通过Jadx 流程分析android 中逻辑代码。AndroidKiller修改Smali汇编方式修改执行流程重新打包绕过某些逻辑条件判断,frida hook在逆向中占有重要地位,熟练掌握 frida hook基础知识是逆向必不可少的内容。

    一、loginActivity

    流程分析

    解题

    方法一:逻辑算法计算获取密码

    通过逻辑算法输入用户名计算出返回的字符串即为密码。

    public class Main {
        public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
            String inputs1="PwnGuo";
           String str =a(inputs1,inputs1);
    ​
           System.out.println("log:"+str);
        }
        public static String a(String str, String str2) throws InvalidKeyException, NoSuchAlgorithmException {
    ​
                SecretKeySpec secretKeySpec = new SecretKeySpec(str2.getBytes(), "HmacSHA256");
                Mac instance = Mac.getInstance("HmacSHA256");
                instance.init(secretKeySpec);
    ​
                return a(instance.doFinal(str.getBytes())) ;
        }
        private static String a(byte[] bArr) {
            StringBuilder sb = new StringBuilder();
            int i = 0;
            while (bArr != null && i < bArr.length) {
                String hexString = Integer.toHexString(bArr[i] & 255);
                if (hexString.length() == 1) {
                    sb.append('0');
                }
                sb.append(hexString);
                i++;
            }
            return sb.toString().toLowerCase();
        }
    }
    //log:12638599104995570fcae7895cc54a57e485d9818887ba6762c5abaaebe670dc

    方法二:Smali 汇编修改绕过

    1.AndroidKiller 直接硬编码修改成功跳过

    2.AndroidKiller插桩方式输出计算后的密码成功完成

      用户名 :123456 密码:b8ad08a3a547e35829b821b75370301dd8c4b06bdd7771f9b541a75914068718

    方法三:hook Java 层函数

    通过hook a方法的返回参数获得密码

    function hook_java() {
        Java.perform(function () {
            var LoginActivity = Java.use("com.example.androiddemo.Activity.LoginActivity");
            console.log(LoginActivity);
            LoginActivity.a.overload('java.lang.String', 'java.lang.String').implementation = function (str, str2) {
                var result = this.a(str, str2);     //调用原来的函数
                console.log("LoginActivity.a:", str, str2, result);
                return result;
            };
    ​
            var FridaActivity1 = Java.use("com.example.androiddemo.Activity.FridaActivity1");
            console.log(FridaActivity1);
    ​
            //hook函数,没有调用原来的函数,直接返回值
            FridaActivity1.a.implementation = function (barr) {
                console.log("FridaActivity1.a");
                return "R4jSLLLLLLLLLLOrLE7/5B+Z6fsl65yj6BgC6YWz66gO6g2t65Pk6a+P65NK44NNROl0wNOLLLL=";
            };
    ​
            console.log("hook_java");
        });
    }

    二、FridaActivity1

    流程分析

    解题

    方法一: Smali 汇编修改

    直接修改onCheck()方法中返回值

     

    或者修改a(byte[] bArr)方法中返回值。

    方法二:hook Java 层函数

    修改函数返回值或参数

    function hook_java() {
        Java.perform(function () {
            var FridaActivity1 = Java.use("com.example.androiddemo.Activity.FridaActivity1");
            console.log(FridaActivity1);
            //hook函数,没有调用原来的函数,直接返回值
            FridaActivity1.a.implementation = function (barr) {
                console.log("FridaActivity1.a");
                return "R4jSLLLLLLLLLLOrLE7/5B+Z6fsl65yj6BgC6YWz66gO6g2t65Pk6a+P65NK44NNROl0wNOLLLL=";
            };
    ​
            console.log("hook_java");
        });
    }

    三、FridaActivity2

    流程分析

    解题

    通过分析 static_bool_var bool_var参数为true时第二关通关成功,修改参数或调用setStatic_bool_var()/setBool_var()方法即可

    方法一:修改跳转语句

    方法二:直接调用方法

     方法三:hook Java 层函数

    调用静态函数和调用非静态函数

    function call_FridaActivity2() {
        //主动调用函数
        Java.perform(function () {
            var FridaActivity2 = Java.use("com.example.androiddemo.Activity.FridaActivity2");
            //调用静态函数
            FridaActivity2.setStatic_bool_var();    
            //Java.choose 非静态函数调用
            Java.choose("com.example.androiddemo.Activity.FridaActivity2", {
                onMatch: function (instance) {
                    instance.setBool_var();
                },
                onComplete: function () {
    ​
                }
            });
        });
    }

    四、FridaActivity3

    流程分析

    静态/非静态成员变量通过满足if语句使通关成功

    在Smali汇编中静态成员变量与非静态成员变量区别

     

    解题

    方法一:修改成员变量boolan值

    方法二:设置成员变量

    设置静态成员变量,非静态成员变量和函数名相同的成员变量

    function call_FridaActivity3() {
        Java.perform(function () {
            var FridaActivity3 = Java.use("com.example.androiddemo.Activity.FridaActivity3");
            //设置静态成员变量
            FridaActivity3.static_bool_var.value = true;       
            console.log(FridaActivity3.static_bool_var.value);
            Java.choose("com.example.androiddemo.Activity.FridaActivity3", {
                onMatch: function (instance) {
                    //设置非静态成员变量的值
                    instance.bool_var.value = true;
                    //设置有相同函数名的成员变量的值
                    instance._same_name_bool_var.value = true;
                    console.log(instance.bool_var.value, instance._same_name_bool_var.value);
                },
                onComplete: function () {
                }
            });
        });
    }

    五、FridaActivity4

    流程分析

    解题

    方法一:Smali修改返回值

    方法二:hook 内部类

    //方式一
    function hook_InnerClasses() {
        Java.perform(function () {
            
            var InnerClasses = Java.use("com.example.androiddemo.Activity.FridaActivity4$InnerClasses");
            console.log(InnerClasses);
            InnerClasses.check1.implementation = function () {
                return true;
            };
            InnerClasses.check2.implementation = function () {
                return true;
            };
            InnerClasses.check3.implementation = function () {
                return true;
            };
            InnerClasses.check4.implementation = function () {
                return true;
            };
            InnerClasses.check5.implementation = function () {
                return true;
            };
            InnerClasses.check6.implementation = function () {
                return true;
            };
        });
    }
    //方式二
    //枚举类的函数
    function hook_enum_function() {
        Java.perform(function () {
            //hook 类的多个函数
            var class_name = "com.example.androiddemo.Activity.FridaActivity4$InnerClasses";
            var InnerClasses = Java.use(class_name);
            var all_methods = InnerClasses.class.getDeclaredMethods();
            for (var i = 0; i < all_methods.length; i++) {
                var method = (all_methods[i]);
                var methodStr = method.toString();
                var substring = methodStr.substr(methodStr.indexOf(class_name) + class_name.length + 1);
                var methodname = substring.substr(0, substring.indexOf("("));
                console.log(methodname);
                InnerClasses[methodname].implementation = function () {
                    console.log("hook_mul_function:", this);
                    return true;
                }
            }
        });
    }

    六、FridaActivity5

    流程分析

    动态加载dex ,调用check()方法,返回参数满足条件语句通关成功。

    解题

    方法一:Smali修改条件语句

    getDynamicDexCheck()接口调用判断成立,只需修改check()方法满足条件。

    方法二:hook动态加载的Dex

    function hook_dyn_dex() {
        Java.perform(function () {
            var FridaActivity5 = Java.use("com.example.androiddemo.Activity.FridaActivity5");
            Java.choose("com.example.androiddemo.Activity.FridaActivity5", {
                onMatch: function (instance) {
                    console.log(instance.getDynamicDexCheck().$className);
                }, onComplete: function () {
    ​
                }
            });
            //hook 动态加载的dex
            Java.enumerateClassLoaders({
                onMatch: function (loader) {
                    try {
                        if (loader.findClass("com.example.androiddemo.Dynamic.DynamicCheck")) {
                            console.log(loader);
                            Java.classFactory.loader = loader;      //切换classloader
                        }
                    } catch (error) {
    ​
                    }
    ​
                }, onComplete: function () {
                }
            });
            var DynamicCheck = Java.use("com.example.androiddemo.Dynamic.DynamicCheck");
            console.log(DynamicCheck);
            DynamicCheck.check.implementation = function () {
                console.log("DynamicCheck.check");
                return true;
            }
        });
    }

    七、FridaActivity6

    流程分析

    解题

    方法一:Smali修改条件语句

    方法二:hook java类

    //方式一:直接返回参数为真
    function hook_FridaActivity6() {
        Java.perform(function () {
            var Frida6Class0 = Java.use("com.example.androiddemo.Activity.Frida6.Frida6Class0");
            Frida6Class0.check.implementation = function () {
                return true;
            };
            var Frida6Class1 = Java.use("com.example.androiddemo.Activity.Frida6.Frida6Class1");
            Frida6Class1.check.implementation = function () {
                return true;
            };
            var Frida6Class2 = Java.use("com.example.androiddemo.Activity.Frida6.Frida6Class2");
            Frida6Class2.check.implementation = function () {
                return true;
            };
        });
    }
    //方式二:枚举class
    function hook_enum_class() {
        Java.perform(function () {
            Java.enumerateLoadedClasses({
                onMatch: function (name, handle) {
                    if (name.indexOf("com.example.androiddemo.Activity.Frida6") >= 0) {
                        console.log(name);
                        var fridaclass6 = Java.use(name);
                        fridaclass6.check.implementation = function () {
                            console.log("frida 6 check:", this);
                            return true;
                        };
                    }
                }, onComplete: function () {
                }
            })
        });
    }
    ​

    展开全文
  • Android逆向系列(一):初探Android逆向

    万次阅读 多人点赞 2018-09-05 16:51:01
    谨此以本文开始记录我的Android逆向之旅吧。 总述 习惯于应用层开发的我们都知道,在应用上架的时候都需要程序经过编译、签名 、生成一个后缀为apk的文件才能发布到应用市场,而我认识的逆向就从这个ap...

    这段时间因为某些业务驱动,开始研究一些逆向相关的东西,浏览了下其所包含的大致内容,发现真是一个新大陆,跟之前耳听目染过的一些门面介绍完全不是一个层级的,真正的印证了下手难这一说法。

        谨此以本文开始记录我的Android逆向之旅吧。
    

    总述

    习惯于应用层开发的我们都知道,在应用上架的时候都需要程序经过编译、签名 、生成一个后缀为apk的文件才能发布到应用市场,而我认识的逆向就从这个apk开始(逆向分为多种逆向,为了避免混淆概念这里的逆向暂且就特指apk的逆向)。

    工具准备

    工欲善其身,必先利其器。这句话放到逆向对工具的描述上来说再适合不过。
    这里写图片描述

    反编译代码的工具下载:

    反编译资源的工具:

    • APKTool: 本文重要工具,APK逆向工具,使用简单下载地址: http://ibotpeaches.github.io/Apktool/install/
      这里简单介绍下大概流程,首先把后缀为.apk的文件改为.zip的一个压缩文件,方便解压。dex2jar和jd-gui配套使用,用于逆向代码部分,APKTool用于逆向res文件夹下的图片布局等部分。
      .apk 修改成.zip文件解压后的目录树长这样:
      这里写图片描述
      这里也贴上源码,很简单就一个输入框和一个按钮,输入框内输入“2018”点击按钮即可跳转到另外一个界面,否则提示一个Toast “验证码错误!”,而我们要做的就是突破这个“2018”,绕过验证。
      这里写图片描述

    反编译代码部分

    需要用到的是dex2jar包里面的三个文件(当前是在windows环境下,Mac环境用对应的.sh文件):

    • d2j_invoke.bat
    • d2j-dex2jar.bat
    • lib
      将这三个文件复制到一个空的文件夹内,将刚才.apk解压后的classes.dex文件也一起复制到这里。如图:
      这里写图片描述
      Windows cmd到这个文件夹下 输入:d2j-dex2jar.bat classes.dex
      Mac 到这个文件夹下 输入:sh d2j-dex2jar.sh classes.dex
      如此之后在这个目录里会生成一个classes-dex2jar.jar文件。如图:
      这里写图片描述
      这个时候就轮到JD-GUI工具出手了,运行jd-gui.exe File–OpenFile–classes-dex2jar.jar 打开刚才生成的jar文件。就能很清晰的看到我们想要的代码了,如图。
      这里写图片描述
      对照上面发过的主要代码,已经差不离十了,对于想要代码思路的我们来说,到这里已经基本可以摸透他的逻辑了。

    反编译res资源部分

    apktool下载后会有两个文件,一个.jar(例如apktool_2.3.3.jar 需要把名字改成apktool.jar) 一个apktool.bat 。(这两个文件在这里下载,如图:)
    这里写图片描述
    同刚才一样在cmd命令下进入刚才文件夹(同样可以新建一个),连同我们刚才那个后缀为apk的安装包一起放入,输入如下命令:

    apktool d app-release.apk   此处app-release为apk名称
    

    得到一个新的app-release(对应apk名称)文件夹。流程如图:
    这里写图片描述
    这里写图片描述
    这个app-release文件夹下会得到若干文件,主要内容介绍如下:

    • AndroidManifest.xml:描述文件
    • res:资源文件
    • smail:反编译出来的所有代码,语法与java不同,类似汇编,是Android虚拟机所使用的寄存器语言

    到此我们想要的都有了。下一步就是实现我们想法的时候了。

    修改原代码逻辑

    在刚才的JD-GUI中可以看到跳转的逻辑判断如下:

     public void onClick(View paramAnonymousView)
          {
            if (MainActivity.this.code.getText().toString().trim().equals("2018"))
            {
              paramAnonymousView = new Intent(MainActivity.this, SuccessActivity.class);
              MainActivity.this.startActivity(paramAnonymousView);
              return;
            }
            Toast.makeText(MainActivity.this, "验证码错误!", 0).show();
          }
    

    我们只需要修改if后面的判断条件,设置为否即可if (!MainActivity.this.code.…),这样就成功绕过了条件约束。

    Δ 接下来还有一部很重要那就是修改smali文件,找到MainActivity$1.smali这个文件用代码查看工具打开,如图:

    这里写图片描述
    找到这个if-eqz 修改成if-nez (nez对应为非,符号“!”),到这里要修改的部分都成功了,最后一步要做的就是重新打包了。当然对smali语法感兴趣的可以到我群里索取免费的pdf资料(415974495),大家可以一起探讨学习一下。

    重新打包

    在apktool文件夹路径的cmd下输入:

    apktool b [文件夹] -o test2.apk   (test2为新apk名称,[文件夹]为对应的有修改需要打包的文件夹)
    例如:我当前就可以这样写  apktool b [F:\tools\apktool\app-release] -o test2.apk
    

    这里写图片描述
    至此,我们的目标apk文件已经生成,当然如果你想装到你自己手机上还需要重新签名一下。

    重新签名

    首先我们需要一个用于签名的.keystore文件,生成命令如下(这里我们假设生成的是demo.keystore)。

    keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
    (cmd到apktool文件夹下跟待签名的apk放同个文件夹内便于操作)
    

    这里我们利用Java JDK提供的一个jarsigner进行签名,在刚才的cmd下继续操作,输入:

    jarsigner -verbose -keystore demo.keystore test2.apk demo.keystore
    

    这里写图片描述
    以上。我们目的apk已经可以投入使用,如果需要更快更好的体验还需要进行一次字节对齐的操作(后续分析)。

    展开全文
  • 安卓逆向必备工具

    千次阅读 2021-07-02 15:18:39
    也可以选择使用jeb,是一个很好用的逆向java工具,拖入即可,还可以查看变量调用,声明。 4、Android Killer 这个用的不是很多,一般条件允许的情况下用来把反编译的APP重新编译,用来编辑samil代码来调试。 5、...
  • [入门到高级] Android逆向学习路线【完整版】

    万次阅读 多人点赞 2019-10-20 19:51:38
    此篇整理了最完整的《Android逆向学习线路知识体系》。希望给迷糊的入门者指出一个明确的方向。 关于Android逆向、破解、脱壳、反逆向、反破解 等知识,网上没有完整的资料,也没有相关的课程。 完整的知识体系和...
  • 最近一周时间,在学习和研究Android逆向,接下来一段时间,写一系列Android逆向的博客,来总结和记录自己所掌握的知识,也希望为正在学习Android逆向的朋友带来一点帮助。 首先,简单说一下自己对Android逆向的...
  • Android逆向之动态调试全流程

    千次阅读 2021-11-21 22:58:36
    Smali层动态调试 本篇内容所涉及到的资源 ...提取码:8fs8 论述Smali调试的原理及必要性 Smali层调试的目的主要是为了调试app中的java代码 ...在PC机上java代码一般封装为jar包运行,而jar...Android平台上主要使用Java语
  • Android——Android逆向工具

    千次阅读 2022-02-13 22:00:56
    Androidkiller,Apktool,dex2jar,jd-gui,jadx-gui,JEB,Ul Automator Viewer
  • Android 逆向基础

    千次阅读 2021-10-10 19:53:28
    Android 反编译教程 博客内容 基本知识 几个重要的工具 技术原理 apktool dex2jar + jd-gui DEX文件结构学习 Monkey使用手册 Android权限列表以及说明 博客内容 介绍一些基础的反编译流程和反编译工具。 基本知识 1...
  • 简单地来说,安卓逆向是对已经打包好的APP进行反编译、源码分析了解APP实现逻辑的一门技术。我们可以把安卓安装时用到的APK文件看作一个加密后的压缩包,逆向就是要最大程序地还原出APK打包之前的源码。 逆向需要...
  • 参考 【Android 逆向】IDA 安装 ( 使用 IDA 分析 so 动态库 ) 博客 ; 三、Python 参考 【开发环境】Windows 中安装 Python 各个版本 ( 下载 Python 各版本 SDK | 安装 Python ) 在 Windows 中安装各个版本的 Python...
  • 一、Android 进程、 二、Android 应用启动流程
  • 本帖最后由 HiBlues 于 2018-12-29 12:01 编辑这段时间因为...谨此以本文开始记录我的Android逆向之旅吧。总述习惯于应用层开发的我们都知道,在应用上架的时候都需要程序经过编译、签名 、生成一个后缀为apk的文...
  • 教你做Android逆向

    千次阅读 2020-08-26 11:36:19
    Android逆向 我们来说一下Android逆向,这玩意在日常工作中用的比较少,但是作为一个Android开发者,还是要学会的,比如我们可以破解反编译别人的APP,然后进行学习分析,甚至还可以反编译后进行修改再次打包等等,...
  • 一、Android 逆向中使用的 android.permission 权限、 二、Android 系统中的 Linux 用户权限、
  • Android逆向基础-java基础入门

    千次阅读 2022-03-02 15:44:57
    一、vscode安装java插件 二、java代码基础知识扫盲了解 三、apk_java层逆向小案例 四、java与frida的hook文章推荐
  • 一、Windows 平台运行的控制台应用程序类型、 二、编译 Windows 平台运行的 Android 逆向程序、 编译该程序 , 需要安装 " 适用于最新 v142 生成工具的 C++ MFC ( x86 和 x64 ) " 组件 , 下面是安装过程 ;
  • android逆向助手

    2020-12-30 11:53:41
    Android逆向助手官方版是一款针对安卓平台的强大逆向辅助软件,功能涵盖apk反编译打包签名;dex/jar互转替换提取修复;so反编译;xml、txt加密;字符串编码等。支持直接将文件拖放到源和目标文件,不用每次都点浏览...
  • Android 逆向分析大全

    千次阅读 2020-07-23 00:46:14
    转载:Android 逆向分析大全:https://www.jianshu.com/p/a12d04fc748f 1. 概述 1.1 分析步骤 通用逆向分析步骤 1. 了解该模块正向编程相关方法 2. 使用apktool解密apk,得到资源、jni模块等文件 3. ...
  • android逆向学习路线

    2019-07-19 15:29:24
    学习路线: ...学习Android开发,推荐使用Android studio进行开发,也可以使用eclipse。完成一些小程序,学习Native开发,利用NDK完成一些native程序。在过程中了解Android系统的层次结构,四大组件等And...
  • 第一步:下载逆向助手:(链接: https://pan.baidu.com/s/15jtoFDg9LWV80HREeyx5HA 提取码: k527 )第二步:将apk文件拷贝到逆向助手的apktool目录,并CD到当前目录下:第三步:在cmd命令行中输入命令 apktool d -f ...
  • 初探android逆向

    2021-06-07 02:32:59
    好久没有更新博客了。一直在想要更新点什么样子的干货。最近看了一点有关于逆向...最近突然对逆向萌生了一点点兴趣,关于逆向的东西依旧有很多,很多apk对进行加固,加壳等等,这里的入门仅仅是对于没有加密等操作的...
  • android逆向的自学路线

    千次阅读 2021-08-30 23:52:37
    安卓安全方面的人才需求日益增加,对安卓APP的逆向分析也会成为安全从业人员的必备技能之一,但是很多刚入门的新手小伙伴对于怎么去学习却还很是迷糊。 为了实现对安卓APP的逆向分析,需要在得到对应的apk文件以后...
  • Android逆向分析概述

    千次阅读 2018-06-04 20:35:19
    学习逆向的初衷是想系统学习Android下的hook技术和工具, 想系统学习Android的hook技术和工具是因为Android移动性能实战这本书. 这本书里用hook技术hook一些关键函数来计算关键函数的调用参数和调用时长, 从而确定...
  • android逆向基础教程三

    2022-01-13 16:45:57
    首先android Studio新建Native C++工程 新建自己的cpp并JIN_Load动态注册 修改CMakeLists.txt文件 在MainActivity.java中loadlibrary自己写的lib库,因此需要动态注册的类全名即为(包名/MainActivity) ...
  • android逆向资料代下

    2019-12-15 11:01:11
    android逆向 资料代下 2018安卓逆向最新录制公开课 [MP4] 安卓逆向最新实战教学 [MP4] Android软件逆向分析基础 [MP4] frida从配置到实战 [MP4] (1G) 手游逆向实操技术实战课 [MP4] (1.2G) 安卓...
  • Android逆向

    2018-12-04 14:03:53
    由于文件内容较大,所以只能将课程放到百度云盘,如有问题可以联系
  • 一、定位内存中的修改点、 1、基址寻址法、 2、搜索定位法、

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,348
精华内容 9,739
关键字:

android逆向