appdbg: 一个伪装成调试器的虚拟机

简介: appdbg: 一个伪装成调试器的虚拟机

一、目标


现在的App都不安分,Java层去和Native挤眉弄眼,Native层又喜欢和Jave去暗通款曲。


想安安静静的分析一个so太难了。


有没有可能把App在Pc上都模拟执行起来,这样Native再去勾搭Jave层的时候就可以节省很多补环境的工作了。


appdbg就是这样一个 伪装成调试器的虚拟机。


github.com/asmjmp0/app…


作者的介绍是:


make it possible to run android dex file in original Java Virtual Machine.

  • change every class before it will be loaded
  • change every item of the class after it was loaded
  • hook java method
  • implement native method by yourself or unidbg...
  • provide java method level debug ability (dex2jar transformed class file without debug info,so we can't step in)


反正看上去很牛掰就是了。


二、步骤

先装个gradle


我本机的环境如下

  • mac 10.14.6
  • jdk 1.8
  • intelliJ idea 2020.1.2


appdbg这个工程是用 gradle来编译的,idea也可以自动配置好,不过自己装个 gradle 感觉更好一点。

brew install gradle


安装完毕之后,执行 gradle -v 成功打印出信息就算安装成功了。


开始编译 --- 配置 sdk 和 ndk 路径


先把代码 git clone 下来,然后在根目录 运行 #gradle build#

* What went wrong:
A problem occurred configuring project ':test-app'.
> SDK location not found. Define location with an ANDROID_SDK_ROOT environment variable or by setting the sdk.dir path in your project's local properties file at '/Users/fenfei/Desktop/work/blogCode/ffgithub/appdbg/local.properties'.


不出意外,报错了,由于作者带了一个Android App的例子,里面编译需要android sdk和ndk。所以要先配置下sdk和ndk的路径


在工程根目录下面增加一个文件 local.properties, 内容如下

# 针对自己电脑中的Android sdk路径来配置
sdk.dir=/Users/fenfei/Library/Android/sdk


这个工程里面 Android Api使用的是31  **compileSdkVersion 31 **  ,所以我先用 Android Studio中的 SDK Manager 下载了 Android Api 31


然后在 test-app/build.gradle 中配置一下这个NDK路径

android {
    compileSdkVersion 31
    buildToolsVersion "30.0.0"
  ndkPath "/Users/fenfei/Library/Android/sdk/ndk/21.4.7075529"
   ...  
}


继续编译


androidX控件问题

/appdbg/test-app/src/main/java/jmp0/test/testapp/MainActivity.kt: (3, 24): Unresolved reference: v7
/appdbg/test-app/src/main/java/jmp0/test/testapp/MainActivity.kt: (11, 22): Unresolved reference: AppCompatActivity


这个是google的ui升级问题。 对于咱们这种二把刀Android程序员来说只能问谷哥了。

// test-app/src/main/java/jmp0/test/testapp/MainActivity.kt
// import android.support.v7.app.AppCompatActivity
import androidx.appcompat.app.AppCompatActivity


下一个错误是

/appdbg/test-app/src/main/java/jmp0/test/testapp/TestContext.kt: (9, 24): Unresolved reference: annotation
/appdbg/test-app/src/main/java/jmp0/test/testapp/TestContext.kt: (33, 6): Unresolved reference: RequiresApi


谷哥说了,要这么改

// test-app/src/main/java/jmp0/test/testapp/TestContext.kt
// add fenfei
// import android.support.annotation.RequiresApi
import androidx.annotation.RequiresApi


继续编译


Android SDK版本

Fix the issues identified by lint, or add the following to your build script to proceed with errors:
  ...
  android {
      lintOptions {
          abortOnError false
      }
  }
  ...
  Errors found:
  /Users/zzx/Desktop/work/blogCode/ffgithub/appdbg/test-app/src/main/java/jmp0/test/testapp/TestContext.kt:55: Error: Call requires API level 26 (current min is 19): testIMEI [NewApi]
          testIMEI()
          ~~~~~~~~


这是两个错误,一个貌似是要让我们加上个编译命令, 另一个貌似是嫌咱们的 minSdkVersion 版本设置的太低。


在 test-app/build.gradle 中改改吧

android {
    ... 
  defaultConfig {
        applicationId "jmp0.test.testapp"
      minSdkVersion 28  // 19
      。。。
    }
... 
  lintOptions {
        abortOnError false
    }
...   
}


绿色的 BUILD SUCCESSFUL 出现了


运行


终于可以愉快的运行了。  作者说 run main


我哭了, 一开始 没搞明白 run 哪个 main。工程里面 main还不少呢。


后来发现 大概率是 run core/src/main/java/jmp0/Main.kt 这个main


但是 右键之后没有run呀。


二把刀java程序员太难了。


问了下谷哥,哥说了 File -> Project Structure 把 core/src 设置成 sources667.png


这下在 Main.kt 文件上点右键 就可以run了 (如果还没出现,就把IDEA关闭之后重新打开下 等它 Scan indexing 结束)


先别着急run


有两步活要干,一步是给 jdk打补丁。 这一步比较麻烦


我就直接使用作者搞好的jdk


github.com/asmjmp0/app…


mac 下还需要把 libjvm.dylib 重新签一下名, 签名的id从 xcode里面之前注册好的找

codesign -f -s "Developer ID Application: Fei Fen (HHZN32E11C)" libjvm.dylib


另一步就是为了支持 io重定向,需要给 rt.jar打补丁。 这一步只需要运行JDKmodifiy工程就可以了。用生成的rt.jar 来替换jdk中的 rt.jar


大功告成


可以好好分析一下 main函数中的例子了。


三、总结


编译过程中还遇到了

> Task :prepareKotlinBuildScriptModel UP-TO-DATE
IOException: https://dl.google.com/android/repository/addons_list-3.xml
java.net.ConnectException: Connection refused: connect
IOException: https://dl.google.com/android/repository/addons_list-2.xml
java.net.ConnectException: Connection refused: connect
IOException: https://dl.google.com/android/repository/addons_list-1.xml
java.net.ConnectException: Connection refused: connect
Failed to download any source lists!


这个加上科学上网就可以了。

887.png


吃得苦中苦,才知道没有最苦,只有更苦。


TIP: : 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。


关注微信公众号: 奋飞安全,最新技术干货实时推送

相关文章
|
6月前
|
安全 Java API
银行转账p图在线生成, 虚拟转账生成器, 银行卡转账模拟器【娱乐装逼神器】
这是一套模拟银行核心业务逻辑的Java程序,包含账户管理、资金存取与转账、交易记录等功能。代码采用线程安全设计
|
5月前
|
JSON API 数据安全/隐私保护
农业银行模拟器,工商建设邮政中国银行,虚拟余额生成模拟器
这个银行模拟系统包含三个主要模块:核心银行账户逻辑、图形用户界面和REST API接口
|
机器学习/深度学习 人工智能 自然语言处理
Sketch2Lineart:AI绘画工具,自动将手绘草图转换成清晰的线条画
Sketch2Lineart是一款基于人工智能的绘画工具,能够自动将手绘草图转换成清晰的线条画。该工具支持多种功能,如草图转线稿、自动描述生成、细节调整和风格定制等,适用于艺术创作、产品设计、教育培训等多个领域。
1164 60
Sketch2Lineart:AI绘画工具,自动将手绘草图转换成清晰的线条画
|
传感器 机器学习/深度学习 人工智能
超全汇总 | 基于Camera的3D目标检测算法综述!(单目/双目/伪激光雷达)
目前3D目标检测领域方案主要包括基于单目、双目、激光雷达点云、多模态数据融合等方式,本文主要介绍基于单目、双目和伪激光雷达数据的相关算法,下面展开讨论下~
超全汇总 | 基于Camera的3D目标检测算法综述!(单目/双目/伪激光雷达)
|
JavaScript 前端开发 API
node+vue3+mysql前后分离开发范式——实现对数据库表的增删改查
node+vue3+mysql前后分离开发范式——实现对数据库表的增删改查
577 1
|
数据采集 存储 安全
轻松解决爬虫数据采集痛点
轻松解决爬虫数据采集痛点
310 0
|
机器学习/深度学习 传感器 算法
目标检测+车道线识别+追踪+测距(代码+部署运行)
目标检测+车道线识别+追踪+测距(代码+部署运行)
|
机器学习/深度学习 自动驾驶 定位技术
【论文解读】SMOKE 单目相机 3D目标检测(CVPR2020)
 SMOKE是一种用于自动驾驶的实时单目 3D 物体检测器。为什么会注意这边文章呢?是因为这两天发布的百度Apollo 7.0 的摄像头障碍物感知,也是基于这个模型改进的;于是令我产生了一些兴趣。
996 0
|
存储 小程序 JavaScript
微信小程序--》数据绑定和事件绑定
⚓经过web前端开发的学习,相信大家对于前端开发有了一定深入的了解,今天我开设了微信小程序,主要想从移动端开发方向进一步发展,而对于我来说写移动端博文的第一站就是小程序开发,希望看到我文章的朋友能对你有所帮助。
615 0
微信小程序--》数据绑定和事件绑定
|
Go C语言 Windows
【教程】使用 IDA Pro + 010 Editor 反编译和修改 so 文件,让你轻松玩转逆向工程!
当我们在做逆向工作时,总会遇到需要查看某个 so 文件的情况,甚至可能需要对其进行一些微小的修改。这时候,我们就需要来点反编译的魔法了。
12119 0
【教程】使用 IDA Pro + 010 Editor 反编译和修改 so 文件,让你轻松玩转逆向工程!