当前位置:首页 > 科技  > 软件

使用Frida在Windows中拦截C++函数

来源: 责编: 时间:2023-10-30 17:24:07 183观看
导读1.摘要Frida是一款基于Python+javascript的Hook框架, 可运行在Windows、Android、iOS、Linux、MacOS全平台系统中,主要使用了动态二进制插桩技术。插桩技术是指将额外的代码注入到目标程序中, 以实现收集目标运行时信

1.摘要

Frida是一款基于Python+javascript的Hook框架, 可运行在Windows、Android、iOS、Linux、MacOS全平台系统中,主要使用了动态二进制插桩技术。插桩技术是指将额外的代码注入到目标程序中, 以实现收集目标运行时信息, 插桩技术主要分为两种:源代码插桩和二进制插桩, 源代码插桩是将额外代码注入到程序源代码中,二进制插桩是将额外代码注入到二进制可执行文件中。TF228资讯网——每日最新资讯28at.com

使用Frida可以访问目标进程的内存空间,在目标程序运行时可以覆盖一些功能,从导入的类中调用函数,在堆上可以查找对象实例并使用这些对象实例,并可以Hook、跟踪和拦截函数等等。TF228资讯网——每日最新资讯28at.com

2.Frida的能力

Frida是一个非常强大的动态instrumentation框架,其主要能力包括:TF228资讯网——每日最新资讯28at.com

  • 拦截(Hook)系统API调用:可以hook目标程序的各种系统API调用,如文件、网络、进程、加密等,拦截和修改参数或返回值。
  • 注入JS代码:可以实时向目标程序注入JavaScript代码,调用其函数接口或修改程序运行逻辑。
  • 动态调试:可以动态地设置断点、Dump内存、遍历对象等,无需重启程序。
  • 反混淆和脱壳:可以通过dump内存或hook相关函数的方式对加壳/混淆的目标程序进行反混淆和脱壳。
  • 适用范围广:支持Windows、Linux、macOS、iOS、Android等主流平台。
  • 多语言绑定:提供Java、Python、C#等语言的绑定库, 可以使用脚本语言进行交互。
  • 插件机制:支持扩展自己的插件,实现自定义功能。
  • 开源免费:Frida是完全开源免费的,社区活跃。

3.Frida常用语法

Frida在实战使用过程中,经常使用的功能语法主要包括以下这些:TF228资讯网——每日最新资讯28at.com

导入frida模块:TF228资讯网——每日最新资讯28at.com

const frida = require('frida');

附加/注入进程:TF228资讯网——每日最新资讯28at.com

// 附加const session = await frida.attach(pid);// 注入const session = await frida.spawn([path], options);

创建/加载/卸载脚本实例:TF228资讯网——每日最新资讯28at.com

# 创建const script = await session.createScript(source);# 加载await script.load();# 卸载await script.unload();

导出函数:TF228资讯网——每日最新资讯28at.com

rpc.exports = {   func1: (args) => {      // ...   }}

Hook函数:TF228资讯网——每日最新资讯28at.com

Interceptor.attach(target, {  onEnter: function(args) {      },    onLeave: function(retval) {  }});

读写内存:TF228资讯网——每日最新资讯28at.com

let buf = Memory.readByteArray(addr, len);Memory.writeByteArray(addr, [1, 2, 3]);

枚举/搜索模块:TF228资讯网——每日最新资讯28at.com

// 枚举Process.enumerateModules()// 搜索Process.findModuleByName()

枚举/搜索导出函数:TF228资讯网——每日最新资讯28at.com

// 枚举Module.enumerateExports()// 搜索Module.findExportByName()

调用函数:TF228资讯网——每日最新资讯28at.com

let retval = Module.getExportByName()(args);

4.Frida安装

这里以Windows10环境为基础进行实验, 首先在Windows搜索框中搜索:PowerShell, 以管理员权限打开, 并执行以下命令:TF228资讯网——每日最新资讯28at.com

pip install frida-tools

注意:这里一定要以管理员权限打开PowerShell,否则可能会安装失败。TF228资讯网——每日最新资讯28at.com

安装成功后如图所示:TF228资讯网——每日最新资讯28at.com

图片图片TF228资讯网——每日最新资讯28at.com

输入命令frida --version 查看Frida的版本号,如果正常显示版本号,则说明安装成功, 如图:TF228资讯网——每日最新资讯28at.com

图片图片TF228资讯网——每日最新资讯28at.com

5.编写测试程序

编写测试程序的目的是要验证Frida能否成功Hook测试程序中的指定函数, 并将函数的每个参数内容进行打印。TF228资讯网——每日最新资讯28at.com

我在这里的测试程序使用C++编写, 主要完成2个函数, AES加密和解密算法, 设想的步骤是将AES加密算法和解密算法的两个函数编译成Dll,并将两个函数导出, 然后再写一个客户端程序加载Dll并调用导出函数。TF228资讯网——每日最新资讯28at.com

AES加密算法的C++代码如下:TF228资讯网——每日最新资讯28at.com

extern "C"  __declspec(dllexport) void AesEncrypt(unsigned char* plaintext, int plaintext_len, unsigned char* key, unsigned char* iv,    unsigned char* ciphertext) {    EVP_CIPHER_CTX* ctx;    int len;    int ciphertext_len;    printf("AesEncrypt is at %p/n", AesEncrypt);    ctx = EVP_CIPHER_CTX_new();    EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);    EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len);    ciphertext_len = len;    EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);    ciphertext_len += len;    EVP_CIPHER_CTX_free(ctx);}

AES加密算法函数AesEncrypt包含了四个参数,分别为: 明文字符串、明文字符串长度、Key、iv向量。TF228资讯网——每日最新资讯28at.com

TF228资讯网——每日最新资讯28at.com

AES解密算法C++代码如下:TF228资讯网——每日最新资讯28at.com

// AES解密extern "C"  __declspec(dllexport) void AesDecrypt(unsigned char* ciphertext, int ciphertext_len, unsigned char* key, unsigned char* iv,    unsigned char* plaintext) {    EVP_CIPHER_CTX* ctx;    int len;    int plaintext_len;    printf("AesDecrypt is at %p/n", AesDecrypt);    ctx = EVP_CIPHER_CTX_new();    EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);    EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len);    plaintext_len = len;    EVP_DecryptFinal_ex(ctx, plaintext + len, &len);    plaintext_len += len;    EVP_CIPHER_CTX_free(ctx);}

同样,AES解密算法函数AesDecrypt也提供了四个参数,分别为:密文文本、密文文本长度、Key、iv向量。TF228资讯网——每日最新资讯28at.com

重新建立一个新的C++工程, 这里模拟了真实程序的业务场景,对明文字符串使用AES算法加密,为了防止程序运行太快退出,这里将主要程序逻辑放到一个while循环中,并使用暂停功能进行控制,方便后面的函数Hook实验。为了方便操作, 我在中间插入了pause暂停, 方便后面手动控制函数的调用时机。TF228资讯网——每日最新资讯28at.com

应用代码如下:TF228资讯网——每日最新资讯28at.com

typedef void(__stdcall* AES_ENCRYPT_TYPE)(unsigned char*, int, unsigned char*, unsigned char*,    unsigned char*);typedef void(__stdcall* AES_DECRYPT_TYPE)(unsigned char*, int, unsigned char*, unsigned char*,    unsigned char*);int main(){    while (1) {        //std::cout << "Hello World!/n";    //原文        unsigned char plaintext[] = "This is a plaintext message";        // 密钥        unsigned char key[32] = "suntiger20232021sdvdiuyt657uhjg";        // 初始化向量        unsigned char iv[16] = "9876kvdfdkkdfdf";        // 密文缓冲区        unsigned char ciphertext[128];        memset(ciphertext, 0, 128);        // 加密        AesEncrypt(plaintext, strlen((char*)plaintext), key, iv, ciphertext);        system("pause");        unsigned char decryptedtext[128];        memset(decryptedtext, 0, 128);        AesDecrypt(ciphertext, strlen((char*)ciphertext), key, iv, decryptedtext);        printf("%s/n", decryptedtext);        system("pause");        Sleep(1);    }}

将以上代码编译执行后,每按一次空格键, 程序便会依次向下执行, 如图:TF228资讯网——每日最新资讯28at.com

图片图片TF228资讯网——每日最新资讯28at.com

6.编写插桩程序

插桩程序代码由Python和Javascript语言组合而成,功能非常强大, 以下代码是我自己实现的对动态链接库中的导出函数AesEncrypt进行Hook,建立一个Python工程,代码如下:TF228资讯网——每日最新资讯28at.com

import fridaimport sysdef on_message(message, data):    print(message)# Press the green button in the gutter to run the script.if __name__ == '__main__':    local = frida.get_local_device()    // 附加进程    session = local.attach("test.exe")    script = session.create_script("""        var baseAddr = Module.findBaseAddress('aes.dll');        // 查找函数模块        var aesEncryptAddr = Module.findExportByName("aes.dll", "AesEncrypt");        Interceptor.attach(aesEncryptAddr, {        onEnter: function(args) {            send(args[0]);            console.log('');            console.log('[+]plaintext: ' + Memory.readUtf8String(args[0]));            console.log('[+]plaintext len: ' + args[1].toInt32());            console.log('[+]key:' + Memory.readUtf8String(args[2]));            console.log('[+]iv:' + Memory.readUtf8String(args[3]));        }    });    """)    script.on('message', on_message)    script.load()    sys.stdin.read()    session.detach()

在上面的Hook代码中,我主要完成了以下操作:TF228资讯网——每日最新资讯28at.com

  • 通过frida在本地查找进程test.exe,也就是我上面实现的客户端测试程序进程。
  • 通过Javascript脚本在进程中查找模块aes.dll, 这个动态链接库是我上面实现的AES加解密测试程序。
  • 在动态链接库中查找导出函数AES加密函数:AesEncrypt,并附加到该函数地址进行参数监控。
  • 打印每个参数的内容。

以下是我执行插桩程序后,获取到的参数内容,如图:TF228资讯网——每日最新资讯28at.com

图片图片TF228资讯网——每日最新资讯28at.com

可以看到,已经成功把解密函数的四个参数全部打印出来, C++函数Hook成功。TF228资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-15861-0.html使用Frida在Windows中拦截C++函数

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: JS 常见的 六种继承方式,你知道几种?

下一篇: 四种常见线程池的原理,你学会了吗?

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • 多线程开发带来的问题与解决方法

    多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • “又被陈思诚骗了”

    “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 当家的盒马,加速谋生

    当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己&ldquo;当家&rdquo;的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 微博大门常打开,迎接海外画师漂洋东渡

    微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    在昨日举行的的联发科新一代旗舰芯片天玑9200+的发布会上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品将全球首发搭载这款当前性能最强大的移动平台
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
  • 外交部:美方应停止在网络安全问题上不负责任地指责他国

    外交部:美方应停止在网络安全问题上不负责任地指责他国

      中国外交部今天(16日)举行例行记者会。会上,有记者问,美国情报官员称,他们正在阻拦来自中国以及其他国家的黑客获取相关科研成果。 中方对此有何评论?对此
Top