重定位代码Repair
此类指令都为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相关推荐
- uboot重定位代码分析(转)
概述 重定位(relocate)代码将BootLoader自身由Flash复制到SDRAM,以便跳转到SDRAM执行.之所以需要进行重定位是因为在Flash中执行速度比较慢,而系统复位后总是从0x00 ...
- Tiny6410之重定位代码到SRAM+4096
重定位代码 两个不同的地址概念: 对于程序而言,需要理解两个地址,一个是程序当前所处的地址,即程序运行时所处的当前地址.二是程序应该位于的运行地址,即编译程序时所指定的程序的链接地址.在Tiny641 ...
- Tiny6410之重定位代码到SDRAM
在上一章中,将代码重定位到了SRAM中,但是这样的做法作用不大.正确的做法的是将代码重定位到更大的主存中,即DRAM.Tiny6410的DRAM控制寄存器最多只能支持两个同一类型的芯片.每个芯片最多可 ...
- tiny4412 裸机程序 六、重定位代码到IRAM+0x8000【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37115697 一.重定向 对于程序而言,我们需要理解两个概念,一是程序当前所处的地址,即程序在运 ...
- tiny4412 裸机程序 六、重定位代码到IRAM+0x8000
一.重定向 对于程序而言,我们需要理解两个概念,一是程序当前所处的地址,即程序在运行时,所处的当前地址:二是程序的链接地址,即程序运行时应该位于的运行地址.编译程序时,可以指定程序的链接地址.对于Ti ...
- tiny4412 裸机程序 七、重定位代码到DRAM【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37116637 一.关于DRAM 上一章我们讲解了如何对代码进行重定位,但是将代码重定位到只有25 ...
- uboot为什么要重定位/代码拷贝?
参考自:https://www.cnblogs.com/Cqlismy/p/12152400.html 必看.这个老哥写的uboot启动的博客非常棒,感谢. 还有https://blog.csdn.n ...
- 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. ...
- Windows PE第6章 栈与重定位表
第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...
最新文章
- 从 idea打包工程到dos下命令运行
- 查找DetailsView1数据控件中的数据
- C++ 对象的内存布局
- aop简介-aop的底层实现
- 经典排序算法(10)——基数排序算法详解
- ROS技术点滴 —— MoveIt!中的运动学插件
- 中国移动云智融合峰会 与您相约揽胜九天
- linux ps ax tl,Linux常用指令 - osc_wa6fkyf0的个人空间 - OSCHINA - 中文开源技术交流社区...
- Ubuntu 20.04 LTS 代号 “Focal Fossa“,明年 4 月正式发布
- SylixOS 内存管理源代码分析--phyPage.c
- python cpk计算器_CPK公式
- wps文字表格制作拼音田字格模板_用WPS表格快速制作拼音田字格的方法
- web平台微信扫码登录
- C++11_lambda表达式
- 无线传输 android下载,无线文件传输 WiFi File Transfer
- ps--光照+光晕+模糊
- APNG面向移动与未来的新动画图片格式揭秘与制作全技巧
- 自贡方言词典241条
- Win8调整笔记本亮度,数值有变化但无效果
- 查询快递 教你一个方法按照物流途径城市筛选签收地
热门文章
- 【译】ZFS最佳实践指南-Part2
- 安全认证Kerberos
- python绘制散点图的函数_python绘制散点图
- Labview连接mysql进行仿真
- AcWing 897. 最长公共子序列(LCS朴素版)
- The Suspects(并查集入门)
- 下面不是android四大组件之一的是,Android四大组件之一 Service
- 太极计算机 审计厅,湖北省审计厅举办2010年春节联欢会
- html toggle自动隐藏,Javascript / HTML – 切换可见性(当另一个div元素呈现可见时自动导致一个div元素隐藏)...
- 计算机怎样存储数值,(二)计算机如何保存字符和数字,并完成计算