作者:庄晓立 (liigo),2010/7/12
本文首发地址:http://blog.csdn.net/liigo/archive/2010/07/12/5727859.aspx
转载请注明出处:http://blog.csdn.net/liigo
本文目标:在指定的某个LIB或OBJ文件中,搜索定位某一段可执行代码(X86指令集合),最终确定其所属函数。
原由:假设我们自己编写的软件被杀毒软件误报为病毒,又假设我们已经通过某种途径获知软件(EXE)中被视为病毒特征码的某段代码(X86指令集合)(详见本人(liigo)前一篇博客),又假设我们已经通过某种途径得知这段代码来自编译链接过程中的某个LIB/OBJ文件(仍见本人前一篇博客),接下来呢,还要进一步在此LIB/OBJ文件中检索定位特征码,确定它是来自哪一个函数,这就是本文要讨论的内容。
基本思路:解析LIB文件二进制格式(关于LIB/OBJ基本结构,可参见我(liigo)之前的一篇博文),遍历LIB文件中的所有OBJ,遍历每一个OBJ中的所有节(Section),在节(Section)的数据块(RawData)中搜索特征码,如果搜到则打印出此节(Section)中定义的所有符号(Symbol),根据其中的函数符号及相关偏移即可判断特征码所属函数。解析LIB文件二进制格式,不在本文讨论范围之内。主要代码框架如下:
在上面的代码中,一旦在某个节(Section)中匹配到特征码,则输出该节的序号和名称,及其所属obj的序号和名称,被匹配数据在节中的偏移和在文件中的偏移等信息。注意“在文件中的偏移(libFileOffset)”的计算方法,要熟悉LIB/OBJ内部格式才行。
下面是输出指定节(Section)中符号信息的代码。注意必须要过滤掉附加辅助符号(Aux Symbols),其实还可以过滤掉节(Section)本身的符号,以及其它无关的符号,暂时没有处理。输出的信息包括符号名称,是否为函数,符号数据在节中的偏移(存疑)等,足够我们确定特征码所属函数。微软(MicroSoft) Visual C++ 系列编译器生成的LIB/OBJ文件,通常每个节中只有一个函数定义,更加易于做出判断。
检索定位特征码时,我(liigo)引入了最小匹配率(minMatchRate)和计算匹配率时欲忽略的字节值(ignoreByte),主要是考虑到,某些X86指令(如E8指令,call xxx)操作数为相对地址或需要重定位的地址,在EXE和LIB/OBJ中未必完全一致。代码如下:
此外,我们允许用户输入的特征码为16进制的文本数据,形如“FF7424 10 E8 00 00 00 00 C2 1000”,程序内部需将其转换为内存中的二进制数据,每两个字母转换为一个字节值,并处理其中的空格等字符:
程序的最终运行结果如下图。此搜索定位结果与上一篇用易语言定位的结果(图)是一致的(对比搜索到的特征码文件偏移及匹配率)。根据此运行结果,得知“FF7424 10 FF7424 10 FF7424 10 FF7424 10 E8 00 00 00 00 C2 1000”这段特征码(查看对应汇编指令),可能来自于COleControl::OnDoVerb(), WinMain(), CPropertyPageEx::Construct等函数。
全文完。附本文代码编译后程序,locatesym.exe(可能需要使用CSDN帐号下载)。
分享到:
相关推荐
详见: http://blog.csdn.net/liigo/archive/2010/07/12/5727859.aspx
从vc COFF格式的.lib静态库提取出.obj文件,添加或删除某些.obj文件后,可以使用vc命令行lib.exe 重新打包成.lib
c语言调用.lib,.dll,.a,.so中的函数不稀奇,可是你知道怎么调用目标文件.obj文件中的函数吗?
android 系统应用二次开发的导入包,生成位置 /out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar 自己命名成了 framework_intermediates_class.jar 源文件叫 class.jar
源码分享 易语言调用方法
建立用户目标模块库(lib文件)可以解决这个问题,你可以事先把有特定功能的通用的子函数集编译完成后生成的obj文件打入lib文件,当链接器tlink.exe在进行链接操作时,便只会把程序内部用到的通用函数所在的obj文件...
PEDUMP - Win32/Win64 EXE/OBJ/LIB/DBG file dumper - 2001 Matt Pietrek 支持win64文件.
可以读取在网上下载的大部分obj模型,obj文件和mtl文件都可以进行读取,VS2017就可以运行,图片什么的要放在同一个目录下。
利用C语言调用obj文件中的函数,来实现函数的功能。
deoplete-clang, 带有 clang python3的C/C /Obj c/obj C 的deoplete.nvim 源 deoplete-clang 状态14.04电容器 用于 deoplete.nvim的C/C /Objective-C/Objective-C 源概述deoplete提供了用C 。C 。objectiv
三维模型格式obj文件解析源码,vs2013编译环境下编写的
使用C++Builer编译VCL控件源代码时经常会出现诸如“Unable to open file XXX.obj”的错误提示,有的是由于缺少了引用库的问题,下表列出了几个常用的确实文件所在的引用库
C标准库源代码,能提高对C的理解,不错的哦 下载文件列表 Pack : clibsource.rar C 标准库源代码\ABORT.C C标准库源代码\ABS.C C标准库源代码\ACCESS.C C标准库源代码\ADJUSTFD.C C标准库源代码\ALGRITHM C标准库源...
调用C语言的函数,需要在函数声明的地方语句extern “C”。如果不使用该语句,在链接的时候,编译器就会报以下这种错误。 Test.obj : error LNK2019: 无法解析的外部符号 “void __cdecl DeleteStack(struct _Node *...
importobj类 读取 3dsmax obj文件
模型格式转换工具,支持osgb、ive、osg、obj四种格式之间的相互转换
C++写的一个简单的读取obj文件的程序
教程详细的教了怎么在delphi中使用c的obj对象文件,并且给了实验代码,对新手来说是不可多得的好教程.
可以读取obj格式的文件到matlab空间中,obj格式的文件中,只能包含点和面的信息
LIB.EXE 的用法