簡體   English   中英

WinAPI CreateThread的殺死過程

[英]WinAPI CreateThread killing process

我正在嘗試編寫一個執行任意shellcode的C#函數。 它似乎正在工作,除了當創建的線程退出時,整個過程終止。 我自己沒有提出此代碼,而是主要從以下站點獲得的: https : //webstersprodigy.net/2012/08/31/av-evading-meterpreter-shell-from-a-net-service/

這是執行shellcode的函數:

public void ExecuteShellCode(String code)
{
    //pipe msfvenom raw to xxd -p -c 999999 (for example)
    byte[] shellcode = StringToByteArray(code);
    UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length, 0x1000, 0x40);
    Marshal.Copy(shellcode, 0, (IntPtr)(funcAddr), shellcode.Length);
    IntPtr hThread = IntPtr.Zero;
    UInt32 threadId = 0;
    hThread = CreateThread(0, 0, funcAddr, IntPtr.Zero, 0, ref threadId);
    WaitForSingleObject(hThread, 0xFFFFFFFF);
}

我使用以下示例進行調用:

(請注意-您可能不應從互聯網運行隨機的shellcode,此示例是無害的,但您不應該相信我的話)

我用msfvenom生成了shellcode-它只是彈出一個消息框。

rsh.ExecuteShellCode(@"d9eb9bd97424f431d2b27731c9648b71308b760c8b761c8b46088b7e208b36384f1875f35901d1ffe1608b6c24248b453c8b54287801ea8b4a188b5a2001ebe334498b348b01ee31ff31c0fcac84c07407c1cf0d01c7ebf43b7c242875e18b5a2401eb668b0c4b8b5a1c01eb8b048b01e88944241c61c3b20829d489e589c2688e4e0eec52e89fffffff894504bb7ed8e273871c2452e88effffff894508686c6c20416833322e64687573657230db885c240a89e656ff550489c250bba8a24dbc871c2452e85fffffff686f6b582031db885c240289e368732158206869656e64687920467268486f776431c9884c240e89e131d252535152ffd031c050ff5508");

while (true)
{
    Thread.Sleep(42);
}

如果您需要將字符串轉換為字節的代碼,則在這里:

private static byte[] StringToByteArray(String opcodes)
{
    int NumberChars = opcodes.Length;
    byte[] bytes = new byte[NumberChars / 2];
    for (int i = 0; i < NumberChars; i += 2)
        bytes[i / 2] = Convert.ToByte(opcodes.Substring(i, 2), 16);
    return bytes;
}

我的想法:

我覺得有些問題需要在shellcode中以某種方式指定程序的返回地址,因為shellcode破壞了整個過程。 我用msfvenom嘗試了所有“ EXITFUNC”參數,包括SEH,Process和Thread ...,但是沒有運氣。 我的示例shellcode是否有問題? 在那兒

CreateThread當然不會殺死進程。 這是您的shellcode( x86 )最后調用ExitProcess的過程。 所以過程就退出了。 而且您的shellcode的第一個字節是垃圾-您需要對其進行修復。 如果您不希望退出流程,則需要在最后刪除ExitProcess調用並更正返回值。

我也聲稱這個shellcode如何搜索kernel32.dll是不正確的。

您的shellcode所做的所有事情(第一個錯誤的字節除外):

MessageBoxA(0, "Howdy Friends!", "ok", 0);ExitProcess(0);

如果有人對其進行修改(刪除ExitProcess ,恢復寄存器,堆棧並返回)-我們可以獲得下一個代碼(C或C ++)

static const char sc[] = 
    "60e80000000031d2b27031c9648b71308b760c8b761c8b46088b7e208b36384f1875f35901d1ffe1"
    "608b6c24248b453c8b54287801ea8b4a188b5a2001ebe334498b348b01ee31ff31c0fcac84c07407"
    "c1cf0d01c7ebf43b7c242875e18b5a2401eb668b0c4b8b5a1c01eb8b048b01e88944241c61c3b208"
    "29d489e589c2688e4e0eec52e89fffffff894504bb7ed8e273871c2452e88effffff894508686c6c"
    "20416833322e64687573657230db885c240a89e656ff550489c250bba8a24dbc871c2452e85fffff"
    "ff686f6b582031db885c240289e368732158206869656e64687920467268486f776431c9884c240e"
    "89e131d252535152ffd083c43c61c3";

if (PVOID pv = VirtualAlloc(0, (sizeof(sc) - 1) >> 1, MEM_COMMIT, PAGE_EXECUTE_READWRITE))
{

    ULONG cb = (sizeof(sc) - 1) >> 1;

    if (CryptStringToBinaryA(sc, sizeof(sc) - 1, CRYPT_STRING_HEX, (PBYTE)pv, &cb, 0, 0))
    {
        if (FlushInstructionCache(NtCurrentProcess(), pv, cb))
        {
            (FARPROC(pv))();
        }
    }

    VirtualFree(pv, 0, MEM_RELEASE);
}

sellcode如何搜索KERNEL32.DLL當然不正確:

PLIST_ENTRY InInitializationOrderModuleList = &RtlGetCurrentPeb()->Ldr->InInitializationOrderModuleList, entry = InInitializationOrderModuleList;

_LDR_DATA_TABLE_ENTRY* ldte;
do 
{
    entry = entry->Flink;
    ldte = CONTAINING_RECORD(entry, _LDR_DATA_TABLE_ENTRY, InInitializationOrderLinks);

} while (*RtlOffsetToPointer(ldte->BaseDllName.Buffer, 24)); // assume that this is `KERNEL32.DLL`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM