`
dengbaoleng
  • 浏览: 1131505 次
文章分类
社区版块
存档分类
最新评论

在静态库LIB/OBJ文件中搜索定位病毒特征码所属函数,C/C++源码

 
阅读更多

作者:庄晓立 (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等函数。

search_symbols_in_lib

全文完。附本文代码编译后程序,locatesym.exe(可能需要使用CSDN帐号下载)。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics