首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用完整文件路径转发的GCC DLL导出

是指在使用GCC编译器生成动态链接库(DLL)时,通过指定完整的文件路径来导出函数。这种方法可以解决在不同操作系统或不同编译环境下,由于函数名修饰规则的不同导致的函数名不一致的问题。

在GCC编译器中,函数的导出是通过使用__declspec(dllexport)关键字来实现的。通常情况下,我们只需要在函数声明前加上该关键字即可导出函数,如下所示:

代码语言:txt
复制
__declspec(dllexport) void MyFunction();

然而,由于不同操作系统或不同编译环境对函数名修饰规则的不同,导致导出的函数名可能会发生变化。为了解决这个问题,可以使用完整文件路径转发的方法来导出函数。

具体步骤如下:

  1. 创建一个包含所有需要导出的函数的源文件,例如exports.c
  2. exports.c文件中,使用__declspec(dllexport)关键字来导出函数,同时在函数体内部调用实际的函数。例如:
代码语言:txt
复制
__declspec(dllexport) void MyFunction()
{
    // 调用实际的函数
    MyFunctionImpl();
}
  1. 编译exports.c文件生成动态链接库。在GCC编译器中,可以使用以下命令:
代码语言:txt
复制
gcc -shared -o mydll.dll exports.c
  1. 在使用该动态链接库的代码中,只需要包含exports.h头文件,并调用导出的函数即可。例如:
代码语言:txt
复制
#include "exports.h"

int main()
{
    MyFunction(); // 调用导出的函数
    return 0;
}

这样,通过使用完整文件路径转发的方法,可以确保在不同操作系统或不同编译环境下,函数名的一致性,从而避免了由于函数名不一致导致的链接错误。

推荐的腾讯云相关产品:腾讯云函数(SCF)

腾讯云函数(Serverless Cloud Function,SCF)是腾讯云提供的无服务器计算服务,可以帮助开发者在云端运行代码而无需关心服务器的管理和运维。通过使用腾讯云函数,可以方便地部署和管理动态链接库,并实现函数的导出和调用。腾讯云函数支持多种编程语言,包括C、C++、Python等,可以满足不同开发需求。

了解更多关于腾讯云函数的信息,请访问:腾讯云函数产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Windows Redis DLL劫持在实战中的利用

举例: 例如,假设有一个应用程序叫做"example.exe",它依赖于名为"example.dll"的动态链接库。而"example.exe"在加载"example.dll"时没有使用绝对路径,而是仅仅指定了DLL的名称。攻击者可以将恶意的"example.dll"文件放置在与"example.exe"相同的目录下,当"example.exe"启动时,系统会先在当前目录中查找"example.dll"文件,如果找到,就会加载该文件并执行其中的恶意代码。 DLL劫持可以函数转发劫持也可以往完整DLL插入恶意代码,这里用的函数转发劫持,大致流程如下图所示: https://kiwings.github.io/2019/04/04/th-DLL%E5%8A%AB%E6%8C%81/ 2.2 劫持dbghelp.dll redis-server.exe在执行bgsave时,会先在应用‍目录查找dbghelp.dll,找不到再去system32目录下找: 而不管redis的权限是Administrator还是普通用户或者Network Service,它对自己的应用目录一定有写文件的权限,我们可以通过Redis的主从复制在应用目录里写入恶意DLL。 2.3 函数转发劫持 对DLL进行函数转发劫持需要导出原本DLL的函数和地址,以保证程序通过恶意DLL调用这些函数时不影响正常功能,DLL的导出函数一般比较多,用Aheadlib之类的工具可以自动化处理。 我这里用的是DLLHijacker,它会自动处理导出表并生成一个VS2019的项目,但这个python脚本有几个bug: https://github.com/kiwings/DLLHijacker (1) VS项目中文乱码: 修复:几个写文件的地方添加 encoding="utf-8"。 (2) 函数导出表有匿名函数的时候,会导致以下报错 [-]Error occur: 'NoneType' object has no attribute 'decode 修复:在几个for循环里添加函数名是否为空的判断可以解决这个问题。 (3) 生成C/C++代码时,没有使用目标DLL的绝对路径,只是用了DLL的名字填充LoadLibrary(),这是一个很严重的bug,会导致函数转发失败、Redis的功能受到影响从而只能劫持一次: 修复:我改成了根据输入的目标DLL路径自动填充。 如果没有使用原DLL的绝对路径,在Process Monitor可以看到,只会调用应用程序目录里的恶意DLL,并没有调用原本的system32下的dbghelp.dll: 从而redis的功能受到影响,导致redis的bgsave只能触发一次DLL调用,第二次bgsave的进程会被阻塞从而无法调用DLL,并且Redis关闭后将无法启动: 这也是网上部分师傅的文章写”不会影响redis运行 但会无法重启“的原因,因为他们也是用的DLLHijacker,并且没有发现有这个坑,这不仅会影响业务,而且只能劫持一次: 正常的DLL劫持不会影响程序的功能,可以劫持很多次,假如我第一次劫持想上线CS但是没有成功,那对面可能不出网,那我可能会再劫持打一个MSF的反向shell,都没成功我也可以继续尝试MSF盲打命令: 正常的DLL转发劫持如下,调用完应用程序目录里的恶意DLL后会调用原DLL: 0x03 漏洞利用 3.1 工具使用 工具下载地址: https://github.com/P4r4d1se/dll_hijack 如是是Windows 64位的Redis DLL劫持的话,可以直接用里面的VS2022版的dbghelp项目。 其他要用我修改后的DllHijacker.py和目标DLL路径生成VS项目: python3 DLLHijacker.py C:\Windows\System32\dbghelp.dll 下载安装VS2022,只用勾C++桌面开发: https://visualstudio.microsoft.com/zh-hans/downloads 打开生成目录里的sln文件,因为原本是VS2019的项目所以会提醒你升级,选确定,不然得另外安装v142的编译组件才能编译VS2019的项目: 打开后在源文件的dllmain.app,修改里面的shellocde就行,其他不用改: 3.2 出网——Cobalt Strike 如果Redis主机直接出网,或者能通其他已经上线CS的出网主机,那直接上CS是最好的选择,CS生成C语言的payload: 源文件的dllmain.app里把payload替换进去,然后选Release x64,生成——生成解决方案: 然后主从复制将dbghelp.dll写过去并bg

01
  • ClangSharp依赖的动态库编译

    Clangen使用 ClangSharp解析头文件来完成一些中间代码的生成(如Rpc的注册代码, 桩代码, C++类导出到Lua的代码等). 而ClangSharp本身依赖了llvm, 以及自己的一个libClangSharp的库, windows和linux下需要编译一下llvm和这个库, 一般来说系统没变的情况下, 直接使用已经编译好的libclang.so/dll即可, 但有些时候遇到需要升级llvm到高版本的情况, 比如说我们之前碰到的情况 , llvm9在linux下运行速度异常(Windows下10S的流程, 在linux下处理同样的任务要快3分钟, 最后发现可能之前编译使用的是debug版本), 我们需要编译LLVM, 并且编译依赖llvm的libClangSharp, 官方文件比较简单, 而且配置项有一些问题, 可能导致不能正常编译, 所以这里记录下过程方便后续有相关需求的时候可以参照处理.

    02

    微信小程序那点事儿(必看&踩坑&实用&解决BUG)------持续更新(2)

    我们可以根据上边两个API获取系统信息 e.g. pixelRatio(设备像素比) screenWidth(屏幕宽度) locationAuthorized(允许微信使用定位的开关) bluetoothEnabled(蓝牙的系统开关) locationEnabled(地理位置的系统开关) wifiEnabled(wifiEnabled) 但是这两个方法有个共同的问题是 在真机调试的情况下,不能实时更新返回的信息 e.g. 点击按钮 获取 手机地理位置的系统开关 来判断是否提示用户打开GPS 如果在真机调试的情况下 手动打开关闭手机中的位置开关 点击按钮得到的结果并不会根据手机的状态进行更新 则不能达到你想要的效果,此时可以直接预览 打开调试 进行测试即可

    01
    领券