通过DLL劫持技术HookAPI
DLL劫持技术
当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间中。
由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行,如图18.3所示。这个过程用个形象的词来描述就是系统DLL被劫持(hijack)了。
图18.3 DLL劫持技术演示
利用这种方法取得控制权后,可以对主程序进行补丁。此种方法只对除kernel32.dll、ntdll.dll等核心系统库以外的DLL有效,如网络应用程序的ws2_32.dll、游戏程序中的d3d8.dll,还有大部分应用程序都调用的lpk.dll,这些DLL都可被劫持。
利用第5章5.6.2节提供的CrackMeNet.exe来演示一下如何利用劫持技术制作补丁,目标文件用Themida v1.9.2.0加壳保护。
1.补丁地址
去除这个CrackMe网络验证方法参考第5章5.6.2节,将相关补丁代码存放到函数PatchProcess()里。例如将401496h改成:00401496 EB 29 jmp short 004014C1
补丁编程实现就是:
unsigned char p401496[2] = {0xEB, 0x29};
WriteProcessMemory(hProcess,(LPVOID)0x401496, p401496, 2, NULL);
p401496这个数组的数据格式,可以用OllyDbg插件获得,或十六进制工具转换。例如Hex Workshop打开文件,执行菜单“Edit/Copy As/Source”即可得到相应的代码格式。
2.构建输出函数
查看实例CrackMeNet.exe输入表,会发现名称为“ws2_32.dll”的DLL,因此构造一个同名的DLL来完成补丁任务。伪造的ws2_32.dll 有着真实ws2_32.dll一样的输出函数,完整源码见光盘映像文件。实现时,可以利用DLL模块中的函数转发器来实现这个目标,其会将对一个函数的调用转至另一个DLL中的另一个函数。可以这样使用一个pragma指令:
#pragma comment(linker, "/EXPORT:SomeFunc=DllWork.someOtherFunc")
这个pragma告诉链接程序,被编译的DLL应该输出一个名叫SomeFunc的函数。但是SomeFunc函数的实现实际上位于另一个名叫SomeOtherFunc的函数中,该函数包含在称为DllWork. dll的模块中。
如果要达到劫持DLL的目的,生成的DLL输出函数必须与目标DLL输出函数名一样。本例可以这样构造pragma指令:
#pragma comment(linker, "/EXPORT:WSAStartup=_MemCode_WSAStartup,@115") 编译后的DLL,会有与ws2_32.dll同名的一个输出函数WSAStartup,实际操作时,必须为想要转发的每个函数创建一个单独的pragma
代码行,读者可以用工具AheadLib或用其他办法,将ws2_32.dll输出函数转换成相应的pragma指令。
当应用程序调用伪装ws2_32.dll的输出函数时,必须将其转到系统ws2_32.dll中,这部分的代码自己实现。例如,WSAStartup输出函数构造如下:
ALCDECL MemCode_WSAStartup(void)
{
GetAddress("WSAStartup");
__asm JMP EAX;//转到系统ws2_32.dll的WSAStartup输出函数
}
其中,GetAddress()函数的代码如下:
// MemCode 命名空间
namespace MemCode
{
HMODULE m_hModule = NULL; //原始模块句柄
DWORD m_dwReturn[500] = {0}; //原始函数返回地址
// 加载原始模块
inline BOOL WINAPI Load()
{
TCHAR tzPath[MAX_PATH]={0};
TCHAR tzTemp[MAX_PATH]={0};
GetSystemDirectory(tzPath, sizeof(tzPath));
strcat(tzPath,"\\ws2_32.dll");
m_hModule = LoadLibrary(tzPath);//加载系统系统目录下ws2_32.dll
if (m_hModule == NULL)
{
wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);
MessageBox(NULL, tzTemp, TEXT("MemCode"), MB_ICONSTOP); }
return (m_hModule != NULL);
}
// 释放原始模块
inline VOID WINAPI Free()
{
if (m_hModule)
FreeLibrary(m_hModule);
}
// 获取原始函数地址
FARPROC WINAPI GetAddress(PCSTR pszProcName)
{
FARPROC fpAddress;
TCHAR szProcName[16]={0};
TCHAR tzTemp[MAX_PATH]={0};
if (m_hModule == NULL)
{
if (Load() == FALSE)
ExitProcess(-1);
}
fpAddress = GetProcAddress(m_hModule, pszProcName);
if (fpAddress == NULL)
{
if (HIWORD(pszProcName) == 0)
{
wsprintf(szProcName, "%d", pszProcName);
pszProcName = szProcName;
}
wsprintf(tzTemp, TEXT("无法找到函数 %hs,程序无法正常运行。"), pszProcName);
MessageBox(NULL, tzTemp, TEXT("MemCode"), MB_ICONSTOP); ExitProcess(-2);
}
return fpAddress;
}
}
using namespace MemCode;
编译后,用LordPE查看伪造的ws2_32.dll输出函数,和真实ws2_32.dll完全一样,如图18.4所示。
(点击查看大图)图18.4 伪造ws2_32.dll的输出表查看伪造的ws2_32.dll中任意一个输出函数,例如WSACleanup:
.text:10001CC0 ; int __stdcall WSACleanup()
.text:10001CC0 WSACleanup proc near
.text:10001CC0 push offset
aWsacleanup ;"WSACleanup"
.text:10001CC5 call sub_10001000 ;GetAddress(WSA Cleanup)
.text:10001CCA jmp eax
.text:10001CCA WSACleanup endp
会发现输出函数WSACleanup()首先调用GetAddress(WSACleanup),获得真实ws2_32.dll中WSACleanup的地址,然后跳过去执行,也就是说,ws2_32.dll各输出函数被Hook了。
3.劫持输出函数
ws2_32.dll有许多输出函数,经分析,程序发包或接包时,WSAStartup输出函数调用的比较早,因此在这个输出函数放上补丁的代码。代码如下:
ALCDECL MemCode_WSAStartup(void)
{
hijack();
GetAddress("WSAStartup");
__asm JMP EAX;
}
hijack()函数主要是判断是不是目标程序,如果是就调用PatchProcess()进行补丁。
void hijack()
{
if (isTarget(GetCurrentProcess())) //判断主程序是不是目标程序,是则补丁之
{
PatchProcess(GetCurrentProcess());
}
}
伪造的ws2_32.dll制作好后,放到程序当前目录下,这样当原程序调用WSASTartup函数时就调用了伪造的ws2_32.dll的WSASTartup 函数,此时hijack()函数负责核对目标程序校验,并将相关数据补丁好,处理完毕后,转到系统目录下的ws2_32.dll执行。
这种补丁技术,对加壳保护的软件很有效,选择挂接的函数最好是在壳中没有被调用的,当挂接函数被执行时,相关的代码已被解压,可以直接补丁了。在有些情况下,必须用计数器统计挂接的函数的调用次数来接近OEP。此方法巧妙地绕过了壳的复杂检测,很适合加壳程序的补丁制作。
一些木马或病毒也会利用DLL劫持技术搞破坏,因此当在应用程序目录下发现系统一些DLL文件存在时,如lpk.dll,应引起注意。
远程线程注入时遇到的问题
远程线程注入时遇到的问题 这是我在研究程序自我删除(关于程序自我删除相关的技术我会在之后的文章中详细介绍)技术中碰到的问题, 暂时没有找到原因及解决办法. 暂且记录下来方便日后查阅、分析. CreateRemoteThread经常在木马病毒中使用, 最常见的做法就是把LoadLibrary当作线程函数在目标进程中动态加载自己的Dll, 这种方法比通过HOOK加载Dll的优点在于不需要目标进程依赖于User32.dll. 但是在实际使用过程中确会遇到不少问题. 除了使用LoadLibrary作为线程函数我们可以使用自定义的线程函数, 当然前提是这个线程函数的二进制代码已经正确无误地插入到目标进程. 具体方法这里不便展开. AdjustTokenPrivileges: 首先碰到的问题是关于进程权限问题, 确切的来说也不是问题, 只是在开发过程中遇到的比较奇怪的现象, 仅仅记录下来方便日后研究. 在此之前一直没有搞清楚提高进程权限是什么意思, 难道是提高系统级? 当然不可能, 微软不傻. 经过一些测试我有了一些发现. 代码如下: [c-sharp]view plaincopy
1.BOOL EnableDebugPrivilege() 2.{ 3. HANDLE hToken; 4.if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToke n) != TRUE) 5. { 6.return FALSE; 7. } 8. 9. LUID Luid; 10.if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Luid) != TRUE) 11. { 12.return FALSE; 13. } 14. 15. TOKEN_PRIVILEGES tp; 16. tp.PrivilegeCount = 1; 17. tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 18. tp.Privileges[0].Luid = Luid; 19. 20.if(AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), N ULL, NULL) != TRUE) 21. { 22.return FALSE; 23. } 24. 25.return TRUE; 26.} 测试结果如下: 1. 使用该函数->枚举进程. 结果显示枚举到进程67个, 但是任务管理器显示当前进程73个. 未解. 2. 不使用该函数->OpenProcess打开系统进程失败. 这里有两个例外:
下列说法中正确的是
11、下列说法中正确的是: A、参考系必须是固定不动的物体 B、参考系必须是正在做匀速直线运动的物体 C、研究跳水运动员身体转体动作时,运动员可看作质点 D、虽然地球很大,且有自转,但研究地球公转时,地球仍可看作质点 12、汽车上坡的时候,司机必须换档,其目的是: A、减小速度,得到较小的牵引力 B、增大速度,得到较小的牵引力 C、减小速度,得到较大的牵引力 D、增大速度,得到较大的牵引力 13、物体在下列运动中,机械能守恒的是: A、竖直方向的匀速直线运动 B、在斜面上匀速下滑 C、物体做自由落体运动 D、水平方向的匀加速直线运动 14、游泳运动员以恒定的速率垂直河岸横渡,当水流速度突然增大时,对运动员横渡经历的路程、时间发生影响的是: A、路程增加、时间缩短 B、路程、时间均增加 C、路程增加、时间不变 D、路程、时间均不变 15、关于经典力学和相对论,下列说法中正确的是: A、相对论是在否定了经典力学的基础上建立起来的 B、经典力学包含与相对论中,经典力学是相对论的特例 C、经典力学和相对论是各自独立的学说,互不相容 D、经典力学和相对论是两种不同的学说,二者没有联系 16、在通有恒定电流的螺线管内有一点P,下列叙述正确的是: A.过点P的磁感线方向是从螺线管的N极指向S极 B.过点P的磁感线方向是在P点的小磁针S极的所指的方向 C.过点P的磁感线方向是在P点的小磁针S极的受力方向 D.过点P的磁感线方向是从螺线管的S极指向N极
17、在工厂自动化生产流水线上,产品最后都是通过传送带运送到仓库。为了自动计算入库的产品数量,可在流水线上安装计数器。则该计数器所用的传感器最好是: A、力传感器 B、光传感器 C、声传感器 D、磁传感器 18、在“验证平行四边形”实验中,所采用的科学方法是: A、控制变量法 B、等效替代法 C、类比法 D、科学推理法 19、下列哪些措施是静电防止的实例? A、在高大的建筑物顶端装上避雷针 B、在高大的烟筒中安装静电除尘器 C、油罐车后面装有拖地铁链 D、静电喷漆 20、如图所示,细绳OA和OB悬挂着一物体P,细绳BO水平,那么关于细绳AO和BO拉力情况,下列判断正确的是 A. OA绳拉力小于OB绳的拉力 B. OA绳拉力大于OB绳的拉力 P C.OA绳的拉力和OB绳的拉力均小于重物 P的重力 D.OA绳的拉力和OB绳的拉力均大于重物P的重力
重点车辆监控系统解决方案
重点车辆监控系统解决方案 1概述 重点车辆监控系统是基于卫星定位系统或具备卫星定位功能的车辆行驶记录仪等系统的车辆动态管理系统。其中包括重点车辆管理、短信服务(卫星定位系统具备该项功能)、GIS电子地图、无线智能车载单元(车载终端、调度终端等)等。重点车辆包括危险货物运输车辆、县(区)际以上客运班车、旅游包车、重型货车和汽车列车、建设施工单位散装物料车、校车、教练车、出租车以及公交车等公安交警部门重点列管车辆类型。重点车辆监控系统的建设,可以有效地从技术上、管理上解决重点营运车辆“超速、超载、疲劳驾驶”三项治理过程中存在的诸多困难,为相关管理部门对重点营运车辆进行全网实时监控及交通事件、违章事件报警与处理提供了有效的手段与依据。此外,交通管理部门还可以更好地进行指挥调度,合理优化资源配置,可以减少交通拥堵,降低交通尾气排放量,提高人民群众的生活幸福指数。
2系统架构及功能介绍 2.1系统架构 图1 系统总体架构图 (1)车载终端利用各种移动无线通信网络(GPRS/CDMA等)将行车数据上传到企业监控中心; (2)企业监控中心通过互联网将监控数据上传到重点车辆监控平台,在政务网环境下,重点列管车辆监控平台将与省府信息中心的系统共享本市数据; (3)市交警支队监控平台通过政务网络从重点车辆监控平台下载所有行车数据; (4)监控客户端可以部署于市交警支队内部或安监局、教育局等相关部门,这些客户端均通过政务网络从市交警支队监控中心下载监控业务数据,实现各自的监控业务。
2.2系统功能 重点车辆监控系统从功能上可以分为核心系统功能和支撑系统功能两大块,核心系统功能指系统的核心业务功能,主要是车辆信息接收、接入平台管理、报警管理、动态监控等方面,支撑系统功能指支撑系统运行的各类功能,主要是基本资料管理、统计分析和系统配置管理等方面。 2.2.1核心系统功能 (1)车辆信息接收模块 主要包括定时接收、实时接收、主动请求接收以及自动接收相关信息四个功能。针对相关重点运营车辆,在营运的过程中,驾驶人每次上岗前必须动态上传自身的身份识别信息,以便对运行状况的掌握,从而确保运营的安全性、合法性。 图2 车辆分布图 (2)接入平台管理模块 主要包括平台管理、平台信息查询、平台考核三个功能。 (3)报警管理模块 系统能满足车辆报警管理功能:报警信息包括由驾驶员发送的紧急求助信息和车载终端自动发送的事故报警信息。系统接收到报警信息后,经过后台快速分析,在客户端以闪烁或高亮等方式显示报警信息情况,并以分类柱状图形式展现报警信息的宏观分布情况。显示详细报警信息,包括地点、报警类型、所属车队
1下列说法正确的是
甲烷练习题 1.下列说法正确的是[ ] A.木炭燃烧总是生成二氧化碳 B.含碳的化合物叫有机物,碳酸钙、二氧化碳等都是有机物 C.因为干冰气化时要吸收大量热,所以干冰气化是吸热反应 D.点燃甲烷和空气混合物会发生爆炸,所以点燃前应检验它的纯度2.鉴别氢气,甲烷和一氧化碳的适宜方法是[ ] A.分别通过灼热的氧化铜 B.观察它们燃烧的火焰的颜色 C.由燃烧产物判断 D.根据它们的密度加以区别 3.下列关于甲烷性质的叙述,不正确的是[ ] A.甲烷在空气中燃烧生成水和二氧化碳 B.甲烷是无色、有臭味的气体 C.甲烷是一种简单的有机物 D.甲烷极难溶于水 4.下列各组物质分别在空气中充分燃烧,产物完全相同的是[ ] A.H2和CO B.C和CO C.CO和CH4D.H2和C 5.鉴别甲烷和一氧化碳的正确方法是:[ ] A.甲烷有臭味,一氧化碳没有气味 B.甲烷混有空气时点火能发生爆炸,一氧化碳不能 C.甲烷燃烧火焰为黄色、一氧化碳的火焰为蓝色 D.甲烷燃烧产物中有水,一氧化碳燃烧不生成水 6.下列各气体跟氧气混合点火后不能发生爆炸的是:[ ] A.一氧化碳B.二氧化碳 C.氢气D.甲烷
7.有机化工厂附近严禁火种,这是因为绝大多数的有机物容易______,大多数有机化合物都______于水,______导电,受热容易______。熔、沸点______。 8.甲烷燃烧时火焰______呈______色,化学方程式是______。 9.某碳、氢两种元素组成的化合物,碳、氢两种元素的质量比是3∶1这种化合物的化学式为______。 10.在氧气、氢气、氮气、一氧化碳、二氧化碳、甲烷六种物质中:(用化学式表示) (A)混有空气后点火能爆炸的是______ (B)天然气和沼气的主要成分是______ (C)有剧毒的是______ (D)能用于发射宇宙火箭的是______ (E)空气中含量最多的气体是______ (F)使燃着的木条熄灭,还能使澄清的石灰水变浑浊的是______ 11.将7.8g甲烷和CO的混合气充分燃烧,得到10.8g水。求原混合气中甲烷的质量分数。 12.1kg甲烷燃烧生成的二氧化碳与多少克一氧化碳燃烧生成的二氧化碳的质量相等?与多少克氢气燃烧生成的水的质量相等? 13.甲烷不完全燃烧能生成炭黑,化学方程式为: CH4+O2C+2H2O 要制得5kg炭黑,至少需要多少升(标准状况)甲烷?(甲烷在标准状况下密度是0.717g/L) 煤和石油练习题 1.下列物质,不属于混合物的是[ ] A.天然气 B.煤 C.石油 D.酒精 2.某有机物在空气中完全燃烧时,生成CO2和H2O的质量比为11:9,则该有机物可能是①CH4,②C2H2,③C2H5OH,④CH3OH中的[ ]
Intel系列CPU流水线技术的发展与展望
Intel系列CPU流水线技术的发展与展望流水线技术是指在程序执行时多条指令重叠进行操作的一种准并行处理实 现技术。在计算机中,把一个重复的过程分解为若干子过程,每个子过程由专门的功能部件来实现。将多个处理过程在时间上错开,依次通过各功能段,这样,每个子过程就可以与其他子过程并行进行。其中,流水线中的每个子过程及其功能部件称为流水线的级或段,段与段相互连接形成流水线。流水线的段数称为流水线的深度。把流水线技术应用于指令的解释执行过程,就形成了指令流水线。其中可以把指令的执行过程分为取指令、译码、执行、存结果4个子过程。把流水线技术应用于运算的执行过程,就形成了运算操作流水线,也称为部件级流水线。 Inter Pentium 系列中采用的流水线技术 流水线技术早在Intel的X86芯片中均得到了实现。而Pentium系列CPU产品更是一个高级的超标量处理器。奔腾处理器可以在一个时钟周期内完成两条指令,一个流水线完成一条指令。具有MMX技术的奔腾处理器为整型流水线增加了一个额外的处理阶段。在486芯片中,一条指令一般被划分为五个标准的部分,奔腾亦是如此,而在P6中,由于采用了近似于RISC的技术,一条指令被划分成了创纪录的十四个阶段,这极大地提高了流水线的速度。P6系列处理器使用动态执行结构,该结构通过硬件寄存器重命名和分支预测的方法,将乱序执行和推测执行合成在一起。奔腾Ⅲ处理器使用了P6中的动态执行技术,增加了超标量双流水线结构、分支预测技术、通过乱序来优化指令流水线、将指令划分为更细的阶段。而奔腾Ⅳ新增的技术有使用高级动态执行、执行跟踪缓存、快速执行引擎、超长管道处理技术、超线程技术。它基本的指令流水线长度达到了20级,更长的流水线可以使处理器运行在更高的主频下,从而提高处理器的性能,但有可能带来一些指令执行上的延迟。 提高流水线性能的方法及相关技术 从不同的角度和观点,可以把流水线分成多种不同的种类。按照流水线所完成的功能来分,可以分为单功能流水线和多功能流水线。按照同一时间段内各段之间的连接方式来对多功能流水线进一步的分类,可以分成静态流水线和动态流水线。若是按照流水的级别来分类,则可以分成部件级、处理机级和处理机间流水线。若按照流水线中是否有回馈回路来分,又可以分为线性流水线和非线性流水线。按照任务流入和流出的顺序是否相同可以分为顺序流水线和乱序流水线。 衡量一个流水线性能的主要指标有吞吐率、加速比和效率。吞吐率是指在单位时间内流水线所完成的任务数量或者输出的结果数量。完成一批任务,不使用流水线所花的时间与使用流水线所用时间直比即为流水线的加速比。流水线的效
车辆监控系统项目解决方案
车辆监控系统解决方案
概述 (1) 功能介绍 (3) 一、车辆定位查询功能 (3) 二、报警功能 (3) 三、远程断油功能 (4) 四、防劫、防盗控制功能 (5) 五、公共救助服务 (6) 六、黑匣子记录功能 (6) 七、越界报警功能 (7) 八、轨迹记录、回放功能 (7) 九、自主导航功能(该功能BE-808BDC、BE-808BDC支持) (8) 系统设计 (9) 一、系统设计原则 (9) 1.可行性 (11) 2.经济性 (11) 3.实用性 (11) 4.先进性 (12)
5.可靠性 (13) 6.安全性 (13) 7.扩展性 (14) 8.标准性 (15) 9.易管理性 (15) 10.指令与反馈统一 (15) 11.作业全程信息共享 (15) 12.流程优化 (16) 13.作业严谨及透明化 (16) 14.量化管理、决策优化 (16) 二、系统网络拓补 (17) 三、系统体系架构 (18) 三、中心系统说明 (20) 1.系统示意图 (20) 2.系统工作流程图 (21) 3.中心接收(808)程序 (23) 4.中心分发程序 (23)
5.数据解析入库服务器 (24) 6.终端资料录入系统 (25) 7.客户端 (25) 8.报警报表功能 (27) 设备简介 (27) 一、BE-A08G (27) 二、BE-910C (30) 三、BE-A16C (35) 四、BE-808BDC-M (43) 部分成功案例 (51)
概述 如何解决公司车辆及公司所属运输车辆在日常运营时的安全问题,是目前多数企业急需解决的社会问题。网络通信技术以及GPS 定位技术的发展使得建立这样的系统变成可能。通过对车辆的实时定位追踪,随时掌握车辆的实际位置和运动趋势,通过挂载的2G/3G 拍照摄像头,通过定时或实时拍摄动作,将车辆运输期间的实时的图片传输到平台及操作平台上,了解车辆的实时情况,必要时采取断油锁车,可以最大限度地减少车辆或企业的损失。 某运输服务有限公司隶属于某电子有限公司,公司由多家子公司组成,分别是某电子有限公司,某公司,某运输服务有限公司,某电子有限公司,某某卡服务有限公司,某电子有限公司深圳分公司,某某分公司,某某分公司及驻各省市办事处。 某科技车辆智能监控管理运营平台系统采用GPRS永远在线、固定时间连续定位、服务器数据连续存储记录方式实现对营运过程的车速、位置进行全程实时监控和记录,通过公司的3G通信定位终端,用户选择安装多个远程摄像头拍摄现场照片并本地录像。 管理人员在自己的计算机上安装一个客户端软件可以对车辆进行实时定位、追踪、下发语音提示、拍照等操作,还可以接受各种报警数据,生成报警报表,从而做到预防为主,最大限度地减少在车辆安全、调度管理过程中出现超速违章、公车私用的概率,实现安全行车、降低成本的双重管理目标。
高级内存代码注入技术
高级内存代码注入技术 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 9 10 11 /*获取进程模块镜像*/ 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。当我们将代码注入到其他进程中时,新的基地址将产生在虚拟地址中不可预测的位置。