0

我目前有这个代码:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH: 
        DWORD address = 0x94AD28; //Ped Pointer
        DWORD offset1 = 0x5F4; //Wanted Pointer
        DWORD offset2 = 0x0; //Wanted Counter
        DWORD newvalue[] = {1200}; //Four Wanted Stars
        HANDLE phandle = NULL;
        ReadProcessMemory(phandle, (LPVOID)address, (LPVOID) &address, 4, 0);
        address = address + offset1;
        ReadProcessMemory(phandle, (LPVOID)address, (LPVOID) &address, 4, 0);
        address = address + offset2;
        WriteProcessMemory(phandle, (LPVOID)address, (LPVOID) &newvalue, 4, 0);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

注意:想要的指针在 ped 指针块内。

现在,我认为这会在开始新游戏时为玩家 4 提供想要的开始,因为它在我在控制台中执行时有效,但我了解到我需要挂钩在玩家加载时发生的游戏功能,然后打电话给我的代码。

这样在定义播放器时调用代码并更改内存地址。我还读到您不使用 Write/Read/ProcessMemory?

如果有人能解决这个问题并指导我,我将不胜感激。我是这方面的真正初学者。谢谢你。

4

1 回答 1

0

看:首先,您将 phandle 设置为 NULL,这是完全错误的。您正在尝试向未定义的进程内存写入一些内容。

当您编写 asi 脚本(技术上是一个 DLL)时,您的代码将在 gta-vc.exe 进程中运行,因此您可以像这样简单地获取句柄:

HANDLE phandle = GetCurrentProcess();

接下来 - gtavc 的 Miles 子系统会在 GTA 电影之后立即启动所有 ASI 脚本。当带有版权信息的副城标志出现然后结束时,您的代码将执行。因此,要执行您的脚本,您需要:1)检查用户是否已启动游戏(有一个地址,其中包含 1,当菜单被激活时和 0,当菜单被禁用时。检查 gtamodding.com)2)检查用户是否按下了某个键(检查 msdn 上的 GetAsyncKeyState 函数)

关于指针:玩家指针始终指向 CPed 类中玩家对象的地址。对象地址是动态的,但在 vc 中指向播放器对象的指针始终是静态的。因此,要使用指针,您需要: ReadProcessMemory(phandle, (LPVOID)&address, somevalue, sizeof(type_of_value),0); //抱歉可能出现的错误,我现在正在打电话,当我拿到我的电脑时会纠正这个问题)

初学者祝你好运:) 我也在学习 vc 的 asi 脚本

于 2014-05-29T16:54:33.293 回答