安卓逆向-用Frida写代码进行脱壳

常用Frida的API
function_address = Module.findExportByName(libname, function);
Interceptor.attach(address, func);
Interceptor.attach(address,
 onEnter: function (args) {
 },
 onLeave: function (retval) {
 }
)
File 模块 写文件流程
 new File(filepath, mode)
 write(data)
 flush()
 close()
file = new File("yuanrenxue.dex", "wb")
//data 是字符串或者 arrayBuffer // readByteArray() 返回的arrayBuffer
file.write(data)
file.flush()
file.close()
//把内存里的值转成字符串
Memory.readUtf8String()
//把内存里的值转换成整型
Memory.readInt()
//以begin为起始位置,从内存中读length长度的数据出来 返回ArrayBuffer类型
Memory.readByteArray(begin, length)
//把地址转换成NativePointer类型 frida里操作内存地址需要先转成NativePointer类型!!!
ptr()
JS api
#把其它进制转换成10进制
parseInt(num, radix)
复习dex文件格式
https://www.jianshu.com/p/f7f0a712ddfe

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

复习脱壳原理:
 复习:加固壳是如何运行起来的?
 1. -->APP启动
 2. -->壳dex先加载起来
 3. -->壳负责把源dex文件读出来
 4. -->壳把源dex文件解密
 5. -->把解密后的dex加载进内存 源dex运行起来

 源dex文件最终会加载进内存
 Hook加载Dex的函数(OpenMemory),把Dex从内存中dump出来
 Hook DexFile::OpenMemory()
 DexFile::OpenMemory(const uint8_t* base,size_t size,const std::string& location,
 uint32_t location_checksum,MemMap* mem_map,//nullptrconst OatDexFile* oat_dex_file,
 std::string* error_msg)
Frida代码脱壳
从手机端获取要hook的函数的so文件

在这里插入图片描述

用IDA打开得到OpenMemory的导出名

在这里插入图片描述

利用Frida的API进行导出(进行app重启非常重要device.resume(pid))
import frida, sys

def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)
package = 'com.iCitySuzhou.suzhou001'
jscode = """
var openMemory_address = Module.findExportByName("libart.so","_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_")

Interceptor.attach(openMemory_address,{
    onEnter:function(args){
        console.log("start")
        // dex文件的起始位置
        var dex_begin_address = args[1]

        // dex文件的前8个字节是magic字段,打印magic会显示"dex 035"这三个字符,可以验证是否为dex文件
        console.log("magic:"+Memory.readUtf8String(dex_begin_address))

        // 把地址转换成整形,再加32,因为dex文件的第32个字节处存放的是dex文件的大小
        var address = parseInt(dex_begin_address,16) + 32

        // 把address地址指向的内存读取出来,该值就是dex的文件大小
        // ptr(address)转换的原因是frida只接受NativePointer类型的指针
        var dex_size = Memory.readInt(ptr(address))
        console.log("dex_size:"+dex_size)

        // frida写文件,把内存中的数据写到本地
        var timestamp = new Date().getTime();
        var file = new File("/data/data/%s/"+timestamp+".dex",'wb')
        
        // Memory.readByteArray(begin,length)把内存里的数据读出来,从begin开始读,取length的长度
        file.write(Memory.readByteArray(dex_begin_address,dex_size))
        file.flush()
        file.close()

        send("dex begin address:"+parseInt(dex_begin_address,16))
        send("dex file size :"+dex_size)
    },
    onLeave: function (retval) {
        if (retval.toInt32() > 0) {
        }
    }
})
"""% (package)

# 定位jar包
device= frida.get_usb_device()
pid = device.spawn(['com.iCitySuzhou.suzhou001'])
process = device.attach(pid)
# 传入上面的js代码创造脚本
script = process.create_script(jscode)
# 接受信息打印信息模块
script.on('message', on_message)
print('[*] Running')
script.load()
# 重启的方法非常重要!为了能hook到,重启一遍这样是最好不过的了
device.resume(pid)
sys.stdin.read()

这样既可成功把引力波的壳脱出来
熟悉安卓虚拟机加载dex文件的流程(进阶)
https://www.jianshu.com/p/f81242ad8cb7
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Frida是一款强大的动态分析工具,可以用于测试。下面是使用Frida进行测试的详细教程: 1. 安装Frida 首先需要在电脑上安装Frida,可以从Frida官网下载安装包进行安装。安装完成后,可以在终端中输入以下命令来检查Frida是否安装成功: ``` frida-ps -U ``` 如果输出了设备中运行的进程信息,则Frida安装成功。 2. 查找目标应用程序 使用以下命令来查看设备上所有运行的应用程序: ``` frida-ps -U ``` 找到目标应用程序的进程ID或名称。 3. 编Frida脚本 编Frida脚本来实现功能。以下是一个简单的脚本示例: ``` function dump_memory(address, size, file_path) { var buffer = Memory.readByteArray(ptr(address), size); var file = new File(file_path, 'wb'); file.write(buffer); file.flush(); file.close(); console.log('Dumped memory to ' + file_path); } Interceptor.attach(Module.findExportByName(null, 'memcpy'), { onEnter: function(args) { if (args[0].toInt32() == 0x12345678) { dump_memory(args[1], args[2], '/sdcard/dump.bin'); } } }); ``` 这个脚本会在应用程序调用memcpy函数时,判断目标内存地址是否为0x12345678,如果是则将内存内容保存到指定的文件中。 4. 运行Frida脚本 使用以下命令来运行Frida脚本: ``` frida -U -l script.js -f com.example.app ``` 其中,-U表示连接USB设备,-l指定脚本文件,-f指定目标应用程序。 5. 测试脚本 运行目标应用程序,触发脚本中的条件,查看指定的文件是否成功保存了内存内容。 注意:脚本中的条件和保存路径需要根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值