CreateRemoteThread注入,目标程序直接退出
windows11,64位。Visual Studio 2022。
被注入程序,64位 release版;
注入器程序,64位 release版。
https://pic4.58cdn.com.cn/nowater/webim/big/n_v2938f36ac18ab4ee3822e79e59e53e50a.png
被注入程序代码:
#include <iostream>
#include <Windows.h>
void method1() {
printf("method1无参函数1方法1。行:%d\n", __LINE__);
}
void method2(int a) {
printf("method2这里是函数2方法2,参:%d。行:%d\n", a, __LINE__);
}
void method3(int a, int b) {
printf("method3函数3方法3,a=%d,b=%d。行:%d\n", a, b, __LINE__);
}
int main() {
int step = 0;
while (1) {
printf("method1=%p, method2=%p, method3=%p \n", method1, method2, method3);
getchar();
printf("\n计数=%d,行号=%d \r\n", step++, __LINE__);
}
return 1;
}
注入器程序代码:
#include <iostream>
#include <windows.h> // windows api 的头文件
int main() {
LPCWSTR lpWindowName = L"E:\\studio_c_space\\ConsoleApplication\\x64\\Release\\App6-内存地址.exe";
HWND windowHandler = FindWindowW(NULL, lpWindowName);
printf("目标窗口句柄 %p\n", windowHandler); //
ULONG pid, tid;
tid = GetWindowThreadProcessId(windowHandler, &pid);
printf("目标进程ID %x\n", pid); //
printf("目标线程ID %x\n", tid); //
//HANDLE process = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ, FALSE, pid);
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
printf("目标进程句柄 %p\n", process); //
HANDLE hThread = CreateRemoteThread(
process, // ●hProcess 目标进程句柄.在其中创建线程
NULL, // lpThreadAttributes 新线程的安全描述符,并确定子进程是否可以继承返回的句柄。
0, // dwStackSize 新线程栈初始大小,以字节为单位。0=使用系统默认大小.
(LPTHREAD_START_ROUTINE)0x7FF74D091070, // ●lpStartAddress 远程进程中线程的起始地址,必须存在于远程进程中
0, // ●lpParameter 传递给线程函数的变量的指针。
0, // dwCreationFlags 控制线程创建的标志。0=线程在创建后立即运行。
NULL // lpThreadId 指向接收线程标识符的变量的指针。
); // 如果调用成功,返回新线程句柄.
printf("远程线程句柄 %p\n", hThread); //
DWORD error = GetLastError();
printf("错误:%d\n", error);
//CloseHandle(process);
getchar();
}
最早的错误是 GetLastError返回5或6,搜索是x32注入x64或debug的问题,于是都编译位x64 release,注入器以管理员身份运行。
现在返回码是0,但是只要注入器运行,被注入程序就会卡一两秒直接退出,无任何信息提示。
能找到的关于“崩溃”的都是dll注入的,没有我这种情景。
请坛友们不吝赐教。
线程回调函数默认是stdcall调用,内平栈 woflant 发表于 2023-9-25 14:50
线程回调函数默认是stdcall调用,内平栈
谢谢!没太明白
https://pic2.58cdn.com.cn/nowater/webim/big/n_v2c11bf2eb2d474a40b26acb8f13abafd5.png
我这样改了被注入程序。测试仍然卡死崩溃 vigiles 发表于 2023-9-25 15:04
谢谢!没太明白
远程线程参数貌似都正常
可以先在目标程序创建本地线程调用,调试看看有没有其他问题 woflant 发表于 2023-9-25 15:15
远程线程参数貌似都正常
可以先在目标程序创建本地线程调用,调试看看有没有其他问题
你说的太深奥了,我刚开始学win api 。2333
vigiles 发表于 2023-9-25 15:36
你说的太深奥了,我刚开始学win api 。2333
在目标程序CreateThread创建线程,和远程创建线程差不多,可以直接上vs调试 远程线程以method2为地址也会出错吗?method2加上stdcall之后应该符合函数协议了的 0x7FF74D091070
这个地址是怎么来的?
如果是随机基址,这个地址可能会变…… yes2 发表于 2023-9-25 16:11
远程线程以method2为地址也会出错吗?method2加上stdcall之后应该符合函数协议了的
都不报错,都是卡住然后退出 无闻无问 发表于 2023-9-25 16:16
0x7FF74D091070
这个地址是怎么来的?
如果是随机基址,这个地址可能会变……
printf("method1=%p, method2=%p, method3=%p \n", method1, method2, method3);
指针地址得来的,没有引用错误。
页:
[1]
2