沙箱进程启动后驱动获取了进程启动信息,通知到svc进程。
svc进程执行Inject_low。
首先在目标进程中申请一个空间,地址remote_addr,长度lowdata的长度,将LowData放进去。这个数据是一个dll,工程是LowLevel,作为资源放在svc中,在注入前已经释放出来。
申请的空间中的数据如图entry.asm。
申请数据分成两部分,一部分是.text执行代码,一部分是.zzzz。
其中.zzzz包含两个指针,一个是_Start,指向了运行代码的位置,这个很关键,这是程序的入口位置。
另一个指向SBIEOW_DATA。
这个结构是Inject_low要做的一个重要工作:填充该结构中的数据。这个结构会被entry.asm使用来进行初始化。
要填充这个数据,需要知道这个数据的位置,方法就是采用.zzzz的数据节(section)。找到这个节之后,就找到了这个数据相对于remote_addr的位置。
填充lowdata数据包括:LdrInitializeThunk_tramp,api_device_handle,syscall_data,NtDelayExecution_code
LdrInitializeThunk_tramp 最初是从目标进程中拷贝的。( void *remote_addr = InjectLow_CopyCode(hProcess,