能力值:
( LV4,RANK:50 )
2 楼
一.解析.flb文件
1.加载.flb文件
//加载flb文件
FILE* pFile;
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.检测函数,只要遍历函数头表就可以了
//遍历函数库
do
{
if(CheckFunc(pFuncHeader,pFuncDat))
{
pNam=(PCSTR)(m_pImage+pFuncHeader->NameOff);
return pNam;
}
pFuncHeader++;
} while (pFuncHeader->DataSize);//函数头表以一个完全为空的函数头成员结尾
BOOL CLibScanner::CheckFunc(PFuncHeader pFuncHeader,PCBYTE pFuncDat)
{
PBYTE pImpFuncDat=m_pImage+pFuncHeader->DataOff;
//进行逐字节比对
for (DWORD i=0;i<pFuncHeader->DataSize;i++)
{
//跳过重定位信息
//只要是连续四个字节为,就当作重定位信息处理
//注意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;
但悲剧的是每个函数符号后面一张辅助符号表都没有,所以这种方法流产了
我到现在也找不到好方法,望有牛人提点!
能力值:
( LV4,RANK:50 )
3 楼
谢lz,学习。。。。
能力值:
( LV4,RANK:50 )
4 楼
坐等大牛现身!
能力值:
( LV2,RANK:10 )
5 楼
学习了
能力值:
( LV2,RANK:10 )
6 楼
膜拜, 帮顶
能力值:
( LV2,RANK:10 )
7 楼
顶,学习了。。
能力值:
( LV2,RANK:10 )
8 楼
对lib了解不多,受教
能力值:
( LV2,RANK:10 )
9 楼
牛人啊,顶一下,顺便看转正还要多久
能力值:
( LV2,RANK:10 )
10 楼
学习!
能力值:
( LV2,RANK:10 )
11 楼
球代码
email: jerrynpc#gmail.com
能力值:
( LV4,RANK:50 )
12 楼
解析lib文件,在很多场景中都需要,好棒!
能力值:
( LV4,RANK:50 )
13 楼
代码已发!
注意,我的测试非常有限,而且还有一个size的问题有待解决
能力值:
( LV15,RANK:670 )
14 楼
代码是否可以上传论坛?
能力值:
( LV4,RANK:50 )
15 楼
传不上去啊,RAR:1,000,0kb 后面那个逗号太邪恶了
能力值:
( LV2,RANK:10 )
16 楼
能力值:
( LV15,RANK:670 )
17 楼
那找个网盘共享吧
能力值:
( LV9,RANK:170 )
18 楼
太邪恶了,请顺便就用途做个教程
能力值:
( LV2,RANK:10 )
19 楼
太邪恶了,新手那看的懂啊,我们要的是教程,不是代码.
能力值:
( LV2,RANK:10 )
20 楼
每一个原创帖子都要顶一下
能力值:
( LV8,RANK:130 )
21 楼
找了一晚上,终于找到了。
不容易啊
能力值:
( LV13,RANK:260 )
22 楼
mark then check it ...
能力值:
( LV3,RANK:20 )
23 楼
同上,mark then check it ...
能力值:
( LV2,RANK:10 )
24 楼
学习下。。。
能力值:
( LV2,RANK:10 )
25 楼
感谢 分享