病毒的重定位技术学习笔记

原文:http://www.pediy.com/kssd/index.html -- 病毒技术 -- 病毒知识 -- Anti Virus专题

下面的代码都是内联汇编,较比较汇编会有些限制,可能写法上有时候会不一样。黑色是代码,红色是编译的汇编代码

int g_nTest;

__asm

{

call Dels

00401004 call 013C13A3 ; call指令会将下一句指令的地址入栈

Dels:

pop ebx

00401009 pop ebx ; 将栈中保存的地址弹到ebx中

lea eax, g_nTest

0040100A lea eax,ds:[00401000h] ; 获得全局变量的地址

sub eax, Dels

00401010 sub eax,00401009h ; 获得全局变量和Dels的差值

lea edx, [ebx + eax]

00401006 lea edx,[ebx+eax] ; 用ebx即Dels的地址加上差值就得到了全局变量的地址

}

假如g_nTest的地址为00401000h,将上面的重定位代码感染到被感染的程序空间中的地址为00801004h的地方,g_nTest对应的地址就应为00801000h,就会是下面这种情况:

call指令执行后,将地址00801009h压入堆栈(应为call指令占用5个字节),然后pop给ebx,然后求得全局变量和Dels的差值,即00401000h - 00401009h,然后加到ebx(00801009h)上即可得到全局变量在被感染程序中的位置(00801000h)。其实意思也就说,在病毒本体的时候,全局变量和call指令的下一句指令的差和在被感染程序中是一样的,它是不变的,在被感染程序中获得call的下一句指令的地址,然后加上差值,即可找到全局变量

以下摘自原文,里面加了点自己的注释,括号里的

"比如我们的szText变量(也就是全局变量)相对于病毒起始位置的偏移是9h(这里的起始位置可以理解为一个点,同全局变量与call下一句指令的地址的差值,也即偏移是一样的), 那么只要通过求得病毒插入到被感染对象后的病毒起始位置 + 这个变量相对病毒起始位置的偏移 =  变量在被感染对象中的位置。"

还有一种方法是罗云彬的《Windows环境下32位汇编程序语言设计》第13章远程线程中说到的,代码如下:

int g_nTest;

__asm

{

call Dels

00401004 call 00401009 ; 保存下句指令地址到堆栈

Dels:

pop ebx

00401009 pop ebx; 弹到ebx

sub ebx, Dels

0040100A sub ebx,00401009h; 减去Dels获得差值

lea edx, [ebx + g_nTest]

00401010 lea edx,[ebx+00401000h]; 差值加上全局变量

}

这个重定位方法是这样的:如果g_nTest的地址为00401000h,这个代码没有插入到别的程序中,将指令保存到堆栈弹到ebx后,ebx减去Dels为0,然后加上全局变量就等于lea edx, [g_nTest]

如果插入到别的程序地址为00801004h的位置,g_nTest地址变为00801000h,那么pop到ebx 的值即为00801009h,减去Dels为00801009h - 00401009h = 00400000h,然后加上全局变量就变成了lea edx, [00400000h + 00401000h],这样就获得了全局变量的地址

时间: 2024-11-08 22:51:05

病毒的重定位技术学习笔记的相关文章

Java多线程技术学习笔记(二)

目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和wait的区别 停止线程的方式 守护线程 线程的其他知识点 一.线程间的通信示例 返目录回 多个线程在处理同一资源,任务却不同. 假设有一堆货物,有一辆车把这批货物往仓库里面运,另外一辆车把前一辆车运进仓库的货物往外面运.这里货物就是同一资源,但是两辆车的任务却不同,一个是往里运,一个是往外运. 下面

程序员编程技术学习笔记——字符串包含

程序员编程技术学习笔记--字符串包含 1.题目描述 给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短.请问,如何最快地判断字符串B中所有字母是否都在字符串A里?为了简单起见,我们规定输入的字符串只包含大写英文字母,请实现函数boolStringContains(string &A, string &B) 比如,如果是下面两个字符串: String 1:ABCD String 2:BAD 答案是true,即String2里的字母在String1里也都有,或者说Strin

程序员编程技术学习笔记——左旋转字符串

程序员编程技术学习笔记--左旋转字符串 1.    题目描述 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串"abcdef"前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串"cdefab".请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1). 2.    解法1:暴力左移 这个解法简单粗暴易想!你不是要以为k个字符吗,我先移动一位,然后把移动一位的函数运行k次就好啦~~

Java多线程技术学习笔记(一)

目录: 概述 多线程的好处与弊端 JVM中的多线程解析 多线程的创建方式之一:继承Thread类 线程的状态 多线程创建的方式之二:实现Runnable接口 使用方式二创建多线程的好处 多线程示例 线程安全问题现象 线程安全问题产生的原因 同步代码块 同步的好处与弊端 同步的前提 同步函数 验证同步函数的锁 单例模式的线程安全问题的解决方案 死锁示例 一.概述 目录 首先得了解进程,打开我们电脑的windows资源管理器,可以直观看到进程的样子: 进程直观上理解就是正在进行的程序.而每个进程包含

U盾技术学习笔记

这几天学习U盾相关的技术,以自己的理解表述一遍. U盾是用于网上银行电子签名和数字认证的工具.内置智能卡处理器,采用1024位非对称密钥算法对网上数据进行加密.解密和数字签名.确保网上交易的保密性.真实性.完整性.不可否认性. 本文以甲方向乙方网上发送一份合同文件为例,结合U盾,讲述保证数据安全的流程. 1.  保密性 数据的保密性是保证数据安全的最基本的特性,甲方向乙方网上发送一份合同文件,必须保证合同内容不被其他人查看.这里可以采取一些数据加密算法,目前成熟的对称加密算法有3DES.DES.

AIX PowerPC体系结构及其溢出技术学习笔记

一. 熟悉PowerPC体系及其精简指令集计算 PowerPC体系结构是RISC(精简指令集计算),定义了 200 多条指令.PowerPC 之所以是 RISC,原因在于大部分指令在一个单一的周期内执行,而且是定长的32位指令,通常只执行一个单一的操作(比如将内存加载到寄存器,或者将寄存器数据存储到内存).差不多有12种指令格式,表现为5类主要的指令: 1.分支(branch)指令 2.定点(fixed-point)指令 3.浮点(floating-point)指令 4.装载和存储指令 5.处理

数通技术学习笔记

Day 1 SOHO--Small office(and) Home office 家居办公 大多指那些专门的自由职业者 ISP(Internet Service Provider),互联网服务提供商,即向广大用户综合提供互联网接入业务.信息业务.和增值业务的电信运营商,能提供拨号上网服务.网上浏览.下载文件.收发电子邮件等服务,是网络最终用户进入Internet的入口和桥梁.它包括Internet接入服务和Internet内容提供服务.这里主要是Internet接入服务,即通过电话线把你的计算

网页排版中的浮动和定位(学习笔记)

CSS中的浮动和定位 在了解CSS中的浮动和定位之前有必要先了解清楚标准流和脱离标准流的特性 虽然浮动和定位很重要,但是在以后的网页写作中,还是尽量少用,最好别乱用,不然后面问题很大,特别是对初学者.最好要把浮动和定位要搞清楚在使用. 标准流的默认特性 1.分行.块级元素,并且能够dispay转换. 2.块级元素(block):默认独占一行,不能并列显示,能够设置宽.高,宽度为父盒子的100%.例如:div.p.标题元素(h1-h6).列表元素(ul li.dl dt dd) 3.行内元素(in

直播技术学习笔记(一)

播放器相关技术: 1.开源项目jjdxm_ijkplayer是基于ijkplayer简单的UI界面: ijkplayer是一个基于 FFmpeg n2.6 的开源 Android/iOS 视频播放器: 2.虚拟按键的隐藏方法: rootView = getLayoutInflater().from(this).inflate(R.layout.activity_calrity,null); setContentView(rootView); /**虚拟按键的隐藏方法*/ rootView.get