鱼C论坛

 找回密码
 立即注册
查看: 1845|回复: 4

[已解决]远程代码注入成功运行后进程异常退出

[复制链接]
发表于 2022-9-22 20:25:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
《逆向工程核心原理》里面的一个注入代码小练习。。
使用的是CreateRemoteThread,尝试注入消息框代码,注入后消息框成功显示,进程也能够正常运行。但是关闭消息框之后进程卡住,一会儿异常退出,显示线程的返回代码为0xC0000409
之前试过对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[3];        //ABC三个函数的地址
        char str[4][128];                //字符串集
}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[0];        //设置函数地址
        FuncB = (void*)dat->FuncAddr[1];
        FuncD = (void*)dat->FuncAddr[2];
        hMod = FuncA(dat->str[3]);
        FuncC = (void*)FuncB(hMod, dat->str[2]);

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

static void End()
{
        ;
}

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

        return 0;
}
 
int LocateProcID(char* str)
{
        HWND hWnd = 0;
        UINT ProcID, ThreadID;
        hWnd = FindWindowW(NULL, str);
        if (hWnd)
        {
                printf("[INFO] 窗口定位成功。\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("[INFO] 待注入的代码大小为:%dB。\n", CodeSize);


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

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

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

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

        WaitForSingleObject(hThread, INFINITE);
        GetExitCodeThread(hThread, &ExitCode);
        printf("[INFO] 进程已退出,退出码为: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 20:40:16
玛丽亚在伯大尼 发表于 2022-9-23 18:25
顺便,想请教一下各位大佬,远程代码注入后如何进行调试。。(试过用OD运行然后注入代码,但是打开进程失败 ...

一个思路,自己写一个被注入的程序一起调试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-23 18:25:14 | 显示全部楼层
顺便,想请教一下各位大佬,远程代码注入后如何进行调试。。(试过用OD运行然后注入代码,但是打开进程失败)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-23 20:40:16 | 显示全部楼层    本楼为最佳答案   
玛丽亚在伯大尼 发表于 2022-9-23 18:25
顺便,想请教一下各位大佬,远程代码注入后如何进行调试。。(试过用OD运行然后注入代码,但是打开进程失败 ...

一个思路,自己写一个被注入的程序一起调试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-23 20:59:24 | 显示全部楼层
远程线程函数的参数DataAddr是指向第一个成员的地址。。所以我觉得在远程线程中使用结构体指针进行定位有点不妥。。。(结构体指针指向的好像不是第一个成员地址)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-23 21:00:56 | 显示全部楼层
jhq999 发表于 2022-9-23 20:40
一个思路,自己写一个被注入的程序一起调试

行,问题解决,感谢回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 03:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表