Windows 短LdrLoadDll存根在远程执行时崩溃

Windows 短LdrLoadDll存根在远程执行时崩溃,windows,multithreading,crash,stub,Windows,Multithreading,Crash,Stub,因此,我编写了一个小程序,将一些外壳代码复制到调用LdrLoadDll(如存根)的指定进程中。问题是,只有当我指定要使用的程序与我编写的程序相同时,它才起作用。如果我选择任何其他程序,该程序将崩溃。可能是我的功能原型 这是我的密码: #include <Windows.h> #pragma comment(lib, "ntdll.lib") typedef struct _LSA_UNICODE_STRING { USHORT Length; USHORT Maxi

因此,我编写了一个小程序,将一些外壳代码复制到调用LdrLoadDll(如存根)的指定进程中。问题是,只有当我指定要使用的程序与我编写的程序相同时,它才起作用。如果我选择任何其他程序,该程序将崩溃。可能是我的功能原型

这是我的密码:

#include <Windows.h>
#pragma comment(lib, "ntdll.lib")

typedef struct _LSA_UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;
using f_LdrLoadDll = NTSTATUS(NTAPI*)(IN PWCHAR PathToFile OPTIONAL, IN ULONG Flags OPTIONAL, IN PUNICODE_STRING ModuleFileName, OUT PHANDLE ModuleHandle);


typedef NTSTATUS(NTAPI *pdef_LdrLoadDll)(IN PWCHAR PathToFile OPTIONAL, IN ULONG Flags OPTIONAL, IN PUNICODE_STRING ModuleFileName, OUT PHANDLE ModuleHandle);
EXTERN_C NTSYSAPI VOID WINAPI RtlInitUnicodeString(PUNICODE_STRING, PCWSTR);
struct LOADER_STUB_INFO
{
    pdef_LdrLoadDll LdrLoadDllDef;
    UNICODE_STRING filename;
    f_LdrLoadDll LdrLoadDll = LdrLoadDllDef;
};
void __stdcall ldrstub(LOADER_STUB_INFO * ldrInfo);
int main()
{                                 //only works with GetCurrentProcessId();
    HANDLE proc = OpenProcess(GENERIC_ALL, 0, GetCurrentProcessId()); 
    LOADER_STUB_INFO loaderInfo;
    LPVOID ldrFuncAddr = GetProcAddress(GetModuleHandle("ntdll.dll"), "LdrLoadDll");
    pdef_LdrLoadDll LdrLoadDll = (pdef_LdrLoadDll)ldrFuncAddr;
    loaderInfo.LdrLoadDll = LdrLoadDll;
    UNICODE_STRING file;
    RtlInitUnicodeString(&file, L"C:\\Users\\Arush\\Desktop\\test.dll");
    loaderInfo.filename = file;
    LPVOID structAddr = VirtualAllocEx(proc, nullptr, 0x1000, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(proc, structAddr, &loaderInfo, sizeof(loaderInfo), nullptr);
    LPVOID codeAddr = VirtualAllocEx(proc, nullptr, 0x1000, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(proc, codeAddr, ldrstub, 0x1000, nullptr);
    CreateRemoteThread(proc, nullptr, 0, (LPTHREAD_START_ROUTINE)codeAddr, reinterpret_cast<LOADER_STUB_INFO*>(structAddr), 0, nullptr);
    system("pause");
    return 0;
}

void __stdcall ldrstub(LOADER_STUB_INFO * ldrInfo)
{
    auto _LdrLoadDll = ldrInfo->LdrLoadDll;
    HANDLE handee;
    _LdrLoadDll(nullptr, 0, &ldrInfo->filename, &handee);
}
#包括
#pragma注释(lib,“ntdll.lib”)
typedef结构\u LSA\u UNICODE\u字符串{
USHORT长度;
USHORT最大长度;
PWSTR缓冲区;
}LSA_UNICODE_字符串、*PLSA_UNICODE_字符串、UNICODE_字符串、*PUNICODE_字符串;
使用f_LdrLoadDll=NTSTATUS(NTAPI*)(在PWCHAR路径文件中可选,在ULONG标志中可选,在PUNICODE_字符串ModuleFileName中,在PHANDLE ModuleHandle中可选);
typedef NTSTATUS(NTAPI*pdef_LdrLoadDll)(在PWCHAR路径文件中可选,在ULONG标志中可选,在PUNICODE_字符串ModuleFileName中,在幻影模块句柄中);
外部NTSYSAPI VOID WINAPI RtlInitUnicodeString(PUNICODE字符串,PCWSTR);
结构加载器\u存根\u信息
{
pdef_LdrLoadDll ldrloaddlf;
UNICODE_字符串文件名;
f_LdrLoadDll LdrLoadDll=ldrloaddlf;
};
void uu stdcall ldrstub(装载机存根信息*ldrInfo);
int main()
{//仅适用于GetCurrentProcessId();
HANDLE proc=OpenProcess(GENERIC_ALL,0,GetCurrentProcessId());
加载器\存根\信息加载器信息;
LPVOID ldrfuncacddr=GetProcAddress(GetModuleHandle(“ntdll.dll”),“LdrLoadDll”);
pdef_LdrLoadDll LdrLoadDll=(pdef_LdrLoadDll)ldrfuncacddr;
loaderInfo.LdrLoadDll=LdrLoadDll;
UNICODE_字符串文件;
RTLinitUnicode字符串(&文件,L“C:\\Users\\Arush\\Desktop\\test.dll”);
loaderInfo.filename=文件;
LPVOID structAddr=VirtualAllocEx(proc,nullptr,0x1000,MEM_RESERVE | MEM_COMMIT,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(proc、structAddr和loaderInfo、sizeof(loaderInfo)、nullptr);
LPVOID codeAddr=VirtualAllocEx(proc,nullptr,0x1000,MEM_RESERVE | MEM_COMMIT,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(proc、codeAddr、ldrstub、0x1000、nullptr);
CreateRemoteThread(proc,nullptr,0,(LPTHREAD\u START\u例程)codeAddr,reinterpret\u cast(structAddr),0,nullptr);
系统(“暂停”);
返回0;
}
void u stdcall ldrstub(加载器存根信息*ldrInfo)
{
自动加载DLL=ldrInfo->LdrLoadDll;
把手;
_LdrLoadDll(nullptr、0和ldrInfo->filename和handee);
}

UNICODE\u字符串文件名内部
加载器存根\u信息
包含指针-
缓冲区
。您初始化指向
L“C:\\Users\\Arush\\Desktop\\test.dll”
的指针,并按原样复制到远程进程。但是在远程进程中,
缓冲区
当然无效。您需要分配并复制要加载到远程进程的dll的名称,而不是从本地进程指向它的指针