如何隐藏DLL中,导出函数的名称?

一、引言

很多时候,我们写了一个Dll,不希望别人通过DLL查看工具,看到我们的导出函数名称。可以通过以下步骤实现:

1. 在def函数中做如下定义:

LIBRARY
EXPORTS
HideFuncName @1 NONAME

通过添加NONAME关键字,隐藏函数名,这样的话,用Dependency Walker来查看该Dll,只能看到如下结果:

2. 如何调用该Dll中的函数,通过ID的方式调用,代码如下:

 1 typedef void (WINAPI *FPHideFuncName)();
 2     DWORD dwErrCode = 0;
 3     wstring str = CProcHelper::GetCurrentProcessPath();
 4     str += L"\\Tool\\resconfig.dll";
 5     HMODULE hModule = LoadLibrary(str.c_str());
 6     if (NULL != hModule)
 7     {
 8         FPHideFuncName fp = (FPHideFuncName)GetProcAddress(hModule, (char*)1);  // 通过ID获取函数地址
 9         //FPHideFuncName fp = (FPHideFuncName)GetProcAddress(hModule, "HideFuncName");
10         if (NULL != fp)
11         {
12             fp();
13         }
14         dwErrCode = GetLastError();
15     }

二、小结:

1. 只适合于内部使用的DLL;

2. 通过函数名导出,还能减小DLL的大小;

时间: 2024-08-05 19:31:37

如何隐藏DLL中,导出函数的名称?的相关文章

C++ DLL中导出函数的声明的方法

定义: TESTDLLEXPORT_API int fnTestDllExport(void); TESTDLLEXPORT_API int fnTestCall(void); TESTDLLEXPORT_API int fnAddInt(int i,int j); TESTDLLEXPORT_API BOOL fnContact(char* a); 建立一个.def文件 LIBRARY TestDllExportEXPORTS fnContact @1fnAddInt @2fnTestDllE

在C++中调用DLL中的函数 (3)

1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等,它们都以源代码的形式发布.由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”.“白盒复用”的缺点比较多,总结起来有4点. 暴露了源代码:多份拷贝,造成存储浪费: 容易与程序员的“普通”代码发生命名冲突: 更新功能模块比较困难,不利于问题的模块化实现: 实际上,以上4点概

在C++中调用DLL中的函数

1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等,它们都以源代码的形式发布.由于这种复用是"源码级别"的,源代码完全暴露给了程序员,因而称之为"白盒复用"."白盒复用"的缺点比较多,总结起来有4点. 暴露了源代码:多份拷贝,造成存储浪费: 容易与程序员的"普通"代码发生命名冲突

在C++中调用DLL中的函数(3)

转自:http://www.cnblogs.com/woshitianma/p/3681745.html 1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等,它们都以源代码的形式发布.由于这种复用是"源码级别"的,源代码完全暴露给了程序员,因而称之为"白盒复用"."白盒复用"的缺点比较多,总结起来有

如何隐藏DLL中,导出函数的名称?(转)

如何隐藏DLL中,导出函数的名称?(转) 一.引言 很多时候,我们写了一个Dll,不希望别人通过DLL查看工具,看到我们的导出函数名称.可以通过以下步骤实现: 1. 在def函数中做如下定义: LIBRARY EXPORTS HideFuncName @1 NONAME 通过添加NONAME关键字,隐藏函数名,这样的话,用Dependency Walker来查看该Dll,只能看到如下结果: 2. 如何调用该Dll中的函数,通过ID的方式调用,代码如下: 1 typedef void (WINAP

DLL中调用约定和名称修饰(一)

DLL中调用约定和名称修饰(一) 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议.这种协议规定了该语言的函数中的参数传送方式.参数是否可变和由谁来处理堆栈等问题.不同的语言定义了不同的调用约定. 在C++中,为了允许操作符重载和函数重载,C++编译器往往按照某种规则改写每一个入口点的符号名,以便允许同一个名字(具有不同的参数类型或者是不同的作用域)有多个用法,而不会打破现有的基于C的链接器.这项技术通常被称为名称改编(Name Manglin

从dll中导出c++类

简介: 动态库(DLL)从开始就作为windows平台的组成部分而存在.它以独立的模块把c函数封装起来供其他用户使用 .DLL从开始就是以封装C语言的形式而存在,当然现在你也可以封装其他语言,比如c++,而如果要实现跨平台使用DLL,则我们必须回归到C语言. 利用C语言接口并不意味着我们必须丢弃掉面向对象方法.C语言可以实现应用二进制接口(ABI),这样使调用者和被调用着可以遵从统一的标准,但是C++语言没有这个特性,导致从一个编译器生成的binary不能被另一个编译器所识别.这样使得直接导出C

在VS2012中采用C++中调用DLL中的函数 (4)

这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人Blog在C++中调用DLL中的函数(1)(2)(3) 但是问题出现了,上面讲述的步骤很详细但是在自己运行的时候却会出现错误,于是今天在使用google“vs2012 c++调用dll”时,发现了一篇MSDN上的指南:http://msdn.microsoft.com/zh-cn/library/m

在VS2012中采用C++中调用DLL中的函数(4)

转自:http://www.cnblogs.com/woshitianma/p/3683495.html 这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人Blog在C++中调用DLL中的函数(1)(2)(3) 但是问题出现了,上面讲述的步骤很详细但是在自己运行的时候却会出现错误,于是今天在使用google"vs2012 c++调用dll"