此类指令都为6个字节

大致试验结果如下:

第一个字节跟操作类型相关,第二个字节跟寄存器相关,后面四个字节为地址

第二个字节高四位必须为8,9,A,B四个中的一个,低四位必为5和D中的一个,产生8种排列组合,分别代表8个寄存器

第一个能够使用到[EBP+XXXX]的操作数如下:

0X   ADD/OR

1X   ADC/SBB

2X   SUB/ADD

3X   CMP/XOR

8X    ADD/MOV/LEA/POP/XCHG/TEST

CX   ROL/LDS/MOV

DX   ROL/FADD

FX   INC/CALL/TEST

修改方法:

假定OFFSET小于两个字节,则搜索0000串,往前推三个字节和四个字节,使用上述条件判断,如果满足上述条件,则将第二个字节减去0x80h,并将地址加上偏移

修复代码如下:

char *pDoubleNull;
 char *pEnd=(char*)lpBuffer+nBufferSize;
 int nSearchSize=nBufferSize;
 char* lpSearchBuffer=lpBuffer;
 do
 {
  pDoubleNull=(char*)memchr(lpSearchBuffer,'\0',nSearchSize);
  if(NULL==pDoubleNull)
   break;
  nSearchSize=(int)(pEnd-pDoubleNull);
  lpSearchBuffer=pDoubleNull+1;
  if('\0'!=*(pDoubleNull+1))
   continue;
  if(0=*(WORD*)(pDoubleNull+2))//Exclude lea  ecx, ds:0[ecx*8] etc.
  {
   lpSearchBuffer+=3;
   continue;
  }

lpSearchBuffer++;
  unsigned char bFirHigh,bSecHigh,bSecLow;
  if(NULL==*(pDoubleNull-4)||NULL==*(pDoubleNull-3)||0x850F=*(WORD*)(pDoubleNull-4))//Exclude jnz
   continue;
  bFirHigh=(*(pDoubleNull-4))&0xF0;
  bSecHigh=(unsigned char)((*(pDoubleNull-3))&0xF0)>>4;
  bSecLow=(*(pDoubleNull-3))&0xF;
  if((0x5==bSecLow||0xD==bSecLow)&&(bSecHigh>=0x8&&bSecHigh<=0xB))
   if(0==bFirHigh||0x10==bFirHigh||0x20==bFirHigh||0x30==bFirHigh||0x80==bFirHigh||0xC0==bFirHigh||0xD0==bFirHigh||0xF0==bFirHigh)
   {
    *(pDoubleNull-3)-=0x80;
    *(DWORD*)(pDoubleNull-2)+=nOffsetAddr;
   }

}while(lpSearchBuffer<=(pEnd-6));

注:1.可能存在个别偏移为单字节的未能修复,需再使用手动修复

  2. 此方法亦可用于把正常CODE修改为重定向

转载于:https://www.cnblogs.com/chenjava/archive/2008/12/04/1347681.html

重定位代码Repair相关推荐

  1. uboot重定位代码分析(转)

    概述 重定位(relocate)代码将BootLoader自身由Flash复制到SDRAM,以便跳转到SDRAM执行.之所以需要进行重定位是因为在Flash中执行速度比较慢,而系统复位后总是从0x00 ...

  2. Tiny6410之重定位代码到SRAM+4096

    重定位代码 两个不同的地址概念: 对于程序而言,需要理解两个地址,一个是程序当前所处的地址,即程序运行时所处的当前地址.二是程序应该位于的运行地址,即编译程序时所指定的程序的链接地址.在Tiny641 ...

  3. Tiny6410之重定位代码到SDRAM

    在上一章中,将代码重定位到了SRAM中,但是这样的做法作用不大.正确的做法的是将代码重定位到更大的主存中,即DRAM.Tiny6410的DRAM控制寄存器最多只能支持两个同一类型的芯片.每个芯片最多可 ...

  4. tiny4412 裸机程序 六、重定位代码到IRAM+0x8000【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37115697 一.重定向 对于程序而言,我们需要理解两个概念,一是程序当前所处的地址,即程序在运 ...

  5. tiny4412 裸机程序 六、重定位代码到IRAM+0x8000

    一.重定向 对于程序而言,我们需要理解两个概念,一是程序当前所处的地址,即程序在运行时,所处的当前地址:二是程序的链接地址,即程序运行时应该位于的运行地址.编译程序时,可以指定程序的链接地址.对于Ti ...

  6. tiny4412 裸机程序 七、重定位代码到DRAM【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37116637 一.关于DRAM 上一章我们讲解了如何对代码进行重定位,但是将代码重定位到只有25 ...

  7. uboot为什么要重定位/代码拷贝?

    参考自:https://www.cnblogs.com/Cqlismy/p/12152400.html 必看.这个老哥写的uboot启动的博客非常棒,感谢. 还有https://blog.csdn.n ...

  8. S5PV210体系结构与接口04:代码重定位 SDRAM初始化

    目录 1. C语言环境初始化 1.1 C语言运行所需环境 1.2 初始化栈 1.2.1 栈的概念 1.2.2 栈的作用 1.2.3 如何初始化 1.3 初始化bss段 1.3.1 bss段的作用 1. ...

  9. Windows PE第6章 栈与重定位表

    第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...

最新文章

  1. 从 idea打包工程到dos下命令运行
  2. 查找DetailsView1数据控件中的数据
  3. C++ 对象的内存布局
  4. aop简介-aop的底层实现
  5. 经典排序算法(10)——基数排序算法详解
  6. ROS技术点滴 —— MoveIt!中的运动学插件
  7. 中国移动云智融合峰会 与您相约揽胜九天
  8. linux ps ax tl,Linux常用指令 - osc_wa6fkyf0的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. Ubuntu 20.04 LTS 代号 “Focal Fossa“,明年 4 月正式发布
  10. SylixOS 内存管理源代码分析--phyPage.c
  11. python cpk计算器_CPK公式
  12. wps文字表格制作拼音田字格模板_用WPS表格快速制作拼音田字格的方法
  13. web平台微信扫码登录
  14. C++11_lambda表达式
  15. 无线传输 android下载,无线文件传输 WiFi File Transfer
  16. ps--光照+光晕+模糊
  17. APNG面向移动与未来的新动画图片格式揭秘与制作全技巧
  18. 自贡方言词典241条
  19. Win8调整笔记本亮度,数值有变化但无效果
  20. 查询快递 教你一个方法按照物流途径城市筛选签收地

热门文章

  1. 【译】ZFS最佳实践指南-Part2
  2. 安全认证Kerberos
  3. python绘制散点图的函数_python绘制散点图
  4. Labview连接mysql进行仿真
  5. AcWing 897. 最长公共子序列(LCS朴素版)
  6. The Suspects(并查集入门)
  7. 下面不是android四大组件之一的是,Android四大组件之一 Service
  8. 太极计算机 审计厅,湖北省审计厅举办2010年春节联欢会
  9. html toggle自动隐藏,Javascript / HTML – 切换可见性(当另一个div元素呈现可见时自动导致一个div元素隐藏)...
  10. 计算机怎样存储数值,(二)计算机如何保存字符和数字,并完成计算