一种远程注入代码的方法及系统与流程

文档序号:12363214阅读:340来源:国知局

背景技术
::远程代码注入是指一个进程在另一个进程中创建线程的技术,其目的是为了实现在另一个进程(即目标进程)中运行所希望运行的代码。在目标进程中被创建的线程为远程线程,因为不在同一个进程中,所以叫做远程线程。例如,在Windows操作系统上,将要注入的代码放到一个新创建的动态链接库DLL(DynamicLinkLibrary)文件中,然后通过调用Windows操作系统的应用编程接口API(ApplicationProgramInterface)CreateRemoteThread创建远程线程函数,或者SetWindowHook设置全局钩子函数将该创建的DLL文件加载到目标进程中得以执行。远程代码注入可以用来调试程序,另外,在网络直播领域,远程代码注入也具有广泛的应用前景。但是上述方法仅仅只能用于具有Windows操作系统的客户端,而不能用在具有MacOSX操作系统的客户端上。技术实现要素:针对现有技术中存在的缺陷,本发明的主要目的在于提供一种远程注入代码的方法,本发明的另一目的在于提供一种远程注入代码的系统,实现了在MacOSX操作系统上,通过远程线程的方式将一段可执行代码注入到目标进程中执行,从而实现预定的目的。本发明提供一种远程注入代码的方法,用于在MacOSX操作系统的目标进程中创建远程线程,包括步骤:S1.获取目标进程的任务端口;S2.在目标进程中分配远程线程的堆栈空间和代码空间,将远程线程的代码写入所述代码空间,并设置所述代码空间的属性;S3.在目标进程中创建远程线程。在上述技术方案的基础上,步骤S1具体包括:获取MacOSX操作系统的Root权限;调用MacOSX操作系统的应用编程接口task_for_pid函数获取目标进程的任务端口。在上述技术方案的基础上,步骤S2具体包括:调用MacOSX操作系统的应用编程接口vm_allocate函数,分别分配堆栈空间和代码空间;调用MacOSX操作系统的应用编程接口vm_write函数,将远程线程的代码写入所述代码空间;调用MacOSX操作系统的应用编程接口vm_protect函数,将所述代码空间的属性设置为可执行。在上述技术方案的基础上,步骤S3具体包括:调用MacOSX操作系统的应用编程接口thread_create_running函数,通过设置目标进程的任务端口和x86_thread_state64_t结构体中的变量,在目标进程中创建远程线程。在上述技术方案的基础上,所述远程线程的代码为可执行的线程函数,所述线程函数包括第一参数和第二参数;x86_thread_state64_t结构体中的变量包括远程线程的起始地址、远程线程的堆栈起始地址、第一起始变量和第二起始变量;设置x86_thread_state64_t结构体中的变量具体包括:所述远程线程的起始地址为所述代码空间的起始地址;所述远程线程的堆栈起始地址为所述堆栈空间的起始地址;所述第一起始变量为所述第一参数;所述第二起始变量为所述第二参数。在上述技术方案的基础上,所述方法还包括:S4.调用Pthread应用编程接口_pthread_set_self函数,将创建的所述远程线程初始化为Pthread线程。本发明还提供一种远程注入代码的系统,包括:预设模块,用于获取MacOSX操作系统的目标进程的任务端口,并在目标进程中分配远程线程的堆栈空间和代码空间,将远程线程的代码写入所述代码空间,以及设置所述代码空间的属性;创建模块,用于使用MacOSX操作系统的应用编程接口在目标进程中创建远程线程。在上述技术方案的基础上,预设模块获取MacOSX操作系统的Root权限,并调用MacOSX操作系统的多个应用编程接口,所述应用编程接口包括task_for_pid、vm_allocate、vm_write和vm_protect函数;task_for_pid函数用于获取目标进程的任务端口;vm_allocate函数用于分别分配堆栈空间和代码空间;vm_write函数用于将远程线程的代码写入所述代码空间;vm_protect函数用于将所述代码空间的属性设置为可读、可写和可执行。在上述技术方案的基础上,创建模块调用MacOSX操作系统的应用编程接口thread_create_running函数,通过设置目标进程的任务端口和x86_thread_state64_t结构体中的变量,在目标进程中创建远程线程。在上述技术方案的基础上,所述系统还包括初始化模块,所述初始化模块用于调用Pthread应用编程接口_pthread_set_self函数,将创建的远程线程初始化为Pthread线程。与现有技术相比,本发明的优点如下:(1)本发明通过在目标进程中创建远程线程,实现了在MacOSX操作系统上,通过远程线程的方式将一段可执行代码注入到目标进程中执行,从而实现预定的目的。(2)本发明充分利用MacOSX操作系统的应用编程接口实现MacOSX操作系统上的远程代码注入,远程注入代码与MacOSX操作系统的兼容性好,确保远程线程的运行稳定,可靠性好。(3)本发明将创建的远程线程初始化为Pthread线程,确保远程线程能够调用任何MacOSX操作系统的应用编程接口。附图说明图1是本发明的一个实施例远程注入代码的方法的流程图;图2是本发明的另一个实施例远程注入代码的方法的流程图;图3是本发明实施例远程注入代码的系统的示意图。附图标记:预设模块1,创建模块2,初始化模块3。具体实施方式术语说明:Mach内核:MacOSX系统内核的核心是XNU,而XNU的核心是Mach内核。Mach内核的特点在于通过传递消息的方式实现对象和对象之间的通信,一个Mach对象(源对象)不能调用另一个对象(目标对象),源对象向目标对象发送一条消息后,这条消息被加入到目标对象的队列中等待处理。而在其他架构中,一个对象通过一个已知的接口访问另一个对象。Mach端口:用来传递消息的端点叫做Mach端口,Mach端口是一个32位整型的标识符。消息从某个端口发送到另一个端口,每一个端口都可以接收任一个消息,但是任一个消息只能有一个指定的端口接收。Mach线程:Mach线程定义了Mach内核中最小的执行单元。线程是程序执行流的最小单元。一个标准的线程由线程ID、当前指令指针、寄存器集合和堆栈组成。创建Mach线程的应用编程接口为thread_create_running函数,用于在指定的任务端口创建一个Mach线程。进程是计算机中的程序关于某数据集合的一次运行活动,是系统进行资源分配的基本单位,也是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。Mach虚拟内存:为了能够在目标进程中运行线程的代码,必须在目标进程中开辟内存空间以供线程运行和管理。其中,Mach内核的一些应用编程接口可以完成虚拟内存的分配、虚拟内存的写操作以及虚拟内存的页面保护属性。这些应用编程接口包括:vm_allocate、vm_write和vm_protect函数。vm_allocate函数用于在指定的任务端口进程中分配一个内存空间,vm_write函数用于将数据写入到创建的内存空间中,vm_protect函数用于将创建的内存空间设置成相应的属性,这些属性包括可读、可写和可执行属性。任务:任务是一种容器对象,虚拟内存空间和其他资源都是通过这个容器对象管理的。这些资源包括设备和其他句柄,并进一步被抽象为端口。因此资源的共享实际上相当于允许对对应端口进行访问。其中,应用编程接口mach_task_self函数用于获取当前进程的任务端口,task_for_pid函数用于获取目标进程的任务端口。POSIX:POSIX(PortableOperatingSystemInterface)表示可移植操作系统接口标准,该标准定义了操作系统应该为应用程序提供的接口标准,是电气和电子工程师协会IEEE(InstituteofElectricalandElectronicsEngineers)为在各种UNIX操作系统上运行的应用程序而定义的一系列应用编程接口标准的总称。Pthread:Pthread是POSIX线程的简称,是线程的POSIX标准。在类Unix操作系统(MacOSX和Linux等)中,都使用Pthread作为操作系统的线程。其中,Pthread应用编程接口_pthread_set_self函数用于将一个mach线程和Pthread线程绑定。下面结合附图及具体实施例对本发明作进一步的详细描述。MacOSX上可以运行32位和64位的应用程序,目前,64位应用程序已成为主流,所以本实施例以64位应用程序中将代码注入到目标进程中执行为例进行说明。参见图1所示,本发明实施例一种远程注入代码的方法,用于在MacOSX操作系统的目标进程中创建远程线程,包括步骤:S1.获取目标进程的任务端口。步骤S1具体包括:获取MacOSX操作系统的Root权限。调用MacOSX操作系统的应用编程接口task_for_pid函数获取目标进程的任务端口。要想把远程线程的代码注入到目标进程中,必须首先获取该目标进程的任务端口,类似地,在Windows操作系统上,必须获取目标进程的句柄。此步骤主要是调用task_for_pid函数以获取目标进程的任务端口,并将任务端口标记为remoteTask。在调用task_for_pid函数前,必须先获取MacOSX操作系统的Root权限,否则task_for_pid函数会返回失败。获取的任务端口供下面的步骤使用,如果失败则不能往下执行,并返回失败结果。S2.在目标进程中分配远程线程的堆栈空间和代码空间,将远程线程的代码写入代码空间,并设置代码空间的属性。步骤S2具体包括:调用MacOSX操作系统的应用编程接口vm_allocate函数,分别分配堆栈空间和代码空间。调用MacOSX操作系统的应用编程接口vm_write函数,将远程线程的代码写入代码空间。调用MacOSX操作系统的应用编程接口vm_protect函数,将代码空间的属性设置为可执行。运行远程线程的代码需要有相应的堆栈空间,所以在目标进程中创建远程线程之前,需要准备好远程线程的堆栈空间。调用Mach虚拟内存应用编程接口vm_allocate函数,在目标进程中分配内存来初始化远程线程的堆栈空间,将分配的堆栈空间标记为pStackContext。在目标进程中分配好远程线程的堆栈空间pStackContext后,需要将远程线程的二进制代码复制到堆栈空间pStackContext中,使其成为目标进程中的线程函数。具体方法为:调用vm_allocate函数在目标进程中分配一块代码空间,标记为pThreadFunc,然后调用vm_write函数,将要注入的线程的代码复制到pThreadFunc中,使其成为目标进程中的线程函数。然后调用vm_protect函数,将代码空间pThreadFunc的属性设置为可执行,这样,存储在代码空间pThreadFunc里的远程线程的代码可以被执行。S3.在目标进程中创建远程线程。步骤S3具体包括:调用MacOSX操作系统的应用编程接口thread_create_running函数,通过设置目标进程的任务端口和x86_thread_state64_t结构体中的变量,在目标进程中创建远程线程。远程线程的代码为可执行的线程函数,线程函数包括第一参数和第二参数。x86_thread_state64_t结构体中的变量包括远程线程的起始地址、远程线程的堆栈起始地址、第一起始变量和第二起始变量。设置x86_thread_state64_t结构体中的变量具体包括:远程线程的起始地址为代码空间的起始地址。远程线程的堆栈起始地址为堆栈空间的起始地址。第一起始变量为第一参数。第二起始变量为第二参数。步骤S1和S2已经为在目标进程中创建远程线程做好了准备,接下来要在目标进程中创建远程线程。调用应用编程接口thread_create_running函数时,thread_create_running函数的执行需要步骤S1和S2中获得的任务端口remoteTask、堆栈空间pStackContext和存储在代码空间pThreadFunc中的线程函数。同时需要初始化x86_thread_state64_t结构体的参数,x86_thread_state64_t结构体代表了一组寄存器值,用来创建远程线程。下面对x86_thread_state64_t结构体中的几个字段进行解释:_rip:用于表示远程线程的起始地址,将代码空间pThreadFunc的起始地址赋值给_rip,使创建的远程线程从代码空间pThreadFunc的起始地址开始执行。_rsp:用于表示远程线程的堆栈起始地址,将堆栈空间pStackContext的起始地址赋值给_rsp,从而初始化远程线程的堆栈环境。_rdi:表示第一起始变量,用于传递线程函数的第一个参数。_rsi:表示第二起始变量,用于传递线程函数的第二个参数。通过正确设置x86_thread_state64_t结构体中相应的寄存器的值后,调用thread_create_running就创建了一个远程线程。通过步骤S1至S3,已经成功地在一个目标进程中创建一个远程线程。本发明通过在目标进程中创建远程线程,实现了在MacOSX操作系统上,通过远程线程的方式将一段可执行代码注入到目标进程中执行,从而实现预定的目的。本发明充分利用MacOSX操作系统的应用编程接口实现MacOSX操作系统上的远程代码注入,远程注入代码与MacOSX操作系统的兼容性好,确保远程线程的运行稳定,可靠性好。参见图2所示,本发明的另一个实施例为:S1.获取目标进程的任务端口。步骤S1具体包括:获取MacOSX操作系统的Root权限。调用MacOSX操作系统的应用编程接口task_for_pid函数获取目标进程的任务端口。S2.在目标进程中分配远程线程的堆栈空间和代码空间,将远程线程的代码写入代码空间,并设置代码空间的属性。步骤S2具体包括:调用MacOSX操作系统的应用编程接口vm_allocate函数,分别分配堆栈空间和代码空间。调用MacOSX操作系统的应用编程接口vm_write函数,将远程线程的代码写入代码空间。调用MacOSX操作系统的应用编程接口vm_protect函数,将代码空间的属性设置为可执行。S3.在目标进程中创建远程线程。步骤S3具体包括:调用MacOSX操作系统的应用编程接口thread_create_running函数,通过设置目标进程的任务端口和x86_thread_state64_t结构体中的变量,在目标进程中创建远程线程。远程线程的代码为可执行的线程函数,线程函数包括第一参数和第二参数。x86_thread_state64_t结构体中的变量包括远程线程的起始地址、远程线程的堆栈起始地址、第一起始变量和第二起始变量。设置x86_thread_state64_t结构体中的变量具体包括:远程线程的起始地址为代码空间的起始地址。远程线程的堆栈起始地址为堆栈空间的起始地址。第一起始变量为第一参数。第二起始变量为第二参数。S4.调用Pthread应用编程接口_pthread_set_self函数,将创建的远程线程初始化为Pthread线程。通过步骤S1至S3,已经成功地在一个目标进程中创建一个远程线程,如果在远程线程中不调用任何的MacOSX操作系统的应用编程接口,步骤S4可以省略,但是如果在线程函数中,调用了任何的MacOSX操作系统的应用编程接口,例如,printf和sleep函数等,步骤S4就非常重要,没有步骤S4会导致目标进程的崩溃。创建的远程线程需要初始化为一个Pthread线程,才能调用MacOSX操作系统的应用编程接口。具体方法为:调用_pthread_set_self函数,将一个Mach线程初始化为一个Pthread线程,这样就可以调用MacOSX操作系统的应用编程接口,从而在目标进程中实现某些特定的功能。本发明将创建的远程线程初始化为Pthread线程,确保远程线程能够调用任何MacOSX操作系统的应用编程接口。通过本方法,可以在MacOSX系统上,通过创建Mach远程线程的方式,将一段可执行的代码注入到目标进程中执行,从而实现预定的目的。例如,上述方法和系统用于斗鱼TV直播伴侣的Mac版本中,用于游戏源图像的获取,从而实现游戏直播目标。参见图3所示,本发明还提供一种远程注入代码的系统,包括预设模块1、创建模块2和初始化模块3。预设模块1,用于获取MacOSX操作系统的目标进程的任务端口,并在目标进程中分配远程线程的堆栈空间和代码空间,将远程线程的代码写入代码空间,以及设置代码空间的属性;预设模块1获取MacOSX操作系统的Root权限,并调用MacOSX操作系统的多个应用编程接口,应用编程接口包括task_for_pid、vm_allocate、vm_write和vm_protect函数。task_for_pid函数用于获取目标进程的任务端口。vm_allocate函数用于分别分配堆栈空间和代码空间。vm_write函数用于将远程线程的代码写入代码空间。vm_protect函数用于将代码空间的属性设置为可读、可写和可执行。创建模块2,用于使用MacOSX操作系统的应用编程接口在目标进程中创建远程线程。创建模块2调用MacOSX操作系统的应用编程接口thread_create_running函数,通过设置目标进程的任务端口和x86_thread_state64_t结构体中的变量,在目标进程中创建远程线程。本发明通过在目标进程中创建远程线程,实现了在MacOSX操作系统上,通过远程线程的方式将一段可执行代码注入到目标进程中执行,从而实现预定的目的。本发明充分利用MacOSX操作系统的应用编程接口实现MacOSX操作系统上的远程代码注入,远程注入代码与MacOSX操作系统的兼容性好,确保远程线程的运行稳定,可靠性好。初始化模块3,用于调用Pthread应用编程接口_pthread_set_self函数,将创建的远程线程初始化为Pthread线程。通过本系统,可以在MacOSX系统上,通过创建Mach远程线程的方式,将一段可执行的代码注入到目标进程中执行,从而实现预定的目的。例如,上述方法和系统用于斗鱼TV直播伴侣的Mac版本中,用于游戏源图像的获取,从而实现游戏直播目标。本发明将创建的远程线程初始化为Pthread线程,确保远程线程能够调用任何MacOSX操作系统的应用编程接口。本发明不局限于上述实施方式,对于本
技术领域
:的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1