怎样查看lib中的函数文件中的函数名和函数参数

c++中.dll与.lib文件的生成与使用的详解
字体:[ ] 类型:转载 时间:
本篇文章介绍了,在c++中.dll与.lib文件的生成与使用的详细介绍,需要的朋友参考下
c++中.dll与.lib文件的生成与使用的详解
--------------------------------------------------------------------------------
•  包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。•  包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。共有两种链接方式:
•  动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。•  静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。--------------------------------------------------------------------------------
两种文件的区别
--------------------------------------------------------------------------------
使用lib需注意两个文件:
•.h头文件,包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。•.LIB文件。
使用dll需注意三个文件:
•.h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。•.LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误(如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载)。•dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。--------------------------------------------------------------------------------
生成和使用方法
--------------------------------------------------------------------------------
操作系统:WIN7
开发软件:VS2010
--------------------------------------------------------------------------------
1.生成lib文件
  首先,我们先建立一个控制台工程(新建-&工程-&控制台程序),添加add.cpp以及add.h文件。 代码如下://sub.h#ifndef _SUB_H#define _SUB_Hvoid sub(int a,int b);#endif
//sub.cpp#include "sub.h"#include &iostream&
void sub(int a,int b){&&& std::cout&&(a-b)&&std::}
  由于在工程中,没有main()函数,所以直接编译出错。这时,要右键点击工程,并选择工程属性,出现下图,选择静态链接库即可。
  这时候再按F7,build solution即可产生lib文件。在Debug中只生成.lib文件。2.生成dll文件
  生成dll文件的过程与上面的过程是一样的,只是在选择Dynamic Library(.dll)即可。在Debug中会生成一个.lib和.dll两种文件。
--------------------------------------------------------------------------------
3.两种文件的使用
  在使用时,静态链接库只要把.h和.lib文件加入到工程文件夹中即可。而动态链接库要把.h、.lib和.dll文件加入到工程中。
代码如下:#include &iostream&#include "sub.h"& //链接库的头文件
#pragma comment(lib,"sub.lib") //加入链接库
int main(){&&& sub(5,4);&&& return 0;}4.仅有.dll文件时候的使用方法
  在没有.h和.lib文件时,需要函数指针和WIN32 API函数LoadLibrary、GetProcAddress装载,只需要.dll文件即可(将.dll文件置入工程目录中)。 代码如下:#include &iostream&#include &windows.h&&&&&&&&&&&&&&& //使用函数和某些特殊变量typedef void (*DLLFunc)(int,int);& //确定调用函数的形参int main(){&&& DLLFunc dllF&&& HINSTANCE hInstLibrary = LoadLibrary("sub.dll");//加载.dll
&&& if (hInstLibrary == NULL)&&& {&&&&&&& FreeLibrary(hInstLibrary);&&& }&&& dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "sub");//第二个参数为要调用的函数名称&&& if (dllFunc == NULL)&&& {&&&&&&& FreeLibrary(hInstLibrary);&&& }&&& dllFunc(5,4);&&& FreeLibrary(hInstLibrary);&&& return(1);}&  最近一直在搞API这东西,用了curl、tinyxml和jsoncpp几种开源的库,在linux下使用倒是很方便,在windows下还是自己编译的遇到了点问题,从新整理学习下,备用~~
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具怎么破解Dll文件,从中找出里面的函数和参数_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
怎么破解Dll文件,从中找出里面的函数和参数
上传于||文档简介
&&怎​么​破​解​D​l​l​文​件​,​从​中​找​出​里​面​的​函​数​和​参​数
你可能喜欢【原创】解析静态库(Lib)文件,提取出所有函数信息,组织成自定义格式文件 - 看雪安全论坛
『软件调试逆向』 [综合性论坛]本版讨论的主题包括:调试逆向、系统底层、商业保护、虚拟机保护、.NET平台等安全相关的话题。
该主题: "【原创】解析静态库(Lib)文件,提取出所有函数信息,组织成自定义格式文件" 因在一定的时间里没有任何回复而自动关闭。如果您还对该主题感兴趣或者想参与对此主题的讨论,请您重新发表一篇相关的新主题。
本站声明:看雪论坛文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者信息及本声明!
注册日期: Jan 2010
现金: 91 Kx
获感谢文章数:0获会员感谢数:0
已解答: 【原创】解析静态库(Lib)文件,提取出所有函数信息,组织成自定义格式文件
标 题: 已解答: 【原创】解析静态库(Lib)文件,提取出所有函数信息,组织成自定义格式文件 作 者: 某某
时 间: ,18:04:59 链 接: /showthread.php?t=115877
附件:我现在是临时用户,附件限制太小了。要代码的,我直接mail吧
目的:确定函数SIZE的方案还不够严谨,望牛人指教
标准:《Microsoft可移植可执行文件和通用目标文件格式文件规范》,简称《PE&COFF文件规范》
注意:这里的LIB指的是静态库,要和编写DLL所生成的lib区别开来
《PE&COFF文件规范》&中称静态库格式为:
档案(库)文件格式,在WinNT.h中称Archive&format.
《PE&COFF文件规范》&中称另一种Lib为:
导入库格式-是描述由一个映像导出供其它映像使用的符号的库
具体思路:
1.解析静态库(Lib)文件,提取出其中的所有目标文件成员(obj)
2.解析各个目标文件成员(obj),提取出其中的函数信息(函数名,函数数据,函数数据大小)
3.把提取出的函数信息,组织成自定义文件格式(flb)
函数库(.flb)文件格式:&签名-函数头表-函数名称段-函数数据段
一.解析静态库(Lib)文件,提取出其中的所有目标文件成员(obj)
1.静态库(Lib)文件结构
档案(库)文件(.lib)结构非常简单,就是签名+很多个成员,详细参见《PE&COFF文件规范》第7节,或者看这里:http://dev.csdn.net/htmls/21/21543.html
签名,WinNT.h是这么定义的:
#define&IMAGE_ARCHIVE_START_SIZE&&&&&&&&&&&&&8
#define&IMAGE_ARCHIVE_START&&&&&&&&&&&&&&&&&&&!&arch&\n&
成员,是由头部和成员内容组成;WinNT.h是这么定义头部的:
typedef&struct&_IMAGE_ARCHIVE_MEMBER_HEADER&{
&&&&&&&&BYTE&&&&&Name[16];&&&&&&&&&//&File&member&name&-&`/'&terminated.
&&&&&&&&BYTE&&&&&Date[12];&&&&&&&&&//&File&member&date&-&decimal.
&&&&&&&&BYTE&&&&&UserID[6];&&&&&&&&//&File&member&user&id&-&decimal.
&&&&&&&&BYTE&&&&&GroupID[6];&&&&&&&//&File&member&group&id&-&decimal.
&&&&&&&&BYTE&&&&&Mode[8];&&&&&&&&&&//&File&member&mode&-&octal.
&&&&&&&&BYTE&&&&&Size[10];&&&&&&&&&//&File&member&size&–&头部大小不计算在内.
&&&&&&&&BYTE&&&&&EndHeader[2];&&&&&//&String&to&end&header.
}&IMAGE_ARCHIVE_MEMBER_HEADER,&*PIMAGE_ARCHIVE_MEMBER_HEADER;
#define&IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR&&&&&&60
三个特别成员:第一链接器成员,第二链接器成员,长名称成员;(签名后面紧跟着的,就是这三个特别成员)
对于两个链接器成员,WinNT.h是这么定义它们头部的Name域的:
&#define&IMAGE_ARCHIVE_LINKER_MEMBER&&&&&&&&&&&/&&&&&&&&&&&&&&&&
对于长名称成员,WinNT.h是这么定义它们头部的Name域的:
#define&IMAGE_ARCHIVE_LONGNAMES_MEMBER&&&&&&&&//&&&&&&&&&&&&&&&
目标文件成员(重点),三个特别成员之后直到文件结束,都是由这种目标文件成员组成。解析lib文件的本质就是解析它们,对于它们的头部Name域,有两种形式:
1.“名称/”&
2.“/n”&&&当名称大小大于Name域的16个字节的话,就会存在长名称成员中;而n(十进制)就给出其名称位于长名称成员中的偏移
目标文件成员的内容,就是标准的目标文件(COFF格式)。
2.定位目标文件成员
解析lib文件的本质就是解析它们,它们是标准的目标文件格式,所有的函数信息都这里面;定位它们,是CLibParser这个类的工作。具体工作分为两步:
1.定位第一个目标文件成员。
2.遍历所有目标文件成员。
1.定位第一个目标文件成员
PBYTE&CLibParser::GetFirstObjSection()
&&int&iCtrl=0;
&&//第一个链接器成员
&&PBYTE&pSect&=&m_pLibImage+IMAGE_ARCHIVE_START_SIZE;
&&if(!pSect)return&NULL;
&&while(pSect)
&&&&//第二个链接器成员
&&&&if(memcmp(((PIMAGE_ARCHIVE_MEMBER_HEADER)pSect)-&Name,IMAGE_ARCHIVE_LINKER_MEMBER,16)==0)
&&&&&&//Nothing
&&&&//第三个长名称成员
&&&&else&if(memcmp(((PIMAGE_ARCHIVE_MEMBER_HEADER)pSect)-&Name,IMAGE_ARCHIVE_LONGNAMES_MEMBER,16)==0)//LONG&Name
&&&&&&//Nothing
&&&&&&//尽管长名称成员的头部必须存在,但它本身却可以为空。
&&&&else&//第一个目标文件成员
&&&&&&return&pS
&&&&//注意BYTE&Size[10];要用atol((LPSTR)..)这种方法才能得到正确size
&&&&PIMAGE_ARCHIVE_MEMBER_HEADER&pAME=(PIMAGE_ARCHIVE_MEMBER_HEADER)pS
&&&&pSect&+=&atol((LPSTR)pAME-&Size)&+&sizeof(IMAGE_ARCHIVE_MEMBER_HEADER);
&&&&//两个成员之间有可能是由\n隔开
&&&&if(*pSect=='\n')&pSect++;
&&&&iCtrl++;//防止遇到错误的Lib文件,而死在这里面
&&&&if&(iCtrl&3)
&&return&NULL;
2.遍历所有目标文件成员:
BOOL&CLibParser::ParseObjs(PBYTE&pObjSect)
&&&&PIMAGE_ARCHIVE_MEMBER_HEADER&pAME=(PIMAGE_ARCHIVE_MEMBER_HEADER)pObjS
&&&&pObjSect+=sizeof(IMAGE_ARCHIVE_MEMBER_HEADER);//去掉头部,剩下的就是Obj(COFF格式)
&&&&//判断是否是导入库格式,以防止错误的把导入库lib当做静态库lib,而程序直接挂掉
&&&&if(bImportlibraryFormat(pObjSect))
&&&&&&MessageBox(NULL,&This&is&not&a&Archive&Format&File,it's&a&Import&Format&File!&,
&&&&&&&&&WARNING&,MB_ICONWARNING);
&&&&&&return&FALSE;
&&&&//解析目标成员(OBJ)
&&&&CObjParser&objP
&&&&objParser.Parse(pObjSect,m_pNameFile,m_pDataFile,&m_FuncTable);
&&&&//注意:BYTE&Size[10];要用atol((LPSTR)..)这种方法才能得到正确size
&&&&pObjSect&+=&atol((LPSTR)pAME-&Size)&;
&&&&//注意:两个成员之间有可能是由\n隔开,《PE&COFF&文件格式》中并没有提到
&&&&if(*pObjSect=='\n')&
&&&&&&pObjSect++;
&&}&while&(pObjSect&m_pLibImage+m_fsize);
&&return&TRUE;
二.解析各个目标文件成员(obj),提取出其中的函数信息(函数名,函数数据,函数数据大小)
1.目标文件(.obj)结构:
文件头(IMAGE_FILE_HEADER)
typedef&struct&_IMAGE_FILE_HEADER&{
&&&&WORD&&&&M
&&&&WORD&&&&NumberOfS
&&&&DWORD&&&TimeDateS
&&&&DWORD&&&PointerToSymbolT//指向符号表
&&&&DWORD&&&NumberOfS//符号表的大小
&&&&WORD&&&&SizeOfOptionalH
&&&&WORD&&&&C
}&IMAGE_FILE_HEADER,&*PIMAGE_FILE_HEADER;
节表(IMAGE_SECTION_HEADER)
typedef&struct&_IMAGE_SECTION_HEADER&{
&&&&BYTE&&&&Name[IMAGE_SIZEOF_SHORT_NAME];
&&&&union&{
&&&&&&&&&&&&DWORD&&&PhysicalA
&&&&&&&&&&&&DWORD&&&VirtualS
&&&&DWORD&&&VirtualA
&&&&DWORD&&&SizeOfRawD//指定节大小
&&&&DWORD&&&PointerToRawD//指向节数据
&&&&DWORD&&&PointerToR//指向此节重定位信息表
&&&&DWORD&&&PointerToL
&&&&WORD&&&&NumberOfR//此节重定位信息表的大小
&&&&WORD&&&&NumberOfL
&&&&DWORD&&&C
}&IMAGE_SECTION_HEADER,&*PIMAGE_SECTION_HEADER;
重定位表(IMAGE_RELOCATION),几乎每个节都有一张重定位表
typedef&struct&_IMAGE_RELOCATION&{
&&&&union&{
&&&&&&&&DWORD&&&VirtualA//在相应节中的偏移
&&&&&&&&DWORD&&&RelocC&&&&&&&&&&&&&&&&&};
&&&&DWORD&&&SymbolTableI//此重定位信息的符号表索引
&&&&WORD&&&&T
}&IMAGE_RELOCATION;
typedef&IMAGE_RELOCATION&UNALIGNED&*PIMAGE_RELOCATION;
符号表(IMAGE_SYMBOL),目标文件的中心,所有工作都围绕这张表展开
typedef&struct&_IMAGE_SYMBOL&{
&&&&union&{
&&&&&&&&BYTE&&&&ShortName[8];
&&&&&&&&struct&{
&&&&&&&&&&&&DWORD&&&S&&&&&//&如果是长名称,这四个字节为0
&&&&&&&&&&&&DWORD&&&L&&&&&&//&指定长名称位于字符串表中的偏移
&&&&&&&&}&N
&&&&&&&&DWORD&&&LongName[2];&&&&//&PBYTE&[2]
&&&&DWORD&&&V//如果此符号是函数符号,给出函数数据在相应节中的偏移
&&&&SHORT&&&SectionN//此符号相应节位于节表的索引,从1开始
&&&&WORD&&&&T//&如果是函数符号,此值为0x20
&&&&BYTE&&&&StorageC//如果是函数符号,此值为//IMAGE_SYM_CLASS_EXTERNAL(2)
&&&&BYTE&&&&NumberOfAuxS//辅助符号表的个数,如果有辅助符号表,&//紧跟着每个符号表后面,一般是0-1张辅助符号表
}&IMAGE_SYMBOL;
typedef&IMAGE_SYMBOL&UNALIGNED&*PIMAGE_SYMBOL;
字符串表,一些符号的名称太长(超过8个字节),其名称就会存在这里
2.解析目标文件(obj)
目标文件的核心是符号表,整个解析工作就是围绕它展开。CObjParser负责解析目标文件(.obj)
具体步骤:
1.定位符号表,过滤出其中的函数符号
2.根据函数符号获得函数名称,输出到.nam中间文件,并记录下相应的偏移和大小
3.根据函数符号获得函数数据,输出到.dat中间文件,并记录下相应的偏移和大小
4.根据函数符号对重定位信息进行标志,在以后检测的时候,会跳过这些信息
1.定位符号表,过滤出其中的函数符号
《PE&COFF文件规范》中对函数符号式这么描述的:存储类别为EXTERNAL(2)、Type&域的值为(0x20)以及SectionNumber&域的值大于0,表明它是一个函数
具体方法:
//遍历符号表,过滤出其中的函数符号
&&for&(DWORD&i=0;i&m_pFileHeader-&NumberOfSi++)
&&&&pSymbol=m_pSymbol+i;
//&&&&&存储类别为EXTERNAL()、Type&域的值表明它是一个函数(x20)
//&&&&以及SectionNumber&域的值大于,它就标志着函数的开头
&&&&if(ISFCN(pSymbol-&Type)&&pSymbol-&SectionNumber&0
&&&&&&&&pSymbol-&StorageClass==IMAGE_SYM_CLASS_EXTERNAL)
&&&&&&memset(&funcHeader,0,sizeof(funcHeader));
&&&&&&GetNameofSymb(pSymbol,funcHeader);&&
&&&&&&GetDataofSymb(pSymbol,funcHeader);&&
&&&&&&m_pFuncTable-&push_back(funcHeader);
&&&&//直接跳过辅助符号表
&&&&i+=pSymbol-&NumberOfAuxS
2根据函数符号获得函数名称,输出到.nam中间文件,并记录下相应的偏移和大小
void&CObjParser::GetNameofSymb(PIMAGE_SYMBOL&pSymbol,FuncHeader&&funcHeader)
&&PCHAR&pName=NULL;
&&CHAR&shortNam[9]={0};
&&//如果符号名称长度不超过个字节,那么符号表的ShortName&域
&&//就是包含符号名本身的一个字节长的数组;
&&if&(pSymbol-&N.Name.Short)
&&&&//pName=&(PCHAR)pSymbol-&N.ShortN
&&&&//注意:符号名可能正好占满个字节,那就没有NULL结束符了,
&&&&//所以不能简单的用上面的方法
&&&&memcpy_s(shortNam,9,pSymbol-&N.ShortName,8);
&&&&pName=shortN
&&//&否则的话,它给出了字符串表中的一个偏移地址
&&&&pName=&m_pStrings+pSymbol-&N.Name.L
&&//记录偏移
&&if&(m_pFuncTable-&size()==0)
&&&&funcHeader.NameOff=0;
&&&&FuncHeader&&funcHeadPrev=m_pFuncTable-&at(m_pFuncTable-&size()-1);
&&&&funcHeader.NameOff=funcHeadPrev.NameOff+funcHeadPrev.NameS
&&//记录大小
&&funcHeader.NameSize=strlen(pName)+1;
&&//写入nam文件
&&fwrite(pName,funcHeader.NameSize,1,m_pNamFile);
&&fflush(m_pNamFile);
3.根据函数符号获得函数数据,输出到.dat中间文件,并记录下相应的偏移和大小
这就是我上面提到的那个问题,函数数据的size确定问题,我现在的方法是:直接断定pSymbol所在节从pSymbol-&Value偏移处开始到节结束都是pSymbol所对应的函数数据,但如果一个节中包含多个函数数据,这种方法就有问题了,现在的一些测试还没遇到问题。但这种方法显然不严谨,《PE&COFF文件规范》里提到一种:
“5.5.1&辅助符号表记录格式之一:函数定义”;里面可以拿到size;
但悲剧的是每个函数符号后面一张辅助符号表都没有,所以这种方法流产了
我到现在也找不到好方法,望有牛人提点!
下面是具体方法:
//获得函数数据
void&CObjParser::GetDataofSymb(PIMAGE_SYMBOL&pSymbol,FuncHeader&&funcHeader)
&&PIMAGE_SECTION_HEADER&pISH&=&m_pSectionHeader+(pSymbol-&SectionNumber-1);//SectionNumber从开始的索引
&&if(!pISH)
&&&&MessageBox(NULL,&Get&SectionHeader&Error!&,&Error&,MB_ICONWARNING);
&&//记录偏移
&&if&(m_pFuncTable-&size()==0)
&&&&funcHeader.DataOff=0;
&&&&FuncHeader&&funcHeadPrev=m_pFuncTable-&at(m_pFuncTable-&size()-1);
&&&&funcHeader.DataOff=funcHeadPrev.DataOff+funcHeadPrev.DataS
&&//记录大小
&&//这种记算函数大小的方法并准确,这样做是默认这个pSymbol所在节从pSymbol-&Value偏移处开始到
&&//节结束都是pSymbol所对应的函数数据,但有可能此节还包括其他函数数据
&&//拿节大小SizeOfRawData-函数在此节的偏移Value
&&funcHeader.DataSize=pISH-&SizeOfRawData-pSymbol-&V
&&//标志重定位位置
&&MarkRelocatePos(pISH);
&&//获取函数数据
&&PBYTE&funData=m_pObjImage+pISH-&PointerToRawData+pSymbol-&V
&&//写入dat文件
&&fwrite(funData,funcHeader.DataSize,1,m_pDatFile);
&&fflush(m_pDatFile);
4.根据函数符号对重定位信息进行标志,在以后检测的时候,会跳过这些信息
关于重定位信息,我是这么理解的,比如在一个函数数据里有这样一条命令
Call&0x0040124a,而obj里此数据可能是这样的Call&0x,要到链接的时候,根据重定位信息再进行修订
所以我直接用0x标志这里是重定位信息,以后检测的时候,直接跳过这些重定位信息,不比较。
//标志重定位信息
void&CObjParser::MarkRelocatePos(PIMAGE_SECTION_HEADER&pISH)
&&//用四个字节0标志重定位信息位置
&&DWORD&pReloMark=0;
&&DWORD&modifyOff=0;
&&//获得重定位表
&&PIMAGE_RELOCATION&pIR&=&(PIMAGE_RELOCATION)(m_pObjImage&+&pISH-&PointerToRelocations);
&&//重定位表大小
&&DWORD&RefCount&=&pISH-&NumberOfR
&&&//遍历重定位表
&&for(DWORD&i&=0;i&RefCi++)
&&&&//待重定位偏移
&&&&modifyOff=pISH-&PointerToRawData+pIR[i].VirtualA
&&&&//修订
&&&&memcpy_s(m_pObjImage+modifyOff,4,&pReloMark,4);&&&&
三.自定义文件格式函数库文件(.flb)
自动义函数库文件(.flb)结构非常简单:
#define&IMAGE_FLIB_START_SIZE&&&&&&&&&&&&&8
#define&IMAGE_FLIB_START&&&&&&&&&&&&&&&&&&&!&flib&\n&
函数头表:
typedef&struct&_FlibFuncHeader//flib文件中的函数头结构
&&DWORD&NameO//函数名称的文件偏移
&&DWORD&DataO//函数数据的文件偏移
&&DWORD&DataS//函数数据的大小
}FlibFuncHeader,*PFlibFuncH
函数名称段,里面存的是所有函数名,是一张以null结尾的字符串表
函数数据段,里面存的是所有函数的二进制数据
组织函数库文件
1.定义一个全局的函数头表,在解析每个函数符号的时候,记录相应的偏移和大小
2.将所有的函数名写入一个.nam中间文件
3.将所有的函数数据写入一个.dat中间文件
4.最后修订好偏移,按照顺序将&函数头表,.nam文件内容,.dat文件内容,写入最终的flb文件中去
至此,所有解析工作完成,剩下的就是测试flb文件是否正确!*转载请注明来自看雪论坛@
被 某某 最后编辑
原因: 【邀请码已发】
最佳答案 - 作者:
另外,商业IDA并没有从转储函数体,而是采用了一套签名算法,应该是对称公匙算法,这个算法从目标文件的函数体代码生成一个签名,分析PE映像文件时,对PE映像的函数计算出值,然后再与给定的值作比较。
注册日期: Jan 2010
现金: 91 Kx
获感谢文章数:0获会员感谢数:0
, 18:26:58
测试.flb文件
一.解析.flb文件
1.加载.flb文件
//加载flb文件
&&FILE*&pF
&&fopen_s(&pFile,szLib,&rb&);
&&if&(!pFile)
&&&&CHAR&ErrorStr[MAX_PATH];
&&&&sprintf_s(ErrorStr,MAX_PATH,&Can't&Open&%s&,szLib);
&&&&MessageBox(NULL,ErrorStr,&Error&,MB_ICONWARNING);
&&&&return&FALSE;
&&int&len=_filelength(_fileno(pFile));
&&m_pImage=(PBYTE)malloc(len);
&&fread_s(m_pImage,len,len,1,pFile);
&&fclose(pFile);
2.检测签名
//检测签名
&&if&(memcmp(m_pImage,IMAGE_FLB_START,IMAGE_FLB_START_SIZE)!=0)
&&&&return&FALSE;
3.定位函数头表
//定位函数头表
&&m_pFuncHeader=(PFuncHeader)(m_pImage+IMAGE_FLB_START_SIZE);
4.检测函数,只要遍历函数头表就可以了
//遍历函数库
&&&&if(CheckFunc(pFuncHeader,pFuncDat))
&&&&&&pNam=(PCSTR)(m_pImage+pFuncHeader-&NameOff);
&&&&&&return&pN
&&&&pFuncHeader++;
&&}&while&(pFuncHeader-&DataSize);//函数头表以一个完全为空的函数头成员结尾
BOOL&CLibScanner::CheckFunc(PFuncHeader&pFuncHeader,PCBYTE&pFuncDat)
&&PBYTE&pImpFuncDat=m_pImage+pFuncHeader-&DataO
&&//进行逐字节比对
&&for&(DWORD&i=0;i&pFuncHeader-&DataSi++)
&&&&//跳过重定位信息
&&&&//只要是连续四个字节为,就当作重定位信息处理
&&&&//注意while:有可能两个重定位信息相邻,比如两个操作数的情况
&&&&while(*(PDWORD)(pImpFuncDat+i)==0)
&&&&&&i+=4;
&&&&if&(pImpFuncDat[i]!=pFuncDat[i])
&&&&&&return&FALSE;
&&return&TRUE;
这样就可以使用flb文件了
二.拿到函数数据
要想测试flb文件,你还得拿到函数数据,我使用的是PVDasm,下面说一下我的方法:
1.&&解析PE文件,获得代码段
2.&&使用反汇编引擎,PVDasm,监控Call指令(只做0xe8),获得函数数据
3.&&加载相应的flb文件,检测每个获得函数数据,是否属于此flb文件中的函数
我已经把各个版本的C语言静态库都搞成相应的flb文件了,我写了几个test,(附件里都有)并和ida做过比较,占时还没发现问题,但那个函数数据size的问题,就像锅里的一坨S,请大家帮帮忙!
最后再提一下我的问题,希望有前辈指点一下!
函数数据的size确定问题,我现在的方法是:直接断定一个节中只有一个函数数据!
《PE&COFF文件规范》里提到一种:
“5.5.1&辅助符号表记录格式之一:函数定义”;里面可以拿到size;
但悲剧的是每个函数符号后面一张辅助符号表都没有,所以这种方法流产了
我到现在也找不到好方法,望有牛人提点!
注册日期: May 2009
现金: 89 Kx
获感谢文章数:0获会员感谢数:0
, 09:05:55
谢lz,学习。。。。
注册日期: Jan 2010
现金: 91 Kx
获感谢文章数:0获会员感谢数:0
, 17:14:03
坐等大牛现身!
注册日期: Jun 2010
现金: 60 Kx
获感谢文章数:0获会员感谢数:0
, 14:37:13
注册日期: Jun 2010
现金: 0 Kx
获感谢文章数:0获会员感谢数:0
, 23:33:35
膜拜,&帮顶
注册日期: Jun 2009
现金: 40 Kx
获感谢文章数:0获会员感谢数:0
, 10:09:44
顶,学习了。。
注册日期: Apr 2010
现金: 11 Kx
获感谢文章数:0获会员感谢数:0
, 10:48:13
对lib了解不多,受教
注册日期: Jun 2010
现金: 80 Kx
获感谢文章数:0获会员感谢数:0
, 10:58:36
牛人啊,顶一下,顺便看转正还要多久
注册日期: Oct 2009
现金: 26 Kx
获感谢文章数:0获会员感谢数:0
, 11:04:07
注册日期: Jul 2006
现金: 64 Kx
获感谢文章数:2获会员感谢数:2
, 12:30:47
注册日期: Dec 2009
现金: 154 Kx
获感谢文章数:0获会员感谢数:0
, 14:42:56
解析lib文件,在很多场景中都需要,好棒!
注册日期: Jan 2010
现金: 91 Kx
获感谢文章数:0获会员感谢数:0
, 19:36:09
最初由 jerrynpc发布
注意,我的测试非常有限,而且还有一个size的问题有待解决
注册日期: Jul 2006
现金: 1437 Kx
致谢数: 12
获感谢文章数:38获会员感谢数:94
, 19:38:41
最初由 某某发布
注意,我的测试非常有限,而且还有一个size的问题有待解决
代码是否可以上传论坛?
注册日期: Jan 2010
现金: 91 Kx
获感谢文章数:0获会员感谢数:0
, 19:51:28
传不上去啊,RAR:1,000,0kb&&后面那个逗号太邪恶了
该主题: "【原创】解析静态库(Lib)文件,提取出所有函数信息,组织成自定义格式文件" 因在一定的时间里没有任何回复而自动关闭。如果您还对该主题感兴趣或者想参与对此主题的讨论,请您重新发表一篇相关的新主题。
您不可以发表主题
您不可以回复帖子
您不可以上传附件
您不可以编辑自己的帖子
论坛论坛启用
用户控制面板
会员在线状态
CrackMe攻击篇,分析文章提交区
『看雪众测/众包』
『求助问答』
『经典问答』
『资料导航』
『软件调试逆向』
『密码学』
『编程技术』
『C32Asm』
『MDebug』
『安全工具开发』
『加壳与脱壳』
『CrackMe&ReverseMe』
『资源下载』
『Android 安全』
『Android 开发』
『iOS安全』
『WEB安全』
『漏洞分析』
『外文翻译』
『招聘专区』
『职业生涯』
『15PB培训』
『麦洛克菲培训』
『茶余饭后』
『安全资讯』
『论坛活动』
6)PEDIY Crackme竞赛2009
7)看雪十周年专版
8)腾讯公司2010软件安全竞赛
9)2011 Exploit Me竞赛
『图书项目版』
《加密与解密(第三版)》
《C++反汇编与逆向分析技术揭秘》
《Android软件安全与逆向分析》
『论坛版务』
相似的主题
『求助问答』
『软件调试逆向』
『求助问答』
『求助问答』
所有时间均为北京时间, 现在的时间是 .
&&& 看雪学院()
| 提供带宽资源
|&微信公众帐号:

我要回帖

更多关于 查看lib导出函数 工具 的文章

 

随机推荐