吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 898|回复: 19
收起左侧

[求助] CreateRemoteThread注入,目标程序直接退出

[复制链接]
vigiles 发表于 2023-9-25 14:37
windows11,64位。
Visual Studio 2022。
被注入程序,64位 release版;
注入器程序,64位 release版。



被注入程序代码:
[C++] 纯文本查看 复制代码
#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;
}


注入器程序代码:
[C++] 纯文本查看 复制代码
#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注入的,没有我这种情景。
请坛友们不吝赐教。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

woflant 发表于 2023-9-25 14:50
线程回调函数默认是stdcall调用,内平栈
 楼主| vigiles 发表于 2023-9-25 15:04
woflant 发表于 2023-9-25 14:50
线程回调函数默认是stdcall调用,内平栈

谢谢!没太明白


我这样改了被注入程序。测试仍然卡死崩溃
woflant 发表于 2023-9-25 15:15
vigiles 发表于 2023-9-25 15:04
谢谢!没太明白

远程线程参数貌似都正常

可以先在目标程序创建本地线程调用,调试看看有没有其他问题
 楼主| vigiles 发表于 2023-9-25 15:36
woflant 发表于 2023-9-25 15:15
远程线程参数貌似都正常

可以先在目标程序创建本地线程调用,调试看看有没有其他问题

你说的太深奥了,我刚开始学win api   。  2333
woflant 发表于 2023-9-25 15:38
vigiles 发表于 2023-9-25 15:36
你说的太深奥了,我刚开始学win api   。  2333

在目标程序CreateThread创建线程,和远程创建线程差不多,可以直接上vs调试
yes2 发表于 2023-9-25 16:11
远程线程以method2为地址也会出错吗?method2加上stdcall之后应该符合函数协议了的
无闻无问 发表于 2023-9-25 16:16
0x7FF74D091070
这个地址是怎么来的?
如果是随机基址,这个地址可能会变……
 楼主| vigiles 发表于 2023-9-25 17:25
yes2 发表于 2023-9-25 16:11
远程线程以method2为地址也会出错吗?method2加上stdcall之后应该符合函数协议了的

都不报错,都是卡住然后退出
 楼主| vigiles 发表于 2023-9-25 17:26
无闻无问 发表于 2023-9-25 16:16
0x7FF74D091070
这个地址是怎么来的?
如果是随机基址,这个地址可能会变……

[C++] 纯文本查看 复制代码
printf("method1=%p, method2=%p, method3=%p \n", method1, method2, method3);

指针地址得来的,没有引用错误。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 18:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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