创建一个新进程并将DLL加载到其中。根据目标进程选择适当的32位或64位DLL。
替换DetourCreateProcessWithDll。
BOOL DetourCreateProcessWithDllEx(_In_opt_ LPCTSTR lpApplicationName, _Inout_opt_ LPTSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _in_dword dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCTSTR lpCurrentDirectory, _in_lpstartupinfo,_Out_ LPPROCESS_INFORMATION lpProcessInformation, _In_ LPCSTR lpDllName, _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);
lpApplicationName:为CreateProcess API定义的应用程序名称。
lpCommandLine: CreateProcess API定义的命令行。
lpProcessAttributes:为CreateProcess API定义的流程属性。
lpThreadAttributes:为CreateProcess API定义的线程属性。
bInheritHandles:继承CreateProcess API定义的句柄标志。
dwCreationFlags:为CreateProcess API定义的创建标志。
lpEnvironment:为CreateProcess API定义的进程环境变量。
lpCurrentDirectory:为CreateProcess API定义的进程当前目录。
lpStartupInfo:为CreateProcess API定义的进程启动信息。
lpProcessInformation:为CreateProcess API定义的进程句柄信息。
lpDllName:要插入到新进程的DLL的路径名。要同时支持32位和64位应用程序,如果DLL包含32位代码,则DLL名称应该以"32"结尾,如果DLL包含64位代码,则应该以"64"结尾。如果目标进程与父进程大小不同,Detours将自动将路径名中的“32”替换为“64”或“64”替换为“32”。
pfCreateProcessW:指向特定程序的CreateProcess API替换的指针,如果应该使用标准的CreateProcess API创建新进程,则为NULL。
如果创建了新进程,则返回TRUE;否则返回FALSE。
请参阅CreateProcess返回的错误代码。
DetourCreateProcessWithDllEx创建一个新进程,并将指定的DLL插入其中。
进程以挂起状态创建,并将CREATE_SUSPENDED标志设置为CreateProcess。然后,Detours在新进程中修改应用程序二进制文件的映像,将指定的DLL作为其第一个导入。然后恢复进程中的执行。当执行恢复时,Windows进程加载器将首先加载目标DLL,然后在调用应用程序入口点之前加载应用程序导入表中的任何其他DLL。
DetourCreateProcessWithDllEx在它创建的新进程中修改目标PE二进制程序的内存导入表。更新后的导入表将包含从目标DLL导出的序号#1函数的引用。如果目标过程是32位和父进程是64位的,或如果目标过程是64位的,父进程是32位,DetourCreateProcessWithDllEx将使用rundll32.exe DLL加载到一个辅助流程相匹配的目标流程暂时以更新目标流程导入表正确的DLL。
注意:如果目标DLL不包含序号为#1的导出函数,则新进程将无法启动。
在加载目标DLL之后,它可以通过调用DetourRestoreAfterWith来逆转对内存导入表的更改。为了方便反转这些更改,DetourCreateProcessWithDllEx使用DetourCopyPayloadToProcess API将相关反转数据复制到目标流程中的有效负载中。加载的DLL应该调用DetourRestoreAfterWith API来恢复导入表的内容。
Traceapi, Tracebld, Tracemem, Tracereg, Traceser, Tryman, Withdll。
创建一个新进程并将dll加载到其中。根据目标进程选择适当的32位或64位DLL。
替换DetourCreateProcessWithDll。
BOOL DetourCreateProcessWithDlls(_In_opt_ LPCTSTR lpApplicationName, _Inout_opt_ LPTSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _in_dword dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCTSTR lpCurrentDirectory, _in_lpstartupinfo,_Out_ LPPROCESS_INFORMATION lpProcessInformation, _In_ DWORD ndls,_In_reads_(ndls) LPCSTR *rlpDlls, _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);
lpApplicationName:为CreateProcess API定义的应用程序名称。
lpCommandLine: CreateProcess API定义的命令行。
lpProcessAttributes:为CreateProcess API定义的流程属性。
lpThreadAttributes:为CreateProcess API定义的线程属性。
bInheritHandles:继承CreateProcess API定义的句柄标志。
dwCreationFlags:为CreateProcess API定义的创建标志。
lpEnvironment:为CreateProcess API定义的进程环境变量。
lpCurrentDirectory:为CreateProcess API定义的进程当前目录。
lpStartupInfo:为CreateProcess API定义的进程启动信息。
lpProcessInformation:为CreateProcess API定义的进程句柄信息。
nDlls: rlpdll中dll的数量。
rlpdll:要插入到新进程中的DLL路径名数组。要同时支持32位和64位应用程序,如果DLL包含32位代码,则DLL名称应该以"32"结尾,如果DLL包含64位代码,则应该以"64"结尾。如果目标进程与父进程大小不同,Detours将自动将路径名中的“32”替换为“64”或“64”替换为“32”。
pfCreateProcessW:指向特定程序的CreateProcess API替换的指针,如果应该使用标准的CreateProcess API创建新进程,则为NULL。
如果创建了新进程,则返回TRUE;否则返回FALSE。
请参阅CreateProcess返回的错误代码。
detourcreateprocesswithdll创建一个新进程,并将指定的DLL插入其中。
进程以挂起状态创建,并将CREATE_SUSPENDED标志设置为CreateProcess。然后,Detours在新进程中修改应用程序二进制文件的映像,将指定的DLL作为其第一个导入。然后恢复进程中的执行。当执行恢复时,Windows进程加载器将首先加载目标DLL,然后在调用应用程序入口点之前加载应用程序导入表中的任何其他DLL。
detourcreateprocesswithdll在它创建的新进程中修改目标PE二进制程序的内存导入表。更新后的导入表将包含从目标DLL导出的序号#1函数的引用。如果目标过程是32位和父进程是64位的,或如果目标过程是64位的,父进程是32位,DetourCreateProcessWithDlls将使用rundll32.exe DLL加载到一个辅助流程相匹配的目标流程暂时以更新目标流程导入表正确的DLL。
注意:如果目标DLL不包含序号为#1的导出函数,则新进程将无法启动。
在加载目标DLL之后,它可以通过调用DetourRestoreAfterWith来逆转对内存导入表的更改。为了方便逆转这些变化,detourcreateprocesswithdll使用DetourCopyPayloadToProcess API将相关逆转数据复制到目标进程的有效负载中。加载的DLL应该调用DetourRestoreAfterWith API来恢复导入表的内容。
Traceapi, Tracebld, Tracemem, Tracereg, Traceser, Tryman, Withdll。
将有效负载复制到目标进程中。
BOOL DetourCopyPayloadToProcess(_In_ HANDLE hProcess, _In_ REFGUID rguid,_In_reads_bytes_(cbData) LPCVOID pvData, _In_ DWORD cbData;
hProcess:将有效负载复制到其中的进程。
rguid:指定负载的GUID。
pvData:指向负载数据的指针。
pcbData:负载数据的字节大小。
如果有效负载已成功复制到目标进程,则返回TRUE;否则,返回FALSE。
失败时,DetourCopyPayloadToProcess将返回FALSE。扩展的错误代码信息可以通过调用GetLastError来检索。
DetourCopyPayloadToProcess使用VirtualAllocEx API在目标进程中分配了一个内存区域。然后它使用WriteProcessMemory API在目标内存中创建一个人工PE二进制模块。在人工模块中,DetourCopyPayloadToProcess使用指定的有效负载数据创建一个.detours部分。
目标进程中的代码可以通过使用detourrenumeratemodule API枚举所有模块并使用DetourFindPayload API查询每个模块来找到负载。
Tracebld WithDll。
将有效负载复制到目标进程中。
_Success_(return != NULL) PVOID DetourCopyPayloadToProcessEx( _In_ HANDLE hProcess, _In_ REFGUID rguid, _In_reads_bytes_(cbData) LPCVOID pvData, _In_ DWORD cbData );
hProcess:将有效负载复制到其中的进程。
rguid:指定负载的GUID。
pvData:指向负载数据的指针。
pcbData:负载数据的字节大小。
如果有效负载已成功复制到目标进程,则返回非空指针。
失败时,DetourCopyPayloadToProcessEx将返回NULL。扩展的错误代码信息可以通过调用GetLastError来检索。
DetourCopyPayloadToProcessEx的操作类似于DetourCopyPayloadToProcess,但返回一个指向远程进程中的有效负载的指针,因此代码可以使用ReadProcessMemory或WriteProcessMemory进一步读或写有效负载。
payloads,Tracebld WithDll。
完成从辅助进程更新目标进程。
VOID DetourFinishHelperProcess(_In_ HWND, _In_ HINSTANCE, _In_ LPSTR, _In_ INT);
当从64位父进程创建32位目标进程或从32位父进程创建64位目标进程时,DetourCreateProcessWithDllEx API必须创建一个临时helper进程。它使用rundll32.exe机制将用户提供的DLL的副本加载到helper进程中。Rundll32.exe将调用DLL的Ordinal 1导出函数。DetourFinishHelperProcess API必须设置为DLL的Ordinal 1导出函数。
在其DllMain函数中,用户提供的DLL可以通过调用DetourIsHelperProcess API来确定该进程是帮助进程还是目标进程。
有关更多信息,请参见绕行32位和64位进程。
FindFunc, Simple, Slept, Traceapi, Tracebld, Tracelnk, Tracemem, Tracereg, Traceser, Tracetcp, Tryman。
检查当前进程是辅助进程还是目标进程。
BOOL DetourIsHelperProcess(void);
如果该进程是helper进程,则返回TRUE。
如果该进程是目标进程,则返回FALSE。
当从64位父进程创建32位目标进程或从32位父进程创建64位目标进程时,DetourCreateProcessWithDllEx API必须创建一个临时helper进程。它使用rundll32.exe机制将用户提供的DLL的副本加载到helper进程中。用户提供的DLL应该在其DllMain函数中调用DetourIsHelperProcess,以确定它是被加载到helper进程还是目标进程中。
当用户提供的DLL被加载到helper进程中时,它不能绕过任何函数。相反,它不应该在DllMain中执行任何操作。用户提供的DLL还必须导出DetourFinishHelperProcess API作为其序号1导出函数。
有关更多信息,请参见绕行32位和64位进程。
FindFunc, Simple, Slept, Traceapi, Tracebld, Tracelnk, Tracemem, Tracereg, Traceser, Tracetcp, Tryman。
使用DetourCreateProcessWithDllEx或DetourCreateProcessWithDlls恢复进程启动后内存导入表中的内容。
BOOL DetourRestoreAfterWith(VOID);
如果找到了必要的有效负载并且恢复成功,则返回TRUE;否则,返回FALSE。
如果无法找到必要的有效负载或恢复导入表,该函数将设置以下错误代码之一。在函数返回后,可以通过调用GetLastError来检索错误代码。
ERROR_MOD_NOT_FOUND:无法找到必要的有效负载。
DetourCreateProcessWithDllEx API在它创建的新进程中修改目标PE二进制程序的内存导入表。为了正确的应用程序兼容性,应该在应用程序运行之前删除对导入表的更改。为了删除这些更改,DetourCreateProcessWithDllEx使用DetourCopyPayloadToProcess API将相关反转数据复制到目标流程的有效负载中。在目标进程中调用时,DetourRestoreAfterWith搜索必要的有效负载并恢复导入表的内容。
为了得到正确的结果,应该在加载到目标进程的DLL的DllMain函数的PROCESS_ATTACH部分调用DetourRestoreAfterWith。
FindFunc, Simple, Slept, Traceapi, Tracebld, Tracelnk, Tracemem, Tracereg, Traceser, Tracetcp, Tryman。