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

公众号: 奋飞安全
• 阅读 309

一、目标

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

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

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

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

https://github.com/asmjmp0/appdbg

作者的介绍是:

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 设置成 sources

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

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

先别着急run

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

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

https://github.com/asmjmp0/appdbg-JDK

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!

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

appdbg: 一个伪装成调试器的虚拟机 吃得苦中苦,才知道没有最苦,只有更苦。

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
公众号:  奋飞安全
公众号: 奋飞安全
Lv1
奋飞,国家高级信息系统项目管理师,独立安全研究员。 http://91fans.com.cn/
文章
59
粉丝
4
获赞
44