Короткая заглушка LdrLoadDll вылетает при удаленном выполнении - PullRequest
0 голосов
/ 08 июня 2018

Итак, я написал небольшую программу, которая копирует некоторый шелл-код в указанный процесс, который вызывает 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);
}

1 Ответ

0 голосов
/ 08 июня 2018

UNICODE_STRING filename; внутри LOADER_STUB_INFO с указателем - Buffer.Вы инициализируете этот указатель на L"C:\\Users\\Arush\\Desktop\\test.dll" и копируете как есть удаленному процессу.но в удаленном процессе Buffer, конечно, недействительно.вам нужно выделить и скопировать имя dll, которое вы хотите загрузить в удаленный процесс, вместо этого указывать на него из локального процесса

...