一种用于实现跨进程注入的方法技术

技术编号:36080653 阅读:48 留言:0更新日期:2022-12-24 10:54
本发明专利技术提供了一种用于实现跨进程注入的方法,属于网络技术领域。方法包括:将注入进程打开,使DLL写入被注入进程,然后再被注入进程中定位DLL文件在其内存中的基址;从被注入进程的核心DLL文件中获取所需的系统API;在被注入进程的内存中分配一片用来装载DLL的空间,在分配的相应内存空间内复制DLL文件的头部和各个节;处理DLL的导入表,对DLL进行重定位;调用DLL入口点。本发明专利技术的方法能绕过安全产品的有效拦截,文件不需要落地,直接在内存中运行,减少被拦截的风险。减少被拦截的风险。减少被拦截的风险。

【技术实现步骤摘要】
一种用于实现跨进程注入的方法


[0001]本专利技术属于网络
,特别涉及一种用于实现跨进程注入的方法。

技术介绍

[0002]跨进程横向移动是恶意软件中非常常见的一种技术,以便在系统间进行传播。常规的进程注入技术使用LoadLibraryA()函数来使被注入进程加载指定的dll。常规注入手段如下:
[0003]1)通过调用CreateRemoteThread()/NtCreateThread()/RtlCreateUserThread()函数在被注入进程创建线程进行dll注入。
[0004]2)通过调用QueueUserAPC()/SetThreadContext()函数来劫持被注入进程已存在的线程加载dll。
[0005]3)通过调用SetWindowsHookEx()函数来设置拦截事件,在发生对应的事件时,被注入进程执行拦截事件函数加载dll。
[0006]常规dll注入的方式一个致命的缺陷是需要恶意的dll以文件的形式存储在受害者主机上。这样使得常规dll注入技术在受害者主机上留下痕迹较大,很容易被edr等安全产品检测到。

技术实现思路

[0007]有鉴于此,本专利技术的主要目的是提出一种用于实现跨进程注入的方法。本专利技术通过将功能函数注入到高可信进程,绕过防病毒软件的监控,从而提高注入成功率。
[0008]为解决上述技术问题,本专利技术所采用的技术方案是:一种用于实现跨进程注入的方法,所述方法包括:将注入进程打开,使DLL写入被注入进程,然后再被注入进程中定位DLL文件在其内存中的基址;从被注入进程的核心DLL文件中获取所需的系统API;在被注入进程的内存中分配一片用来装载DLL的空间,在分配的相应内存空间内复制DLL文件的头部和各个节;处理DLL的导入表,对DLL进行重定位;调用DLL入口点。
[0009]可选地,所述基址采用重定位方法获得:ULONG_PTRcaller(VOID){return(ULONG_PTR)_ReturnAddress();}
[0010]其中函数_ReturnAddress()返回的是当前调用函数的返回地址,也就是caller()的下一条指令的地址,通过找到的返回地址,逐字节的向上遍历,当查找到符合PE格式的文件头之后,判断为找到了DLL文件在内存中的地址。
[0011]可选地,所述API函数为kernel32.dll中的LoadLibraryA(),GetProcAddress(),VirtualAlloc()以及ntdll.dll中的NtFlushInstructionCache()函数,借助PEB来查找kernel32.dll和ntdll.dll在内存中的位置。PEB为ProcessEnvironment Block的缩写。
[0012]可选地,所述分配一片用来装载DLL的空间包括:采用函数VirtualAlloc(),分配一片更大的内存空间用于加载DLL,通过在PE头中的IMAGE_OPTIONAL_HEADER结构体中的SizeOfImage成员记载DLL被装载后的大小。
[0013]可选地,所述DLL文件的头部通过进程注入程序复制,所述各个节根据PE文件的节表复制到相应位置中。
[0014]可选地,所述DLL文件的头部包括DOS文件头、DOS插桩代码和PE文件头。
[0015]可选地,装载被注入DLL所依赖的其他DLL,并修改被注入DLL的导入表,所述PE文件的导入表是一个元素为IMAGE_IMPORT_DESCRIPTOR的数组,每一个被依赖的DLL都对应着数组中的一个元素。
[0016]与现有技术相比,本专利技术具有以下优点:
[0017]无需利用CreateRemoteThread这一函数在目标进程中开始一个新的线程,从而避免执行API函数LoadLibrary,因此能够绕开安全产品对此监控,实现无文件攻击。
附图说明
[0018]图1为本专利技术用于实现跨进程注入的方法的流程图;
具体实施方式
[0019]以下是本专利技术的具体实施例并结合附图,对本专利技术的技术方案作进一步的描述,但本专利技术并不限于这些实施例。
[0020]结合图1具体地说,首选选定注入进程,然后打开进程,使其中所携带的功能函数写入被注入进程。如果写入失败,则退出;如果写入成功,则执行以下步骤:
[0021]首先申请可读、可写内存:
[0022]第一步,先定位DLL文件在内存中的基址。本事实例中利用重定位技巧找到DLL自身所在的大致位置:ULONG_PTRcaller(VOID){return(ULONG_PTR)_ReturnAddress();}
[0023]其中函数_ReturnAddress()返回的是当前调用函数的返回地址,也就是caller()的下一条指令的地址。这个地址位于ReflectiveLoader的内部,而ReflectiveLoader位于被注入的DLL文件内部,因此这个地址离DLL文件的头部不远了。
[0024]借助找到的地址,通过逐字节的向上遍历,当查找到符合PE格式的文件头之后,就可以认为找到了DLL文件在内存中的地址。
[0025]第二步,获取所需的系统API。注入软件启动时,被注入进程已在正常的运行状态中了,此时被注入进程已经装载了一些核心的DLL文件。通过搜索这些DLL文件,查找需要的API函数,为后续操作提供方便。具体地,所需要的函数是kernel32.dll中的LoadLibraryA(),GetProcAddress(),VirtualAlloc()以及ntdll.dll中的NtFlushInstructionCache()函数,我们借助PEB来查找kernel32.dll和ntdll.dll在内存中的位置。
[0026]第三步,分配一片用来装载DLL的空间。
[0027]DLL文件已经在进程内存中了,但是要装载这个DLL,还需要更大的空间。借助在第二步得到的函数VirtualAlloc()分配一片更大的内存空间用于加载DLL。DLL被装载后的大小由PE头文件中的IMAGE_OPTIONAL_HEADER结构体中的SizeOfImage成员记载。
[0028]其次,读取DLL文件到内存。
[0029]在此过程中,复制PE文件头和各个节。具体为:分配用于装载的空间后,进程注入程序将DLL文件的头部复制到新的空间的首部。再根据PE文件的节表将各个节复制到相应的位置中。DLL文件的头部包括DOS文件头、DOS插桩代码和PE文件头。
[0030]接着,处理DLL的引入表,并对DLL进行重定位。
[0031]由于被注入的DLL可能还依赖于其他的DLL,因此还需要装载这些被依赖的DLL,并修改本DLL的导入表,使这些被引入的函数能正常运行。
[0032]PE文件的导入表是一个元素为IMAGE_IMPORT_DESCRIPTOR的数组。每一个被依赖的DLL都对本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种用于实现跨进程注入的方法,所述方法包括:将注入进程打开,使DLL写入被注入进程,然后再被注入进程中定位DLL文件在其内存中的基址;从被注入进程的核心DLL文件中获取所需的系统API函数;在被注入进程的内存中分配一片用来装载DLL的空间,在分配的相应内存空间内复制DLL文件的头部和各个节;处理DLL的导入表,对DLL进行重定位;调用DLL入口点。2.根据权利要求1所述的一种用于实现跨进程注入的方法,其特征在于,所述基址采用重定位方法获得:ULONG_PTR caller(VOID){return(ULONG_PTR)_ReturnAddress();}其中函数_ReturnAddress()返回的是当前调用函数的返回地址,也就是caller()的下一条指令的地址,通过找到的返回地址,逐字节的向上遍历,当查找到符合PE文件头之后,判断为找到了DLL文件在内存中的地址。3.根据权利要求1或2所述的一种用于实现跨进程注入的方法,其特征在于,所述API函数为kernel32.dll中的LoadLibraryA(),GetProcAddress(),VirtualAlloc()以及ntdll.dll中的NtFlushInstruc...

【专利技术属性】
技术研发人员:刘庆林
申请(专利权)人:山东中睿天下信息技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1