def文件&导出函数&lib文件关联

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu  转载请标明来源 

 

定义导出函数方法:
///
1. 在.def中声明 
导出为C格式函数,函数名未修饰,使用时直接 加 extern "C" 声明函数就可以使用

2. 使用dllexport导出函数
导出为C++格式函数,函数名称被修饰为类似 ?max@....,仅供C++使用,C++使用时加  dllimport 声明可以使用

3. 使用 extern "C" dllexport导出函数
导出为C格式函数,函数名未修饰,使用时直接 加 extern "C" 声明函数就可以使用

 

4. 修改为C导出格式: 样可以使用extern "C" {},把头文件内容全部括进来,从而使导出的内容全为C格式函数

 

通常使用宏来选择使用dllexport/dllimport,下面例子只有导出部分

例子1: 使用dllexport导出类/函数

class dllexport MyClass{};

例子2: 使用dllexport导出函数

bool dllexport IsEqual(xxx, xxx);

例子3: 只导出类中的某部分函数,则类不能声明为导出,对函数进行导出

class MyClass{

   dllexport   MyClass();

   dllexport ~MyClass();

   bool dllexport CompareWith(xxx);

   ...

}



基于def文件生成lib文件的方法:

 参考地址:http://wenku.baidu.com/view/73f084e6524de518964b7d2a.html
基于def文件生成lib文件的方法:
lib /DEF:swscale-2.def /MACHINE:IX86-2
(使用VC++的LIB工具,带"/DEF:xxx.def  /MACHINE:IX86" (80X86机器),就输出符合VC++格式的的LIB文件)

swscale-2文件内容如下:(因为是C格式库,导出C格式函数-基于.def文件导出的函数,不涉及C++名称修饰重载,.def文件格式比较简单,函数名称按顺序布置即可)

EXPORTS
    sws_addVec
    sws_allocVec
    sws_alloc_context
   ...

 

基于def文件生成lib文件-C++类型函数:

参考:http://www.360doc.com/content/14/0518/15/7378868_378761402.shtml
参考:http://bbs.csdn.net/topics/240054505
参考:http://blog.chinaunix.net/uid-799319-id-2035224.html  C++编译器的函数名修饰规则 
像MFCM90U.dll的def文件定义的时候时,因为部分函数使用dllexport不带extern "C"方式导出,函数使用了C++修饰
// 注意:?必须包括 C++函数修饰都是以一个“?”开始,后面紧跟函数的名字,再后面是参数表的开始标识和按照参数类型代号拼出的参数表
EXPORTS
    InitMfcmDll
    AfxmReleaseManagedReferences
    AfxmEnsureManagedInitialization
    ?SetPropertyV@CWinFormsControlSite@MFC@VisualC@Microsoft@@UEAAXJGPEAD@
    ?PreTranslateMessage@CWinFormsView@MFC@VisualC@Microsoft@@MEAAHPEAUtagMSG@@@
    ...
定义之后,可以基于这个 生成MFC90U.lib:  lib /DEF:MFC90U.def /MACHINE:IX86-2
例如:下面这个.def声明两个命名空间中的函数
void MYSPACE::Del(void*)  
void* MYSPACE::Get()
; Define文件内容

EXPORTS
?Del@MYSPACE@@ YAXPAX@Z
        ?Get@MYSPACE@@ YAPAXXZ
@@YAXPAX@Z 代表 参数为:"void __cdecl operator delete(void *)"
YA  __cdecl
X  void
PAX void *
@Z -- 名字结束
 

    
查看lib/dll文件的函数方法:

参考地址: http://www.oschina.net/question/565065_85858
1. Window下命令dumpbin -exports 你的 lib/dll名称
( dumpbin 例如 在:\Microsoft Visual Studio 9.0\VC\bin\amd64\dumpbin.exe 位置)
2. 如果你用gcc,可用objdump查看
3. linux的nm命令可以一个文件中的符号列表,列出以上代码Gcc -c编译出的a.o(a.a a.so)可以通过nm命令来查看其中的符号信息


以下为转载内容:lib文件介绍
地址: http://bbs.csdn.net/topics/330266854   csdn  jizhongqing 的论坛回复 
 
  lib就是obj文件打包起来的,可以用lib.exe解出来,下面是vc环境下的操作,其他环境,看命令行帮助就可以了。

lib /list xx .lib 列出lib里所有obj文件名,我这里如下
。。。。。很多省略
lib/err/err.obj
lib/dict/dictll.obj
lib/coreDump/coreDumpWin32.obj
lib/config/preference.obj
lib/config/configUL.obj

找到你关注的obj,这里选择configUL.obj,然后 lib /EXTRACT:lib/config/configUL.obj xx .lib
解出configUL.obj, 然后把obj拖入IDA,我这里是ida5.5,在函数列表里找你要调用的函数,然后逆之

_Config_GetString       .text 00000068 00000039 R . . . B . .
_Config_GetBool         .text 000000B8 00000039 R . . . B . .
_Config_GetLong         .text 00000108 00000039 R . . . B . .
_Config_GetInt64        .text 00000158 0000003D R . . . B . .
_Config_GetTriState     .text 00000198 00000039 R . . . B . .
_Config_GetDouble       .text 000001E8 00000041 R . . . B T .
_Config_GetPathName     .text 00000288 00000039 R . . . B . .
_Config_NotSet          .text 000002C4 00000035 R . . . B . .
_Config_GetLongPlain    .text 000003B0 00000015 . . . . . . .
_Panic                  UNDEF 000003D0 00000004 R . . . . . .
_Preference_GetString   UNDEF 000003D4 00000004 R . . . . . .
_Str_Vsnprintf          UNDEF 000003D8 00000004 R . . . . . .
_Preference_GetBool     UNDEF 000003DC 00000004 R . . . . . .
_Preference_GetLong     UNDEF 000003E0 00000004 R . . . . . .
_Preference_GetInt64    UNDEF 000003E4 00000004 R . . . . . .
_Preference_GetTriState UNDEF 000003E8 00000004 R . . . . . .
_Preference_GetDouble   UNDEF 000003EC 00000004 R . . . . . .
_Preference_GetPathName UNDEF 000003F4 00000004 R . . . . . .
_Preference_NotSet      UNDEF 000003F8 00000004 R . . . . . .


我这里随便选择一个函数 _Config_GetString,很小的函数,呵呵,方便说明
.text:00000068 _Config_GetString proc near
.text:00000068
.text:00000068 var_400         = byte ptr -400h
.text:00000068 arg_0           = dword ptr  8
.text:00000068 arg_4           = dword ptr  0Ch
.text:00000068 arg_8           = byte ptr  10h
.text:00000068
.text:00000068                 push    ebp
.text:00000069                 mov     ebp, esp
.text:0000006B                 mov     ecx, [ebp+arg_4]
.text:0000006E                 sub     esp, 400h
.text:00000074                 lea     eax, [ebp+arg_8]
.text:00000077                 push    eax
.text:00000078                 push    ecx
.text:00000079                 lea     edx, [ebp+var_400]
.text:0000007F                 push    400h
.text:00000084                 push    edx
.text:00000085                 call    _Str_Vsnprintf
.text:0000008A                 mov     ecx, [ebp+arg_0]
.text:0000008D                 lea     eax, [ebp+var_400]
.text:00000093                 push    eax
.text:00000094                 push    ecx
.text:00000095                 call    _Preference_GetString
.text:0000009A                 add     esp, 18h
.text:0000009D                 mov     esp, ebp
.text:0000009F                 pop     ebp
.text:000000A0                 retn
.text:000000A0 _Config_GetString endp

这个函数很简单,一看就知道功能了,格式化一个buffer,构建一个字符串返回,
下面是是直接f5后修改的结果
int __cdecl Config_GetString(int a1, int a2, char *buf)
{
  char buffer[0x400];
  Str_Vsnprintf(buffer, sizeof(buffer), a2, buf);
  return Preference_GetString(a1, &v4);
}

这种手法,搞个10个,8个的函数还行,多了会死人的,最好看了关键思路自己写个来的更快
 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
EPLAN P8.2.7破解教程 心酸路程呀!!! 1、打开“Electric P8 2.7.”目录,运行“setup.exe”开始安装,选择系统和程序。 2、接受许可协议 3、进行用户设置 4、自定义安装功能,等待安装完成 5、安装完毕后,解压打开安装包“Patch EPLAN P8 (V1.8-V2.7)”文件夹,以管理员身份运行 HASPUserSetup.exe。 6、然后运行“EPLAN 2.1-27 X64 crack.exe”,弹出窗口选择安装驱动 7、打开计算机设备管理(方法右键我的电脑,选择管理)然后如下图操作,添加过时硬件。 8、选择安装我手动从列表选择的硬件,下一步 显示所有设备,下一步 从磁盘安装 ,浏览选择附件上的驱动文件(MultiKey64里面的multikey.inf),然后确定。 如果显示multikey无法使用等感叹号,需要再下载更新软件,比如用驱动精灵更新usb_key 程序,我的电脑更新的程序是hasp_srm_drv_550_64_11.exe 9、下一步安装,就成功了,如果弹出没有数字认证的提示,直接同意就可以了。至此,虚拟狗驱动就完成了。打开Eplan,按照下图选择,然后试一下,就可以进入eplan界面了。 对于P8.2.7版本,解决卡顿的补丁安装方法比较简单。 在EPLAN P8 2.7破解教程.rar压缩包里面,将破解补丁“version.dll”复制到安装目录下,默认目录为C:Program FilesEPLANPlatform2.7.3Bin(我把程序装到了D盘之中),然后重启Eplan即可。 用管理员权限打开PYG_DLL_Patcher_x64.exe 如果打开语言是英文,可以用txt(记事本)打开修改PYG_Dll_Patcher_x64.ini修改为“CurrentLanguage=2” 不要勾选两个有关patch…… 点击“load”(加载)加载对应版本,不如2.7版本的…… 然后点击“build” 点击 “OK” version.dll 文件已经自动输出在 “…version.dll Creator\EPLAN”文件夹里面 如果打开之后无模板无法新建,网上说可以在c盘搜索,比如搜索FL_1219-2_tpl001.ept等,我没能找到,我的解决方法是打开eplan>帮助>EPLAN download manager> 选择更新如下黄色的模块就可以有模板了。 如果出现无法打开数据ESS_part001.mdb 那就打开C盘或者安装盘搜索 *.Mdb,搜索到关于eplan目录下的文件 比如在C:\ProgramData\EPLAN\O_Data\Platform Data\2.7.3\Translation\EPLAN copy到C:\Users\Public\EPLAN\Data\部件\Microsoft目录下 如果出现无法打开功能定义 在c盘搜索fctdeflib,然后打开所在文件夹,复制该文件里面所有文件,然后找到FctDefLib.fdb 文件夹,把里面的文件都复制到C:\Users\Public\EPLAN\Data\功能定义 如果没有“功能定义”文件夹,就自己创建一个然后把文件复制进去。 复制完之后打开eplan软件 打开选项>设置 选择功能定义,把刚刚新建的文件《功能定义》的路径选择进去。 到此为止。。
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夜喜雨

稀罕你的喜欢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值