Lua C API中使用自定义函数编辑内存

我正在尝试使用luaC api中的自定义函数来编辑内存,但例如,当我执行3个lua_tonumber(LS,-1)时,它会混乱吗? 请尝试查看我的代码并告诉我如何解决此问题。

lua_State *L;

using namespace std;

DWORD MyGetProcessId(LPCTSTR ProcessName)
{
    PROCESSENTRY32 pt;
    HANDLE hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    pt.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(hsnap,&pt)) {
        do {
            if (!lstrcmpi(pt.szExeFile,ProcessName)) {
                CloseHandle(hsnap);
                return pt.th32ProcessID;
            }
        } while (Process32Next(hsnap,&pt));
    }
    CloseHandle(hsnap);
    return 0;
}

int CustomGetProcessByName(lua_State* Ls) {
    DWORD dieman = MyGetProcessId(lua_tostring(Ls,-1));

    lua_pushvalue(Ls,dieman);

    return 1;

}
int CustomWriteMemInt(lua_State* Ls) {

    HANDLE ProcHand = OpenProcess(PROCESS_ALL_ACCESS,FALSE,lua_tonumber(Ls,-1));
    int Value = lua_tonumber(Ls,-3);
    WriteProcessMemory(ProcHand,(LPVOID)lua_topointer(Ls,-2),&Value,sizeof(Value),0);

    return 1;

}

void Load() {
    L = luaL_newstate();
    lua_register(L,"GetProcByName",CustomGetProcessByName);
    lua_register(L,"WriteMemInt",CustomWriteMemInt);

}
int main() {
    Load();
    luaL_dostring(L,"a = GetProcByName('ac_client.exe')");
    luaL_dostring(L,"WriteMemInt(a,0x0293AA60,9999)");
    system("Pause");
}

我知道写内存函数有效,因为我没有使用它。

点赞
用户5494370
用户5494370

lua_topointer 返回一个指向 lua 对象的指针。在这种情况下,您只需要使用 lua_tonumber

需要注意的是,数字通常是双精度浮点数,因此无法保存 64 位地址,不过在您的示例中应该可以工作,因为该地址似乎是 32 位的。

2020-03-07 06:06:53