远程代码注入成功运行后进程异常退出
《逆向工程核心原理》里面的一个注入代码小练习。。使用的是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;
} 顺便,想请教一下各位大佬,远程代码注入后如何进行调试。。(试过用OD运行然后注入代码,但是打开进程失败) 玛丽亚在伯大尼 发表于 2022-9-23 18:25
顺便,想请教一下各位大佬,远程代码注入后如何进行调试。。(试过用OD运行然后注入代码,但是打开进程失败 ...
一个思路,自己写一个被注入的程序一起调试 远程线程函数的参数DataAddr是指向第一个成员的地址。。所以我觉得在远程线程中使用结构体指针进行定位有点不妥。。。(结构体指针指向的好像不是第一个成员地址) jhq999 发表于 2022-9-23 20:40
一个思路,自己写一个被注入的程序一起调试
行,问题解决,感谢回复
页:
[1]