龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 1809|回复: 0

VS2015用C++创建的动态库导出函数名乱码原因分析

[复制链接]

6

主题

9

回帖

17

积分

编程入门

Rank: 1

龙马币
22
本文将重点介绍下这些入口点的调用约定,并以此来说明函数名乱码的真正原因,并且会在下一篇博客中详细说明如何创建一个可以被其它语言调用的动态库。

(1)按照【在VS2015中用C++创建动态库并用C#调用】博文中1到8步创建测试项目,但是步骤8中的DLLTest.h中添加函数Test1和Test2的导出形式前,不要加EXTERN_C。
001.png

(2)使用Dependency Walker查看导出的动态库DLL
002.png

从上图中可以看到导出的函数名都是乱码,此时可以在乱码上右击选择Undecorate C++ Functions,如下图:
003.png

此时函数名会自动变为你想要的函数名,如下图
004.png

(4)下面详细讲解下函数名乱码的原因

C++编译时函数名修饰约定规则:   

__stdcall调用约定:  
1、以"?"标识函数名的开始,后跟函数名;   
2、函数名后面以"@@YG"标识参数表的开始,后跟参数表;
3、参数表以代号表示:
X--void
D--char
E--unsigned char
F--short
H--int
I--unsigned int
J--long
K--unsigned long
M--float
N--double
_N--bool
....   
PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以"0"代替,一个"0"代表一次重复;

4、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针在其所指数据类型前;

5、参数表后以"@Z"标识整个名字的结束,如果该无参数,则以"Z"标识结束。

其格式为"?functionname@@YG*****@Z"或"?functionname@@YG*XZ",例如   
int Test1(char *var1, unsigned )-----?Test1@@YGHPADK@Z
void Test2()-----"?Test2@@YGXXZ"

__cdecl调用约定:   
规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YA"。

__fastcall调用约定:   
规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YI"。

(5)由上面可以看出C/C++导出的动态库DLL默认的入口点调用约定为__cdecl调用约定,所以C#在调用时需加CallingConvention = CallingConvention.Cdecl来指定入口点的调用约定

(6)通过在导出函数前加入EXTERN_C,可以将导出的函数名固定为你想要的函数名,更改入口点约定,让导出的动态库可以被其它语言调用。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表