35.简易远程数据框架的实现

上一个内容:34.构建核心注入代码

34.构建核心注入代码它的调用LoadLibrary函数的代码写到游戏进程中之后无法调用,动态链接库的路径是一个内存地址,写到游戏进程中只把内存地址写过去了,内存地址里的内容没写过去,导致LoadLibrary函数调用时找不到动态链接库地址的字符串。

这次实现的就是把我们进程中的数据写到游戏进程中。让LoadLibrary可以正常调用。

这里实现的是远程线程注入,不是入口点注入。

34.构建核心注入代码它的代码为基础进行修改

CWndINJ.cpp文件中的修改:注入的dll必须要与目标进程环境一样目标进行是32位dll也要是32位

void CWndINJ::OnNMDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
int index = pNMItemActivate->iItem;
if (index < 0)return;
CString GamePath = ExeLst.GetItemText(index, 2);
CString GameExe = ExeLst.GetItemText(index, 1);
CString GameCmds = ExeLst.GetItemText(index, 3);
CString GameDlls = ExeLst.GetItemText(index, 4);

// 用来指定创建时进程的主窗口的窗口工作站、桌面、标准句柄和外观。
// STARTUPINFO si{};
// si.cb = sizeof(si);
PROCESS_INFORMATION prinfo{};
m_INJCET.StartProcess(GameExe, GamePath, GameCmds.GetBuffer(), &prinfo);

 m_INJCET.CreateRemoteData(prinfo.hProcess, L"F:\\代码存放地\\c\\GAMEHACKER2\\Release\\Dlls.dll");
//m_INJCET.CodeRemoteData(&_data);

/**
    CreateProcess(GameExe,
    GameCmds.GetBuffer(),
    NULL,NULL,
    FALSE,
    // 新进程的主线程处于挂起状态创建,在调用 ResumeThread 函数之前不会运行。
    CREATE_SUSPENDED,
    NULL,
    GamePath,
    &si,
    &prinfo
    );
*/

/** 方式一调用api
    CStringA GameExeA;
    GameExeA = GameExe;
    PLOADED_IMAGE image =  ImageLoad(GameExeA, NULL);
    DWORD dEntryPoint = image->FileHeader->OptionalHeader.AddressOfEntryPoint;
    CString wTxt;
    wTxt.Format(L"%X", dEntryPoint);
    AfxMessageBox(wTxt);
    ImageUnload(image)
*/

/** 方式二(要在32位环境下运行)
void* image = _imageload(GameExe.GetBuffer());
IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)image;
unsigned PEAddress =  dosHeader->e_lfanew + (unsigned)image;
IMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)PEAddress;
DWORD dEntryPoint = ntHeader->OptionalHeader.AddressOfEntryPoint;
CString wTxt;
wTxt.Format(L"%X", dEntryPoint);
AfxMessageBox(wTxt);
_unloadimage(image);
*/
//LPVOID adrRemote = VirtualAllocEx(prinfo.hProcess, 0, 0x3000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

//SIZE_T lwt;

//WriteProcessMemory(prinfo.hProcess, adrRemote, INJECTCode, 0x200, &lwt);

//CString wTxt;
//wTxt.Format(L"%X", adrRemote);
//AfxMessageBox(wTxt);
// 让游戏继续运行
//m_INJCET.CreateRemoteData(prinfo.hProcess, GameDlls.GetBuffer());
ResumeThread(prinfo.hThread);

INJCET.h文件

#pragma once
#include <Windows.h>

typedef unsigned int (WINAPI* _LoadLibrary)(wchar_t* dllName);

typedef struct _REMOTE_DATA {
    wchar_t dllName[0xFF]; // 要输入的dll文件路径
    _LoadLibrary f_LoadLibrary;
}*PREMOTE_DATA;

class INJCET
{
public:
    BOOL StartProcess(
        const wchar_t * GameExe,
        const wchar_t * GamePath,
        wchar_t * GameCmds,
        PROCESS_INFORMATION* LPinfo
        
    );
    void* ImageLoad(const wchar_t* filename);
    void UnloadImage(void* _data);
    DWORD GetEntryPoint(const wchar_t* filename);
public:
    BOOL CreateRemoteData(HANDLE hProcess, const wchar_t* dllName);
    void CodeRemoteData(PREMOTE_DATA _data, const wchar_t* dllName);
};

INJCET.cpp文件

#include "pch.h"
#include "INJCET.h"
#include <fstream>


void _stdcall INJECTCode() {
    unsigned address = 0xCCCCCCCC;
    PREMOTE_DATA p = (PREMOTE_DATA)address;
    p->f_LoadLibrary(p->dllName);
}

BOOL INJCET::StartProcess(const wchar_t* GameExe, const wchar_t* GamePath, wchar_t* GameCmds, PROCESS_INFORMATION* LPinfo)
{
    // 用来指定创建时进程的主窗口的窗口工作站、桌面、标准句柄和外观。
    STARTUPINFO si{};
    si.cb = sizeof(si);
    CreateProcess(GameExe,
        GameCmds,
        NULL, NULL,
        FALSE,
        // 新进程的主线程处于挂起状态创建,在调用 ResumeThread 函数之前不会运行。
        CREATE_SUSPENDED,
        NULL,
        GamePath,
        &si,
        LPinfo
    );

    return TRUE;
}


void* INJCET::ImageLoad(const wchar_t* filename) {
    std::ifstream streamReader(filename, std::ios::binary);
    streamReader.seekg(0, std::ios::end);
    unsigned filesize = streamReader.tellg();
    char* _data = new char[filesize];
    streamReader.seekg(0, std::ios::beg);
    streamReader.read(_data, filesize);
    streamReader.close();
    return _data;
}

void INJCET::UnloadImage(void* _data) {
    delete[] _data;
}

DWORD INJCET::GetEntryPoint(const wchar_t* filename)
{
    // 方式二(要在32位环境下运行根据游戏版本选择运行32还是64位的程序)
    void* image = ImageLoad(filename);
    IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)image;
    unsigned PEAddress = dosHeader->e_lfanew + (unsigned)image;
    IMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)PEAddress;
    DWORD dEntryPoint = ntHeader->OptionalHeader.AddressOfEntryPoint;
    CString wTxt;
    wTxt.Format(L"%X", dEntryPoint);
    AfxMessageBox(wTxt);
    UnloadImage(image);
    return dEntryPoint;
}

BOOL INJCET::CreateRemoteData(HANDLE hProcess, const wchar_t* dllName)
{
    LPVOID adrRemote = VirtualAllocEx(hProcess, 0, 0x3000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    SIZE_T lwt;
    LPVOID adrRemoteData = (LPVOID)((unsigned)adrRemote + 0x2000);

    _REMOTE_DATA remoteData{};
    CodeRemoteData(&remoteData, dllName);
    WriteProcessMemory(hProcess, adrRemoteData, &remoteData, sizeof(remoteData), &lwt);
    char _code[0x200];

    memcpy(_code, INJECTCode, sizeof(_code));

    for (int i = 0; i < 0x100; i++) {
        unsigned* pcode = (unsigned*)(&_code[i]);
        if (pcode[0] == 0xCCCCCCCC) {
            pcode[0] = (unsigned)adrRemoteData;
            break;
        }
    }
    // 0x001c0000
    WriteProcessMemory(hProcess, adrRemote, _code, 0x200, &lwt);


    CString wTxt;
    wTxt.Format(L"%X", adrRemote);
    AfxMessageBox(wTxt);

    DWORD dwThreadId = 0;
    HANDLE remoteHdl = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)adrRemote, NULL, 0, &dwThreadId);
    WaitForSingleObject(remoteHdl, INFINITE);
    return TRUE;
}

void INJCET::CodeRemoteData(PREMOTE_DATA _data, const wchar_t* dllName)
{
    short lenth;
    // 求长度
    for (lenth = 0; dllName[lenth]; lenth++);


    HMODULE hKernel = LoadLibrary(_T("kernel32.dll"));
    //_data->f_LoadLibrary = (_LoadLibrary)GetProcAddress(hKernel, "LoadLibraryW");
    _data->f_LoadLibrary = (_LoadLibrary)GetProcAddress(hKernel, "LoadLibraryW");
    //LoadLibraryW

    // wchar两字节拷贝是一字节所以长度要成2
    memcpy(_data->dllName, dllName, (lenth + 1) * 2);

    /*CString  wTxt;
    wTxt.Format(L"%X", _data->f_LoadLibrary);
    AfxMessageBox(wTxt);*/
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/733473.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apple - Secure Coding Guide

本文翻译整理自&#xff1a;Secure Coding Guide https://developer.apple.com/library/archive/documentation/Security/Conceptual/SecureCodingGuide/Introduction.html#//apple_ref/doc/uid/TP40002477-SW1 文章目录 一、安全编码指南简介1、概览黑客和攻击者没有平台是免疫…

C#实现高斯模糊(图像处理)

在C#中实现高斯模糊&#xff0c;可以使用System.Drawing库。高斯模糊是一种基于高斯函数的滤波器&#xff0c;它可以有效地平滑图像。以下是详细的步骤&#xff0c;包括生成高斯核并应用到图像上的代码示例。 1. 生成高斯核 首先&#xff0c;我们需要编写一个方法来生成高斯核…

江协科技51单片机学习- p11 静态数码管显示

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; 51单片机入门教程-2…

BP神经网络的反向传播(Back Propagation)

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、什么是BP的反向传播1.1 什么是反向传播1.2 反向传播的意义 二、BP神经网络如何通过反向传播计算梯度三、BP梯度公式解读 BP神经网络更原始的名称是"多层线性感知机MLP"&#xff0c;由于它在训练时…

29-Linux--守护进程

一.基础概念 1.守护进程&#xff1a;精灵进程&#xff0c;在后台为用户提高服务&#xff0c;是一个生存周期长&#xff0c;通常独立于控制终端并且周期性的执行任务火处理事件发生 2.ps axj&#xff1a;查看守护进程 3.进程组&#xff1a;多个进程的集合&#xff0c;由于管理…

【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow

一、介绍 球类识别系统&#xff0c;本系统使用Python作为主要编程语言&#xff0c;基于TensorFlow搭建ResNet50卷积神经网络算法模型&#xff0c;通过收集 ‘美式足球’, ‘棒球’, ‘篮球’, ‘台球’, ‘保龄球’, ‘板球’, ‘足球’, ‘高尔夫球’, ‘曲棍球’, ‘冰球’,…

virtualbox中共享盘的使用

Windows通过共享盘向虚拟机&#xff08;ubuntu&#xff09;传输文件 第一步&#xff1a; 第二步&#xff1a; 三。完成

学习笔记——路由网络基础——动态路由

五、动态路由 1、动态路由概述 动态路由&#xff1a;通过在设备上运行某种协议&#xff0c;通过该协议自动交互路由信息的过程。 动态路由协议有自己的路由算法&#xff0c;能够自动适应网络拓扑的变化&#xff0c;适用于具有一定数量三“层设备的网络。 动态路由协议适用场…

Linux检查端口nmap

yum install -y nmap # 查看本机在运行的服务的端口号 nmap 127.0.0.1 补充&#xff1a;netstat netstat -tunlp | grep 3306

可灵王炸更新,图生视频、视频续写,最长可达3分钟!Runway 不香了 ...

现在视频大模型有多卷&#xff1f; Runway 刚在6月17号 发布Gen3 &#xff0c;坐上王座没几天&#xff1b; 可灵就在6月21日中午&#xff0c;重新夺回了王座&#xff01;发布了图生视频功能&#xff0c;视频续写功能&#xff01; 一张图概括&#xff1a; 二师兄和团队老师第一…

c++使用std::function/std::bind

1&#xff09;C入门级小知识&#xff0c;分享给将要学习或者正在学习C开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 std::function对象是对C中现有的可调用实体的一种类型安全的包裹&…

什么是数据库?从零开始了解数据库基础概念

什么是数据库&#xff1f;从零开始了解数据库基础概念 相信大家在日常生活中都听到过大数据&#xff0c;数据这个东西越来越火&#xff0c;比如交通大数据、旅游大数据等&#xff0c;&#xff0c;&#xff0c;数据成为了企业决策和业务运作的关键元素。而管理这些庞大而复杂的…

高斯算法的原理及其与常规求和方法的区别

高斯算法的原理 高斯算法的原理源于数学家卡尔弗里德里希高斯在他少年时期发现的一种求和方法。当时老师让学生们计算1到100的和&#xff0c;高斯发现了一种快速计算的方法。 高斯注意到&#xff0c;如果将序列的首尾两数相加&#xff0c;结果总是相同的。例如&#xff1a; …

若以框架学习(3),echarts结合后端数据展示,暂时完结。

前三天&#xff0c;参加毕业典礼&#xff0c;领毕业证&#xff0c;顿时感到空落落的失去感&#xff0c;没有工作&#xff0c;啥也没有&#xff0c;总感觉一辈子白活了。晚上ktv了一晚上&#xff0c;由于我不咋个唱歌&#xff0c;没心情&#xff0c;听哥几个唱了一晚上周杰伦&am…

【FreeRTOS】删除任务 用遥控器控制音乐

参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》 学习视频&#xff1a;【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS&#xff08;FreeRTOS教程 基于STM32&#xff0c;以实际项目为导向&#xff09;】 【精准空降到 01:22】 https://www.bilibili.com/video/BV1…

有哪些零售O2O应用模式?如何构建O2O闭环生态系统?

在零售业的演变历程中&#xff0c;O2O模式的兴起标志着一个新时代的开始。这种模式以其创新性&#xff0c;将线上的便捷与线下的实体体验完美融合&#xff0c;为消费者带来了前所未有的购物便利和体验丰富性。随着技术的不断进步和消费者需求的日益多样化&#xff0c;O2O模式已…

202484读书笔记|《长安诗选》——你心中的一团锦绣,终有脱口而出的一日,大鹏终有直击云天的一日

202484读书笔记|《长安诗选》——你心中的一团锦绣&#xff0c;终有脱口而出的一日&#xff0c;大鹏终有直击云天的一日 一 诗梦长安三万里二 诗话长安二 谪仙风华四 盛唐群星 《长安诗选》追光动画 韩潇&#xff0c;电影《长安三万里》同名诗集&#xff0c;很给力的电影&#…

在线教育系统源码入门:教育培训小程序开发全流程

本篇文章&#xff0c;笔者将详细介绍在线教育系统源码的入门知识&#xff0c;并带领大家了解教育培训小程序的开发全流程。 一、在线教育系统的基本概念 一个完整的在线教育系统应具备以下几个模块&#xff1a; 用户管理 课程管理 教学互动 支付模块 数据统计 二、开发工…

C/C++ 数组负数下标

一 概述 在 C 中&#xff0c;数组是一块连续的内存空间&#xff0c;数组的下标通常用来定位这段内存中的特定元素。下标通常从 0 开始&#xff0c;最大到数组长度减 1。例如&#xff0c;一个有 10 个元素的数组&#xff0c;其有效下标范围是从 0 到 9。 当你尝试使用负数下标来…

嵌入式通信协议----Wi-Fi协议详解(二)(基于STM32+有人物联网WIFI模块)

四、有人WIFI模块 1.模块介绍 Wi-Fi 模块用于实现串口到 Wi-Fi 数据包的双向透明转发&#xff0c;模块内部完成协议转换&#xff0c;通 过该模块&#xff0c;客户可以将物理设备连接到 Wi-Fi 网络上&#xff0c;从而实现物联网的控制与管理。 2.模块参数 Wi-Fi 模块的…