基于C语言中库函数的展开形式的识别技术

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:fr20899
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:提出了一种对二进制文件中的库函数的展开形式进行识别的方法。首先对二进制文件进行反汇编,然后对反汇编代码中的必然指令进行识别,最后利用IDA Pro的脚本语言IDC编写代码进行验证。
  关键词:C语言;展开形式;识别技术;反汇编
  中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)12-2829-02
  1 库函数展开形式的出现
  现代编译器为了加快程序的运行速度,避免调用库函数所带来的开销,在调用库函数时,直接出现库函数的展开形式。编译器有时也出于对所编程序优化的目的,为了提高程序运行时的效率经常在目标代码中出现展开的库函数形式,而且不同的编译器对同一个库函数编译出的汇编指令并不相同,即使是相同的编译器在不同的优化层次上编译出的汇编指令也不相同。展开库函数也有副作用,那就是使目标文件的大小有所增加,所以在C语言中具有这种展开库函数的函数不多,常见的有strcpy、strcat、memset和memcpy,本文只研究对它们的识别。
  2 库函数展开形式的识别
  2.1 库函数展开形式的特征
  选用IDA Pro反汇编工具,IDA Pro是DataRescue公司出品的功能强大的专业级反汇编工具,IDA(The InteractiveDisassembler)的全名是交互式反汇编工具[ ]。首先把要识别的二进制文件进行反汇编,然后对反汇编后的代码进行识别。对于展开库函数的精确识别,是比较复杂的问题,但这些函数的反汇编后具有明显的特征,如strcpy()的展开形式的反汇编为:
  1. mov edi,[esp arg_4]
  2. or ecx,0FFFFFFFFh
  3. xor eax,eax
  4. repne scasb
  5. not ecx
  6. sub edi,ecx
  7. moveax,ecx
  8. movesi,edi
  9. movedi,[esp arg_0]
  10.shr ecx,2
  11.rep movsd
  12.movecx,eax
  13.and ecx,3
  14.repmovsb
  此处strcpy()展开后有14条指令,而且随着不同编译器的不同优化,strcpy()展开后的指令条数各不相同。但经过对不同的编译器编译后的指令分析,有些指令是必须出现的指令,如上面提到的2、3、4、7、11和14指令,将展开库函数中必然出现的指令称为必然指令,其余指令称为普通指令。必然指令可以作为识别展开库函数的特征,故将展开库函数的识别转化为必然指令的识别。
  2.2 库函数展开形式的识别方法
  在具体实现过程中,利用IDA Pro的脚本语言IDC编写检测插件。编写前要先配置编译环境,然后套用模板编写IDA插件,最后复制编译好的插件(确定它在Windows下的扩展名为.plw,Linux下为.plx)到IDA的plugins目录,然后IDA将自动加载它。在VC 中编写一般分以下五部分:预处理、初始化函数、清除函数、主体运行函数和辅助说明[ ]。strcpy、strcat、memset和memcpy的必然指令可以查阅MSDN获知。把所有必然指令放在二维字符型数组中,每一行存放一个函数的必然指令集,中间用星号分隔,其中每个函数我们抽象出四条指令,二维数组的初始化如下:
  mustorder[4][80]=
  {“repne scasb*mov esi,edi*repmovesd*repmovesb”_//strcpy函数的必然指令
   “movsw*rep movsd*movsb*mov edi,eax”//memcpy函数的必然指令
  “repne scasb*rep movsd*movs*mov esi,eax”//strcat函数的必然指令
   “movse*repne scasb*movsb*mov esi edi” //memset函数的必然指令
   };
  int flag[4]=0;
  char funarray[4][10]={“strcpy”,”strcat”,”memset”,”memcpy”};
  同时设置一个标志数组flag[4],其初始值为0。在程序运行过程中,如果所查找的必然指令存在mustorder数组中的一行,就让flag数组中相应下标所对应的数组元素加1,如果检查完程序后flag数组中有值为4的元素,则存在必然函数的展开形式,同时设置数组funarray存放函数名。
  void findlongfun (int arg)
  { // 在所有段中查找
  FILE *fp;
  //打开存库函数的文件
  if((fp=fopen(“需要检测得库函数文件”,”w ”))= =NULL{
  printf(“ Buffer flow vulnerability file cannot be open ”);
   Exit(1);}
  for (int s = 0; s < get_segm_qty(); s ) {
   segment_t *seg = getnseg(s);
  //仅查找代码段
  if (seg->type == SEG_CODE)
  { // 反复执行循环,在所有的调用函数中查找
  for (int x = 0; x < get_func_qty(); x ) {
  //对标志数组初始化
  for(i=0;i<4;i )
  flags[i]=0;
   func_t *f = getn_func(x);
  //在选中函数中从前到后循环查找
  for (ea_t addr = f->startEA; addr < f->endEA; addr ) {
  flags_t flags = getFlags(addr);
  //仅仅从一行的开头并且这行标记是函数代码所在的行查找
  if (isHead(flags)
其他文献
针对数字散斑图像的特性对三维重建精度造成影响的问题,对数字散斑图像的特性以及斑点分布方式进行分析,模拟了三种不同的散斑图像,通过理论分析与实验研究获得了辅助效果较好的数字散斑图像。为了对散斑的特性进行研究,首先介绍了双目三维视觉的基本原理、数字散斑的模拟方法以及数字散斑相关方法;然后,分析了随机灰度、二值全局和二值局部散斑的灰度直方图与平均灰度梯度;最后,设计了不同直径、分布方式的数字散斑图,并实
由于全台网是业务整合、信息整合,其规模越来越大,所以安全的问题也更加突出。致使安全生产播出成为电视台的生命线,是一切工作的重点。网络安全一般是指防范黑客攻击和病毒
随着3G时代的到来和迅速发展,三雏彩码作为新型条码技术产品将越来越被人们所熟知,但其版权保护问题也随之而来。该文提出了基于奇异值分解的零水印算法,在分块的基础上采用奇异
家庭网关是家庭网络中的关键。该文首先介绍了家庭网络的总体结构,接着提出了一种新的家庭网关结构。以32位ARM嵌入式微处理器SC2410X为核心,并扩充多个功能模块,通过移植Lin
摘 要:森林病虫害防治是国家减灾工程的重要组成部分,对保护森林资源,改善生态环境,促进国民经济和社会可持续发展具有十分重要的意义。  关键词:森林;病虫害;防治  森林病虫害素有“不冒烟火灾”之称,危害程度相当严重。本文围绕森林病虫害防治工作进行了浅要论述。  1 森林病虫害防治工作的主要问题  随着人工造林面积的增加,特别是单一树种纯林的增加,病虫危害加剧。森林病虫害发生面积不断增加,防治难度大
校企合作是高职院校人才培养的重要途径,本文以武汉船舶职业技术学院在三坐标测量校企合作订单班开展的实验教学为例,从教材的制定、教学团队的分工合作、教学方式、考核机制
该文介绍了如何利用Flash CS3.0中的ActionScript3.0技术构建一种全新的虚拟交通系统,从而为人们提供更多的出行参照信息,以解决传统电子地图的一些弊端,并且具有一定程度上的实用性和可移植性。人们可以通过该虚拟交通系统获得更加直观的道路信息,从而可以更加方便准确的找到自己想要到达的地方。
摘要:针对近年来随着网络的普及以及各大公司企业和政府机构的网络信息系统安全问题频出的状况,该文分析了一般的安全事故种类以及常用的安全技术的基础上,阐述了一个较为完整的信息安全保障系统应具备的功能,结合检察系统的工作实际,提出了检察信息安全保障系统的建设方法。  关键词:防火墙;入侵检测;PKI;数字签名  中图分类号:TP309 文献标识码:A 文章编号:1009-3044(2010)01-45-
目的探讨基于微信平台的“1+1+X”协同干预在PCI患者延续性护理中的应用效果。方法选取2019年5月至2020年4月入住本院行PCI的72例冠心病患者为研究对象,运用随机数字表法分为观察组和对照组,各36例。观察组实行基于微信平台的“1+1+X”协同式延续性护理方案,对照组实行常规的延续性护理方案。比较两组疾病自护能力、生活质量以及心血管不良事件发生率。结果干预后,观察组自护能力量表中的自我责任