吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2225|回复: 5
收起左侧

[求助] win10下远程线程注入失败

[复制链接]
smallzhong 发表于 2021-3-13 14:32

这是我之前写的一份远程线程注入的代码,用VC6编译在XP下测试通过,今天我试图在win10下用vs编译出来使用却失败了。字符串成功注了进去(用CE可以看到),但是LoadLibrary的返回值是0
image-20210313142825458
我把用VC6编译的程序拖到WIN10下测试,发现可以成功注入,但同样的代码用VS编译注入就会失败
image-20210313143033217
我以为是ASLR的问题,但是关闭了VS项目的ASLR之后还是没法注入到任何进程中。
我注的目标进程是用户态的,跟session隔离没关系,,不知道为什么VS生成的代码就是没法注进去,想请教一下大家。
以下是我远程线程注入的代码

#include "StdAfx.h"
// EnumProcessAndModules.cpp : Defines the entry point for the console application.
//
#include "windows.h"
#include "stdio.h"
#include "iostream"
// #include "head.h"
using namespace std;

#define MY_ASSERT(x)                         \
    do                                       \
{                                        \
    if (!(x))                            \
    EXIT_ERROR("ASSERTION failed!"); \
} while (0)
#define EXIT_ERROR(x)                                 \
    do                                                \
    {                                                 \
    cout << "error in line " << __LINE__ << endl; \
    printf("errcode = %d\n", GetLastError());     \
    cout << x;                                    \
    system("pause");                              \
    exit(EXIT_FAILURE);                           \
    } while (0)
char string_inject[] = "injectdll.dll";
#define MY_DEBUG
int main()
{
    int pid = 0;
    cout << "请输入要注入的进程的PID:";
    cin >> pid;
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    if (hProcess == NULL)
        EXIT_ERROR("hProcess == NULL!");

    // else cout << hex << hProcess;

    // 在进程中分配内存
    LPVOID baseAddr = ::VirtualAllocEx(hProcess, NULL, sizeof(string_inject), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if (baseAddr == NULL)
        EXIT_ERROR("VirtualAllocEx failure");

#ifdef MY_DEBUG
    printf("base address that VirtualAllocEx returns is 0x%x\n", (DWORD)baseAddr);
#endif

    // 写入内存
    DWORD NumberOfBytesWritten = 0;
    if (!WriteProcessMemory(hProcess, baseAddr, string_inject, sizeof(string_inject), &NumberOfBytesWritten))
        EXIT_ERROR("WriteProcessMemory failure");
#ifdef MY_DEBUG
    printf("NumberOfBytesWritten = 0x%x\n", NumberOfBytesWritten);
#endif

    // 创建远程线程
    HANDLE hRemoteThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibrary, /*TODO: */ baseAddr, 0, NULL);
    MY_ASSERT(hRemoteThread);

    // 3、等待线程函数结束, 获取线程退出码,即LoadLibrary的返回值,即dll的首地址
    WaitForSingleObject(hRemoteThread, -1);
    DWORD exitCode = 0;
    if (!GetExitCodeThread(hRemoteThread, &exitCode))
        EXIT_ERROR("GetExitCodeThread error!");
#ifdef MY_DEBUG
    printf("thread exitcode = 0x%x\n", exitCode);
    printf("errcode = %d\n", GetLastError());
#endif
    system("pause");
}

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

bester 发表于 2021-3-13 15:01
看一下字符串编码,char 类型 就设置一下项目属性为多字节类型,调用loadlibraryA 试试
Aperodry 发表于 2021-3-13 15:15
 楼主| smallzhong 发表于 2021-3-13 15:30
bester 发表于 2021-3-13 15:01
看一下字符串编码,char 类型 就设置一下项目属性为多字节类型,调用loadlibraryA 试试

感谢!成功了!原来是这个原因,之前一直没想到
bester 发表于 2021-3-13 15:31
smallzhong 发表于 2021-3-13 15:30
感谢!成功了!原来是这个原因,之前一直没想到

因为你说loadlibrary失败,我就知道是编码方式问题,之前遇到过这个问题,我记得VC6默认是char类型的,但是VS不是
zjmanboy 发表于 2021-3-13 18:38
这个有什么用呀?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-6-17 23:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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