2024进程注入技术手册.docx
进程注入技术手册目录D1.1.注入经典D1.1.注入注入方法例子反射D1.1.注实现方法例子SheIleOde反射D1.1.注入(sRDl)PE注入在远程进程中执行Shellcode没有VirtUalAIIOCEXRWX的AddreSSOfEntryPOint代码注入注入方法DemoPROCESSHO1.1.OWING(RunPE)注入方法ProcessDoppelganging注入方法线程执行劫持注入方法完整DnIeO例子从PE资源加教和执行Shellcode注入方法DemoAPC队列代码注入注入方法DemoAPC队列代码注入变种SetWindowHookEx注入DemoNtCreateSection+NtMapViewfSection代码注入注入方法DemoModuleStomping注入方法DenIo案例分享后记进程注入是一种常用来绕过总端安全软件和蓝队排查的手法,在无文件落地和恶意软件攻击中的都是常用的手法。在另一个进程的地址空间内运行自定义代码。进程注入提高了隐身性,一些技术还实现了持久性。D1.1.注入经典D1.1.注入通过创建者远程线程和加载库的D1.1.注入是把ShHICOde注入另一个进程的常用技术在攻击中我们可以将其恶意动态链接库(D1.1.)的路径写入另一个进程的虚拟地址空间中,并通过在目标进程中创建远程线程来确保远程进程加载它。D1.1.注入是将代码注入至卜个远程进程中,并让远程进程调用1.oad1.ibrary()函数从而强制远程进程加载一个D1.1.程序到进程中。而当D1.1.被加载时就会运行D1.1.中的DllMain()函数,所以就会为代码执行提供机会,而因为D1.1.本身是由感染后的进程加载的同时PE文件也并没有对系统进行过多的敏感操作所以这种技术具有相当强的一种隐蔽性。C1.ASSICD1.1.INJECTIONTARGETPROCESSMA1.WAREPROCESSSinwinouc<2-DISKSPACEENDGAME.注入方法1.指定一个目标进程,例如SVChoSt.exe。常用方法:CreateToolhelp32Snapshot是用于枚举指定进程或所有进程的堆或模块状态的APl,它返回-个快照一PrOCeSS32FirSt检索有关快照中第一个进程的信息然后在循环中使用ProCeSS32NeXt遍历它们找到目标进程后,通过调用OPenProCeSS获取目标进程的句柄例子intmain(itargc,char*argv)HAND1.EprocessHadle;PVOIDremoteBuffer;wcharjdllPath=TEXT(',Cevilm64.dl);printf(',lnjectingD1.1.toPID:%in",atoi(argv1);ProcessHandIe=OpenProcess(PROCESS_A1.1._ACCESS,FA1.SE,DWORD(atoi(argv1);remoteBuffer=VirtualAllocEx(processHandle,NU1.1.,sizeofdllPath,MEM_COMMIT,PAGE_READWRITE);WriteProcessMemory(processHandle,remoteBuffer,(1.PVOID)dllPath,SizeofdIIPath,NU1.1.);PTHREAD_START_ROUTINEthreatStartRoutineAddress=(PTHREAD-START-ROTINE)GetProcAddress(GetModuleHandle(TEXT(',Kernel32,')j"1.oad1.ibraryW");CreateRemoteThread(processHandle,NU1.1.,O,threatStartRoutineAddress,remoteBuffer,O,NU1.1.);CloseHandIe(ProcessHandIe);returnO;反射D1.1.注入反射D1.1.注入是一种库注入技术,其中采用反射编程的概念来将库从内存加载到主机进程中常规的D1.1.注入方式相信大家都很熟悉了,禾睨CreateRemOteThread这一函数在目标进程中开始一个新的线程,这个线程执行系统的APl函数1.Oad1.ibrary,之后D1.1.就被装载到目标进程中了。常规的注入方式太过于套路化(CreateRemOteThread+1.oad1.ibrary)导致它十分容易被检测出来。同时常规的D1.1.注入方式还需要目标D1.1.必须存在磁盘上,而文件一旦落地就也存在着被杀毒软件查杀的险。实现方法要实现反射式注入D1.1.我们需要两个部分,注射器和被注入的D1.1.。其中,被注入的D1.1.除了需要导出一个函数RefleCtiVe1.oader来实现对自身的加载之外其余部分可以正常编写源代码以及编译。而注射器部分只需要将被注入的D1.1.文件写入到目标进程,然后将控制权转交给这个RefieCtiVe1.Oader即可。1 .使用RWX权限打开目标进程并为D1.1.分配足够大的内存2 .将D1.1.复制到分配的内存空间中3 .计算D1.1.内的内存偏移量到用于进行反射加载的导出4,使用反射加载器函数的偏移地址作为人口点,调用CreateRemoteThread(或等效的未记录的APl函数,如RtcreateUSerThread)以在远程进程中开始执行5,反射加载器函数使用适当的CPU寄存器查找目标进程的进程环境块(PEB)并使用它来查找内存kernel32.dll和任何其他所需库的地址6 .解析kernel32的exports目录,找至U需要的APl函数如1.oad1.ibraryAGetPrOCAddreSS的内存地址VirtUalAilOC7 .然后使用这些函数将D1.1.(本身)正确加载到内存中并调用其人口点DIIMain更多技术细节:https:/www.ired.team/offensive-security/code-injection-process-injection/reflective-dll-injectionblogs.eom/lsgxeva/p/12923419.html例子把D1.1.注入指定进程弹出MeSSageBoXRcmmutl>ivalwMr*N!M.11hM>ln4ta如果要加载ShelICOd6在dll中定义就行POC:WOTWWOWS!MeCMyMMSUrtoeUaR2nVll11>WMMCRMMShellCode反射D1.1.注入(sRDI)Shellcode反射D1.1.注入(sRDI)是一种技术,它允许将给定的D1.1.转换为位置无关的shellcode,然后可以使用任意ShelICode注入和执行技术注入该ShelICod&相对于标准RDI使用SRDI的一些优点:可以转换任何D1.1.为无位置依赖的ShelICode并且可以使用标准的ShellCode注入技术来使用它。1.1.中不需要写任何反射加载器代码,因为反射加载器是在D1.1.外部的ShellCOde中实现的。合理使用权限,没有大量的RWX权限数据。还可以根据选项,抹掉PE头特征。SRDl的所有功能基于以下两个组件:-个C语言项目,可将PE1.oader编译为Shellcode转换代码负责将D1.1.、RDI和用户数据进行绑定由以下文件组成:SheIIcodeRDI:编译D1.1.加载器的ShellcodeNative1.oader:需要时,将D1.1.转换为shellcode然后注入内存DotNet1.oader:Native1.oader的C#实现pythonConvertToSheIIcode.Py:将D1.1.转换为shellcodePythonEncodeBIobs.py:对已编译的SRDI进行编码,进行静态嵌入PowerSheIIConvertTo-Shellcode.ps!:将D1.1.转换为ShellCodeFunctionTest:导入sRDI的C函数进行调试测试TestD1.1.:示例D1.1.,包括两个导出函数,用于后续的加载和调用D1.1.不需要使用RDI进行编译,但是该技术具有交叉兼容性。POWerShelI导入194PSC:Uers111eDesktop½fiASM)XjA%R0I-masterslU)I-MaiterPcwerSe1)>Import-Module.COnvertTo-Shel!code.pla编写D1.1.DemoCrmtvFroeMiA(N1.1,'<)*ftot*pd.et<*MIX,SIUVTBl40.UaaMIX.i.a);*tcIulr*nn.trrail)caseQ1.1.PffXXSSAnACH:liessae8oxACHIX4vD1.Dbin!*.*le'etartd.*0);CreatePlrocesaA(SI1.1.*(1.PSTR>*Bot<>d.eeMU_M_1.1.TRIE0.MUwMI1.,ivpi);br:CMeBUnMAlMTTAaI:CM*Otln*EDDT!:caseB1.1.PfOOSSDCTACM:break;CamwrtTo-SkwIl<odvC:Ut<rlll<DvktapMV将D1.1.转换为shellcode.默认为一个以十进制值表示的shellcode字节数组:TC:UerUl«D9ktcJftlliAXSMITiiAMBMmtirMIImt9rF0wrrSh9ll>al(tUItDIV1RDl-Mtter0etMMTestDII«11方便后面利用,我们转化为16进制把ShelICOde保存转为C的SheIlCOdeMtav<MMr-o一三r=三三il三三三三三三1三三:T三三,三,s:一三三三三三三H,7三三总三三2三三三三=三:=H三'.H三三H三k一三三三三三-三-s.=s:»s:£I三三=三si三三三w三三三三H三M三s三三三Is'三i三三-三E三三三三三三:H三:三S然后使用其他手法加载就行。PE注入将其SheIICode复制到现有的打开进程中并使其执行(例如:调用CreateRemoteThread).PE注入相对于1.oad1.ibrary技术的优势之一是我们不必在磁盘上放置D1.1.与D1.1.注入类似在目标进程(例如VirtUalAlloCEX)中分配内存然后使用WritePro