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

为什么我可以使用运行时加载的dll未导出的函数

运行时加载的dll未导出的函数是指在运行时通过动态链接库(dll)加载函数,而这些函数并没有在dll的导出表中显式地导出。这种情况下,我们可以使用一些技术手段来调用这些未导出的函数。

首先,为什么会出现运行时加载的dll未导出的函数呢?这通常是由于开发者在编写dll时,将某些函数定义为了内部函数或私有函数,没有在导出表中进行声明。这样做的目的可能是为了隐藏某些实现细节,或者限制对某些函数的访问。

然而,有时候我们可能需要调用这些未导出的函数,例如在进行逆向工程、调试或者扩展某个程序的功能时。下面介绍几种常见的方法来实现这个目标:

  1. 使用GetProcAddress函数:GetProcAddress函数可以通过函数名或者序号来获取dll中的函数地址。即使函数没有在导出表中声明,我们仍然可以通过GetProcAddress来获取它的地址,并调用它。具体使用方法可以参考微软官方文档:GetProcAddress函数
  2. 使用装载器技术:有些工具或者框架提供了特殊的装载器技术,可以绕过导出表直接调用dll中的函数。例如,一些逆向工程工具(如IDA Pro)或者Hook框架(如Detours)可以帮助我们实现这个目标。具体使用方法可以参考相关工具或框架的官方文档。

需要注意的是,调用未导出的函数存在一定的风险和限制。首先,这些函数并没有在dll的导出表中声明,可能是因为它们的实现不稳定或者不完善。因此,调用这些函数可能导致程序崩溃或者产生不可预料的结果。其次,由于这些函数并没有在导出表中声明,它们的名称和参数列表可能会随着dll版本的更新而发生变化,从而导致调用失败。因此,在调用未导出的函数时,需要谨慎并进行充分的测试和验证。

总结起来,通过运行时加载未导出的dll函数可以帮助我们实现一些特殊的需求,但需要注意风险和限制。在实际应用中,我们应该遵循良好的开发实践,尽量使用导出的函数,并进行充分的测试和验证。

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

相关·内容

箭头函数与普通函数(function)区别是什么?构造函数(function)可以使用 new 生成实例,那么箭头函数可以吗?为什么

基本不同 1.写法不同,箭头函数使用箭头定义,普通函数中没有 .箭头函数都是匿名函数,普通函数可以有匿名函数,也可以有具体名函数,但是箭头函数都是匿名函数。...在普通函数中,this总是指向调用它对象,如果用作构造函数,this指向创建对象实例。箭头函数中没有this,声明时捕获其所在上下文this供自己使用。...所以箭头函数结合call(),apply()方法调用一个函数时,只传入一个参数对this没有影响。...obj x fn1.apply(obj); // obj x fn2.call(obj); // window x fn2.apply(obj); // window x 4.箭头函数可以做构造函数...,不能使用new 关键字,因为new关键字是调用函数对象constructor属性,箭头函数中没有该属性,所以不能new function fn1(){ console.log

1.7K10

Amlegit - amlegit.com 逆向工程(1)

在 Ida 中打开它们每个都向我展示了至少两个导出(启动和 amlegit 程序员定义另一个函数)虽然导出表是可解析,但函数本身却不是,即使在运行时查看函数数据也无法理解。...为了让自己调用这些导出函数需要知道调用约定(很可能是 fastcall)、参数和返回类型。这可以通过查看调用这些导出函数内容来实现。...此函数用于将签名驱动程序映射到内核中。...那么如果我们不能解析这些函数在做什么,我们为什么要查看模块内部呢?那么简单地把 mmap.dll 实际上加载 buffer.dll 并调用 GetDriver。...通过读取程序集,我们可以知道正在使用整个 64 位数据(这意味着它返回一个 long long)。

957160

Dll注入技术之劫持注入「建议收藏」

引用网络中原理讲解 ●背景知识● 首先我们要了解Windows为什么可以DLL劫持呢?主要是因为Windows资源共享机制。...利用系统这个特性,就可以使应用程序强制加载我们指定DLL做一些特殊工作。...举个例子来说吧,Windows系统目录下有一个名为LPK.DLL系统文件,程序运行时会在c:\Windows\system32文件夹下找到这个DLL文件并加载它。...可以看出我们要实现这个DLL需求如下: 1、构造一个与系统目录下LPK.DLL一样导出表; 2、加载系统目录下LPK.DLL; 3、将导出函数转发到系统目录下LPK.DLL上; 4、在初始化函数中加入我们要执行代码...如图: 查看我们伪造LPK.DLL导出表,与系统原来一样 运行程序后先加载了我们伪造LPK.DLL,程序被劫持 从模块列表中也可以看到,既加载了我们伪造LPK.DLL,也加载了系统lpk.dll

1.6K30

c#封装动态库_nginx调用so动态库

使用动态库时候,往往提供两个文件:一个引入库和一个DLL。引入库包含被DLL导出函数和变量符号名,DLL包含实际函数和数据。...在编译链接可执行文件时,只需要链接引入库,DLL函数代码和数据并不复制到可执行文件中,在运行时候,再去加载DLL,访问DLL导出函数。...3)在运行时可以动态地选择加载各种应用程序模块 下面重点介绍Windows下动态链接库DLL. DLL即动态链接库(Dynamic-Link Libaray)缩写,相当于Linux下共享对象。...(1)导出与导入 在ELF(Linux下动态库格式),共享库中所有的全局函数和变量在默认情况下都可以被其他模块使用,即ELF默认导出所有的全局符号。...应用程序使用DLL可以采用两种方式:一种是隐式链接(调用),另一种是显式链接。在使用DLL之前首先要知道DLL函数结构信息 。

2.6K20

C++动态链接库

定义 通过使用 DLL,程序可以实现模块化,由相对独立组件组成。例如,一个计帐程序可以按模块来销售。可以运行时将各个模块加载到主程序中(如果安装了相应模块)。...如果您使用运行时动态链接,则只有个别 DLL 不会加载。   入口点函数只应执行简单初始化任务,不应调用任何其他 DLL 加载函数或终止函数。...导出 DLL 函数导出 DLL 函数,您可以导出 DLL 函数中添加函数关键字,也可以创建模块定义文件 (.def) 以列出导出 DLL 函数。   ...两种方法   方法一、向导出 DLL 函数中添加函数关键字   要使用函数关键字,您必须使用以下关键字来声明要导出各个函数:   __declspec(dllexport)   要在应用程序中使用导出...方法二、创建模块定义文件 (.def) 以列出导出 DLL 函数   使用模块定义文件来声明导出 DLL 函数。当您使用模块定义文件时,您不必向导出 DLL 函数中添加函数关键字。

2.4K50

PE文件和COFF文件格式分析——导出应用——一种插件模型

(转载请指明出于breaksoftwarecsdn博客)         首先要说是Exe是可以导出PE分析工具扫描了电脑上所有文件。发现有导出Exe文件还不少。...一开始还不能理解为什么要在Exe中搞导出函数。后来查了相关资料,发现这样做是为了方便开发插件,这让一下焕然大悟。        ...然后插件就加载这个DLL,调用该DLL方法。如下图 ?         这样就很好解决了之前不足。貌似离最佳不远了,但是想想,是不是还可以优化呢?...我们这么设计要多维护一个DLL(PluginHelper.dll),这个也就引入了一个不稳定因素。那么这个DLL可以省掉么?省掉后导出那些函数放哪儿?        ...我们让A.exe导出函数,反正我们A.exe也是要加载B.dll、C.dll和D.dll,这样还可以省下PluginHelper.dll加载如上DLL过程。现在写了一个工程,模拟这种插件模型。

59450

DLL注入新姿势:反射式DLL注入研究

然而,要”加载”一个DLL,我们使用LoadLibrary函数要求该DLL必须存在于文件系统中。这可怎么办呢。 没错,我们需要抛弃LoadLibrary,自己来实现整个装载过程!...我们可以为待注入DLL添加一个导出函数,ReflectiveLoader,这个函数实现功能就是装载它自身。...于是,我们任务就转到了编写这个ReflectiveLoader上。由于ReflectiveLoader运行时所在DLL还没有被装载,它在运行时会受到诸多限制,例如无法正常使用全局变量等。...其中,被注入DLL除了需要导出一个函数ReflectiveLoader来实现对自身加载之外,其余部分可以正常编写源代码以及编译。...在获取了模块基地址之后,通过对PE文件解析,找到DLL文件导出表,再根据导出表就可以找到任一导出函数地址了。对PE文件解析有太多文章,这里也不细致阐述了。

2K30

白加黑免杀制作(详细)

静态链接库(.lib) 在编译动态链接库(.dll)时还会输出相应静态链接库(.lib): lib 文件中包含一些索引信息,记录了 dll函数入口和位置,lib 用于在开发编译时使用dll 则在运行时使用...使用 dumpbin 查看使用extern "C"时导出函数使用extern "C"时32 位导出函数可以看到 32 位函数名保持了原样输出,不过括号内还是以 __cdecl 约定修饰...使用extern "C"时64 位导出函数可以看到 64 位导出函数名保持了原样输出,不过括号内函数名也保持了原样。...这样只有一个导出函数 dll 就编写完成了,点击[生成]->[生成 dll]: 2. dll 导出函数查看 (1)使用 dumpbin 查看 dumpbin 是 vs 自带一款工具,可以查看 obj...查看一下导出函数可以看到成功导出函数,用这种方法比我们一个一个弄导出函数要快很多: 运行 exe,发现只有 DllMain 中弹窗被执行,导出函数弹窗并没有被执行: 这是因为程序必须完整加载所有

3.2K50

白加黑保姆教程通杀主流杀软

延迟加载目标 DLLDLL A 中函数被调用时,首先使用 LoadLibrary 加载目标 DLLB。...当Dll使用LoadLibrary加载使用FreeLibrary函数卸载dll时候,系统还会回调该函数入口点函数。...当程序运行时,操作系统会将静态链接库(Static Link Library)中代码和数据复制到程序内存空间中,这样程序就可以直接使用 DLL功能。...由于 DLL 文件已经被嵌入到可执行文件中,因此程序在运行时不需要再加载 DLL 文件,可以直接执行。...也就是说创建线程申请内存加载shellcode需要在导出函数里面操作,不能再dllmain里面直接操作,需要找到第一个执行函数就能行,但是麻烦,我们可以可以新定义一个函数来申请内存,加载到内存中,在dllmain

500

CC++ 通过中转函数实现DLL劫持

这里就先来演示一下简单Dll劫持,首先我们必须指定要劫持Dll文件,将其中导出函数全部导出来,导出输入表项目只能比原来多,不能少,导出方式有很多,比如可以使用AheadLib等工具,快速生成利用代码...DLL导出两个函数,然后创建主程序动态加载这个DLL。...编译main.cpp 动态加载函数,将lyshark.dll放入同一个目录下即可,程序运行后会动态调用DLL导出函数。...,当程序访问原DLL时直接将请求转发到我们自己DLL中,我们DLL再将请求转发到真实DLL上面,使用本节课小工具可以快速构建转发函数表,执行如下命令即可:GenEAT.exe -d c://lyshark.dll...你可以对其导出函数进行Hook转向,读取参数啥都没问题,自由发挥吧。

90710

dll 劫持和应用

3 dll劫持概要 dll(动态链接库)作为 windows 函数库,有助于促进代码模块化、代码重用、有效内存使用并减少磁盘空间;一个应用程序运行时可能需要依赖于多个 dll 函数才能完成功能,...1.手动转发 当 dll 导出函数比较少时,我们可以按照正常 dll 开发流程,逐个定义函数名称,然后在函数内部使用 LoadLibrary() 函数调用原 dll 对应函数完成功能,如下: [...3.LoadLibrary转发函数] 2.def文件 当 dll 导出函数太多时,我们就不能手动转发了,使用模块定义(.def)文件编写导出函数信息,由链接器自动实现函数转发,细节可以参考 https...,当应用程序运行时加载我们恶意 version.dll,当调用函数时,将由恶意 version.dll 进行函数转发: something.exe => version.dll (malware)...] 部分 dll 导出函数没有导出名称,只有导出序号,Gcc 和 Tcc 不支持按序号导出函数转发,读者遇到的话可以使用 VisualStdio 3.pragma预处理 除了上文使用模块定义文件来实现函数转发

72830

编写dll时,为什么有 extern “C”

假设被调用DLL存在一个导出函数,原型如下: void printN(int); 三种方式从DLL导入导出函数 生成DLL使用模块定义 (.def) 文件 在主应用程序函数定义中使用关键字__declspec...为了使得dll可以通用些,很多时候都要使用CName-Mangling方式,即是对每一个导出函数声明为extern “C”,而且采用_stdcall调用约定,接着还需要对导出函数进行重命名,以便导出不加修饰函数名...因为dll中必须说明函数要用于导出,所以_declspec(dllexport)很有必要。但是可以换一种方式,可以使用def文件来说明哪些函数用于导出,同时def文件里边还有函数编号。...这个可能不是很重要,因为可以自己在调用函数时候设置函数调用规则。像VC就可以设置函数调用方式,所以可以方便使用win32汇编产生dll。...编译dll后会产生一个dll文件和一个lib文件,如果是运行时动态调用方式只使用dll文件就行,如果要在编译时以库形式提供给exe调用则需要lib文件。

2.3K10

【专业技术第五讲】动态链接库及其用法

如果您使用运行时动态链接,则只有个别 DLL 不会加载。 入口点函数只应执行简单初始化任务,不应调用任何其他 DLL 加载函数或终止函数。...如何导出导出 DLL 函数,您可以导出 DLL 函数中添加函数关键字,也可以创建模块定义文件(.def) 以列出导出 DLL 函数。...向导出 DLL 函数中添加函数关键字 要使用函数关键字,您必须使用以下关键字来声明要导出各个函数: __declspec(dllexport)要在应用程序中使用导出 DLL 函数,您必须使用以下关键字来声明要导入各个函数...创建模块定义文件以列出导出 DLL 函数 使用模块定义文件来声明导出 DLL 函数。当您使用模块定义文件(.def)时,您不必向导出 DLL 函数中添加函数关键字。...在运行时动态链接中,您应使用与以下代码类似的代码来调用 SampleDLL.dll导出 DLL 函数。 //...

96570

exe调用DLL方式

假设被调用DLL存在一个导出函数,原型如下: void printN(int); 三种方式从DLL导入导出函数 生成DLL使用模块定义 (.def) 文件 在主应用程序函数定义中使用关键字__declspec...为了使得dll可以通用些,很多时候都要使用CName-Mangling方式,即是对每一个导出函数声明为extern “C”,而且采用_stdcall调用约定,接着还需要对导出函数进行重命名,以便导出不加修饰函数名...因为dll中必须说明函数要用于导出,所以_declspec(dllexport)很有必要。但是可以换一种方式,可以使用def文件来说明哪些函数用于导出,同时def文件里边还有函数编号。...这个可能不是很重要,因为可以自己在调用函数时候设置函数调用规则。像VC就可以设置函数调用方式,所以可以方便使用win32汇编产生dll。...编译dll后会产生一个dll文件和一个lib文件,如果是运行时动态调用方式只使用dll文件就行,如果要在编译时以库形式提供给exe调用则需要lib文件。 编写exe调用dll 项目结构: ?

2.4K10

PE格式第六讲,导出

何为延时加载 我们知道,如果你写API有几万个,那么一开始就填写到IAT表格中,那么你程序会很慢. 那么就会使用延时加载表(也是数据目录中)那么用到那个,才填写. ?...可以查看结构体(数据目录结构体)下面可以找到这个表格.这个就是延时加载表 二丶何为导出表?...那么看下这里重要成员 1.执行导出表文件名字符串 2.base 导出函数起始序号 3.导出函数地址表RVA 4.函数名称地址表RVA 5.函数序号地址表 这里我们随便找个DLL,使用010模版,看下结构到底怎么存储...存放00001000 第一个函数地址偏移 第二个函数地址偏移  00001020  第三个函数地址偏移00001040 为什么存放函数地址偏移,因为这个是个DLL,加载到程序时候,DLL模块不固定...五丶BASE成员,导出序号,函数导出,以及函数地址表之间关系 1.函数名称,序号表,以及和函数地址表中关系 首先我们要知道,DLL导出函数可以按照序号导出,也可以按照函数名字导出,但是怎么和函数地址表关联起来那

99360

绝大部分测试和开发人员都不知道DLL

使用动态库情况下,在编译链接可执行文件时,只需要链接该DLL引入库文件,该DLL函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需DLL,将该DLL映射到进程地址空间外...名字改编和”extern “C”” C++编译器在生成DLL时,会对导出函数进行名字改编,并且不同编译器使用改变规则不一样,因此改编后名字会不一样。...显示加载方式加载DLL 使用动态方式来加载动态链接库时,需要用到LoadLibrary函数。该函数作用就是将指定可执行模块映射到调用进程地址空间。...当加载到动态链接库模块句柄后,接下来就要想办法获取该动态链接库中导出函数地址,这可以通过调用GetProcAddress函数来实现。...加载DLL两种方式优缺点: 采用动态加载方式,那么可以在需要时才加载DLL,而隐式链接方式实现起来比较简单,在编写客户端代码时就可以把链接工作做好,在程序中可以随时调用DLL导出函数

71520

不能定义声明dllimport_不允许 dllimport 静态数据成员

为什么不能将这2个函数定义放在.cpp文件中上面已经有解释了。 上面说不太完美:添加以下说明: __declspec(dllexport) 声明一个导出函数,是说这个函数要从本DLL导出。...要给别人用。一般用于dll中 省掉在DEF文件中手工定义导出哪些函数一个方法。...要用。一般用于使用某个dllexe中 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好代码。...另外,在DLL使用DLL函数可以这样做,从而提高空间和时间效率。 变量导入 与函数不同是,在使用DLL变量时,需要显示地导入变量。...初看起来,这段话前面的意思是,不用它也可以正常使用DLL导出库,但最后一句话又说,必须使用 __declspec(dllimport) 才能导入 DLL使用变量这个是什么意思??

1.7K20

CC++ 编写并提取通用 ShellCode

为什么要查找 Kernel32.dll 地址而不是 User32.dll,这是因为我们最终目的是调用 MessageBox 这个函数,而该函数位于 User32.dll 这个动态链接库里,默认情况下是无法直接调用...恰巧是 Kernel32.dll 这个模块只要是 PE 文件都会默认被加载 ,因此我们只需要找到 LoadLibraryA 函数,即可加载任意动态链接库,并调用任意函数啦。....dll 这个动态链接库基地址,而Dll文件本质上也是PE文件,在Dll文件中存在一个导出表,其内部记录着该Dll导出函数。...接着我们需要对Dll文件导出表进行遍历,不断地搜索,从而找到我们所需要API函数。 同样,这里有一个定式,可以通过该定式获取到指定导出表。...从 kernel32.dll 加载基址算起,偏移 0x3c 地方就是其PE文件头。 PE文件头偏移 0x78 地方存放着指向函数导出指针。

41520

sRDI – Shellcode 反射 DLL 注入

通过用 C 实现 LoadLibrary 粗略副本,现在可以将这段代码包含到任何 DLL 项目中。该进程将从(恶意)DLL导出一个名为“ReflectiveLoader”函数。...RDI 现在功能越来越像合法 LoadLibrary。我们现在可以加载一个 DLL,调用它入口点,然后将用户数据传递给 另一个 导出函数。...顺便说一句,如果您不熟悉 DLL导出函数建议您阅读 Microsoft 概述。 让 shellcode 再次伟大 私有和公共工具集大量使用反射 DLL 注入来维护“内存中”街头信誉。...或者,您可以指定任意数据以在加载 DLL 后传递给导出函数(正如 Staples 先生所期望那样)。...最重要是,如果您正在执行本地注入,shellcode 将返回一个内存指针,您可以使用该内存指针与 GetProcAddressR() 一起查找其他导出函数并调用它们。

1.7K00

C++基础语法梳理:Windows 动态链接库

时候,它必须同时提供另一个内存释放函数(free、delete) (3)在使用 C 和 C++ 混编时候,要使用 extern "C" 修饰符 (4)一个 DLL 可以导出函数、变量(避免导出)、...字符串,不能是 Unicode ); 复制代码 DumpBin.exe 查看 DLL 信息 在 VS 开发人员命令提示符 使用 DumpBin.exe 可查看 DLL导出段(导出变量、函数、类名符号...// 包含标准Windows和C运行时头文件 #include // DLL源码文件导出函数和变量 #define MYLIBAPI extern "C" __declspec...nLeft, int nRight) { g_nResult = nLeft + nRight; return g_nResult; } 复制代码 DLL使用运行时动态链接 DLL...) DLL使用运行时动态链接 DLL) // A simple program that uses LoadLibrary and // GetProcAddress to access myPuts

1.1K00
领券