玛丽亚在伯大尼 发表于 2022-9-22 20:25:41

远程代码注入成功运行后进程异常退出

《逆向工程核心原理》里面的一个注入代码小练习。。
使用的是CreateRemoteThread,尝试注入消息框代码,注入后消息框成功显示,进程也能够正常运行。但是关闭消息框之后进程卡住,一会儿异常退出,显示线程的返回代码为0xC0000409{:10_269:}
之前试过对X64的计算器进行代码注入,一切正常。这次是X86,就不行了。。(系统WIN10,解决方案平台X86还是X64啥的没有设置错)
跪求大佬解答
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int MsgBoxInject(int procID);
int LocateProcID(char* str);

typedef struct DATAPAK                //待注入的数据包
{
        FARPROC FuncAddr;        //ABC三个函数的地址
        char str;                //字符串集
}DATAPAK;

static int CodetoInject(LPVOID DataAddr)        //待注入的代码
{
        DATAPAK *dat = DataAddr;
        HMODULE hMod;

        HMODULE(*FuncA)(char* str);                                //函数声明,A函数LoadLibraryA,B函数GetProcAddress,C函数MessageBoxA,D函数FreeLibrary。
        FARPROC(*FuncB)(HMODULE hMod, char* str);
        int(*FuncC)(HWND hWnd, char* str, char* strl, int style);
        void(*FuncD)(HMODULE hMod);

        FuncA = (void*)dat->FuncAddr;        //设置函数地址
        FuncB = (void*)dat->FuncAddr;
        FuncD = (void*)dat->FuncAddr;
        hMod = FuncA(dat->str);
        FuncC = (void*)FuncB(hMod, dat->str);

        FuncC(NULL, dat->str, dat->str, MB_OK | MB_ICONERROR);
        FuncD(hMod);
        return 0;
}

static void End()
{
        ;
}

int main()
{
        char* str = L"TraceMe 动态分析技术";                        //窗口字符串。
        printf(" 正在尝试注入消息窗口。。。\n");
        int procID = 0;                                                                        //进程ID,没有设置就调用函数获取
        if (!procID)        procID=LocateProcID(str);
        int result = MsgBoxInject(procID);                                //注入消息框
        printf(" result = 0x%X\n", result);

        return 0;
}

int LocateProcID(char* str)
{
        HWND hWnd = 0;
        UINT ProcID, ThreadID;
        hWnd = FindWindowW(NULL, str);
        if (hWnd)
        {
                printf(" 窗口定位成功。\n");
        }
        ThreadID = GetWindowThreadProcessId(hWnd, &ProcID);
        return ProcID;
}

int MsgBoxInject(int procID)
{
        HANDLE hProc;
        HANDLE hMod;
        DATAPAK dat;
        LPVOID DataAddr;
        LPVOID CodeAddr;
        HANDLE hThread;
        DWORD ExitCode=0x0;
        //int result=1;
        int CodeSize = (int)End - (int)CodetoInject;
        printf(" 待注入的代码大小为:%dB。\n", CodeSize);


        hMod = GetModuleHandleA("kernel32.dll");
        dat.FuncAddr = GetProcAddress(hMod, "LoadLibraryA");
        dat.FuncAddr = GetProcAddress(hMod, "GetProcAddress");
        dat.FuncAddr = GetProcAddress(hMod, "FreeLibrary");
        //printf("0x%X\n", dat.FuncAddr);
        strcpy(dat.str, "未知错误");
        strcpy(dat.str, "警告,该进程可能被注入恶意代码!");
        strcpy(dat.str, "MessageBoxA");
        strcpy(dat.str, "user32.dll");
       
        hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);        //打开进程
        if (GetLastError()) printf(" 获取内存读写操作权限失败,错误代码为:%d。\n", GetLastError());
        else printf(" 获取内存读写操作权限成功。\n");

        DataAddr = VirtualAllocEx(hProc, NULL, sizeof(DATAPAK), MEM_COMMIT, PAGE_READWRITE);        //申请内存空间
        CodeAddr = VirtualAllocEx(hProc, NULL, CodeSize, MEM_COMMIT, PAGE_READWRITE);
        if (GetLastError()) printf(" 申请内存失败。异常代码为:%d\n", GetLastError());
        else printf(" 申请内存成功。\n");

        WriteProcessMemory(hProc, DataAddr, &dat, sizeof(DATAPAK), NULL);                                //写入内存
        WriteProcessMemory(hProc, CodeAddr, CodetoInject, CodeSize, NULL);
        if (GetLastError()) printf(" 写入过程中出现异常。异常代码为:%d\n", GetLastError());
        else printf(" 代码成功写入内存。\n");

        hThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)CodeAddr, DataAddr, 0, NULL);
        if (hThread) printf(" 创建远程线程成功。\n");
        else printf(" 创建远程线程失败。\n");

        WaitForSingleObject(hThread, INFINITE);
        GetExitCodeThread(hThread, &ExitCode);
        printf(" 进程已退出,退出码为:0x%X\n", ExitCode);
        VirtualFreeEx(hProc, CodeAddr, 0, MEM_RELEASE);
        VirtualFreeEx(hProc, DataAddr, 0, MEM_RELEASE);
        CloseHandle(hThread);
        CloseHandle(hProc);
        return ExitCode;
}

玛丽亚在伯大尼 发表于 2022-9-23 18:25:14

顺便,想请教一下各位大佬,远程代码注入后如何进行调试。。(试过用OD运行然后注入代码,但是打开进程失败)

jhq999 发表于 2022-9-23 20:40:16

玛丽亚在伯大尼 发表于 2022-9-23 18:25
顺便,想请教一下各位大佬,远程代码注入后如何进行调试。。(试过用OD运行然后注入代码,但是打开进程失败 ...

一个思路,自己写一个被注入的程序一起调试

玛丽亚在伯大尼 发表于 2022-9-23 20:59:24

远程线程函数的参数DataAddr是指向第一个成员的地址。。所以我觉得在远程线程中使用结构体指针进行定位有点不妥。。。(结构体指针指向的好像不是第一个成员地址)

玛丽亚在伯大尼 发表于 2022-9-23 21:00:56

jhq999 发表于 2022-9-23 20:40
一个思路,自己写一个被注入的程序一起调试

行,问题解决,感谢回复
页: [1]
查看完整版本: 远程代码注入成功运行后进程异常退出