“Dllinject真不错呢”

首先只有记忆改编实在是太无聊了!!针对这样的您,我将介绍使用Dll进行游戏黑客的方法。
这次我们将以Windows 10版我的世界为例。

dllinject是什么?dllinject指的是通过外部应用程序强制加载dll,以执行自己的代码的行为。

话语只有用C或C++编写的DLL才能在dllinject上运行。

创建项目

image.png

#include "pch.h"

删除

#include <Windows.h>

我们来加上(或者加入) 「を」。

立即开始写代码。当Dll被加载时,首先执行的是

case DLL_PROCESS_ATTACH:

是的。所以让我们从这里开始将它带入我们的代码中。方法是使用CreateThread函数。

HMODULE hMod = 0;
int Loaded() {
    return 0;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        hMod = hModule;
        CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)Loaded, hModule, 0, nullptr);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

你可以使用Loaded函数来编写自己的代码。

游戏破解
我会做与之前写的文章相同的事情。就是使用Zoom。并没有太大变化。只需要找到地址并修改即可。虽然也可以将找地址的函数写在Dllnject流中,但是觉得麻烦,所以我还是使用和之前文章完全一样的方法。之前的文章

#include <vector>
#include <TlHelp32.h>
///

uintptr_t GetProcId(const wchar_t* procname) //プロセスID取得
{
    DWORD ProcId = 0;
    HANDLE hSnap = (CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 procentry;
        procentry.dwSize = sizeof(procentry);

        if (Process32First(hSnap, &procentry))
        {

            do
            {
                if (!_wcsicmp(procentry.szExeFile, procname))
                {
                    ProcId = procentry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnap, &procentry));
        }
    }
    CloseHandle(hSnap);
    return ProcId;
}
uintptr_t GetModuleBaseAddress(DWORD procId, const wchar_t* modName)//ベースアドレス取得
{
    uintptr_t modBaseAddr = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry))
        {
            do
            {
                if (!_wcsicmp(modEntry.szModule, modName))
                {
                    modBaseAddr = (uintptr_t)modEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
    CloseHandle(hSnap);
    return modBaseAddr;
}

uintptr_t FindDMAAddy(HANDLE hProc, uintptr_t ptr, std::vector<unsigned int> offsets)
{
    uintptr_t addr = ptr;
    for (unsigned int i = 0; i < offsets.size(); ++i)
    {
        ReadProcessMemory(hProc, (BYTE*)addr, &addr, sizeof(addr), 0);
        addr += offsets[i];
    }
    return addr;
}

我们来制作一个缩放功能吧。
我们来获取FOV的地址吧。

DWORD procId = GetProcId(L"Minecraft.Windows.exe");//実行中のMinecraft.Windows.exeのプロセスID
uintptr_t BaseAddress = GetModuleBaseAddress(procId, L"Minecraft.Windows.exe");//ベースアドレスの取得
if (BaseAddress != NULL) {
    uintptr_t fovdirectadd = 0x03948840;
    vector<unsigned int> fovoffset = { 0x18,0x130,0x18 };
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, procId);//プロセスハンドル取得
    uintptr_t fovaddr = FindDMAAddy(hProcess, BaseAddress + fovdirectadd, fovoffset);
}

さあ早速書き込んでいきましょう。ここがDllinjectの最大のいいところです。
なんと!!!!アドレスがわかればそのアドレスを自分の変数のように使うことが可能になるのです!!!
やり方はreinterpret_castという強制的にキャストする関数です。コードはこうなります

float* fov = reinterpret_cast<float*>(アドレス);
*fov = 30.0f;

可以使用这个变量称为fov。

构建和执行
在构建时,请确保已经选择了x64并开始构建。
Dllinject可以自己创建,不过有一款非常易于使用的适用于Minecraft Windows 10的注入器可供使用,建议使用那个进行注入。
FateInjector

最后Dllinject有很多好处,所以下次我会继续写下去。

bannerAds