VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 217|回复: 5

[已解决]植物大战僵尸阳光值修改调用WriteProcessMemory函数调用失败 求大神指点

[复制链接]
37_avatar_middle
最佳答案
0 
在线会员 发表于 2020-12-14 20:46:18 | 显示全部楼层 |阅读模式
本帖最后由 猫咪没有鱼 于 2020-12-14 20:49 编辑

进程权限调用的是PROCESS_ALL_ACCESS, 内存可以读,但是写入总是失败,跪求各位大佬指点!!!植物大战僵尸阳光值修改调用WriteProcessMemory函数调用失败 求大神指点

附件上面是 本菜鸟的源代码。

include <Windows.h>
#include "resource.h"

#define SUN_SHINE_BASE_ADDR 0x006A9EC0
#define SUN_SHINE_OFFSET_FIRST 0x768
#define SUN_SHINE_OFFSET_SECOND 0x5560

HWND hWnd;
HANDLE hProcessRet;
DWORD dwSize;
DWORD dwProcessID;
DWORD dwThreadID;
DWORD dwSunShineBaseAddress;
DWORD dwSunShineBaseAddressValue;
DWORD dwSunShineOffsetFirst;
DWORD dwSunShineOffsetFirstValue;
DWORD dwSunShineOffsetSecond;
DWORD dwSunShineOffsetSecondValue;
BOOL blTranslated;
UINT uRet;




void Initializationvariable();


BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);



int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
        Initializationvariable();
        DialogBox(hInstance, (LPCSTR)101,NULL,DialogProc);
        return 0;
}



BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        switch (uMsg)
        {
        case WM_COMMAND:
                switch (wParam)
                {
                case IDCHECK:
                {
                        hWnd = FindWindow(TEXT("MainWindow"), TEXT("植物大战僵尸中文版"));
                        dwThreadID = GetWindowThreadProcessId(hWnd, &dwProcessID);
                        if (dwThreadID != 0)
                        {
                                MessageBox(NULL, TEXT("本辅助适合此游戏版本!!!"), TEXT("Congratulation!!!"), MB_OK);
                        }
                        else
                        {
                                MessageBox(NULL, TEXT("游戏未运行或本辅助不适合此游戏版本,请下载符合您游戏版本的辅助!!!"), TEXT("ERRO TIPS!!!"), MB_ICONERROR);
                        }
                        SetDlgItemInt(hwndDlg, IDC_GMPROCESSID, dwProcessID, FALSE);
                        SetDlgItemInt(hwndDlg, IDC_GMTHREADID, dwThreadID, FALSE);
                }
                        break;
                case IDEXIT:
                        EndDialog(hwndDlg, IDEXIT);
                        break;
                case IDC_CHANGESBUTTON:
                         uRet = GetDlgItemInt(hwndDlg, IDC_CHANGESVEDIT, &blTranslated, FALSE);
                       
                        hProcessRet = OpenProcess(PROCESS_ALL_ACCESS, 0, dwProcessID);
                        if (hProcessRet == NULL)
                        {
                                MessageBox(hwndDlg, TEXT("进程打开失败!"), TEXT("ERROR Tips!"), MB_OK);
                        }
                        ReadProcessMemory(hProcessRet, (LPCVOID)dwSunShineBaseAddress, &dwSunShineBaseAddressValue, sizeof(DWORD), &dwSize);
                        ReadProcessMemory(hProcessRet, (LPVOID)(dwSunShineBaseAddressValue + dwSunShineOffsetFirst), &dwSunShineOffsetFirstValue, sizeof(DWORD), &dwSize);
                        ReadProcessMemory(hProcessRet, (LPVOID)(dwSunShineOffsetFirstValue + dwSunShineOffsetSecond), &dwSunShineOffsetSecondValue, sizeof(DWORD), &dwSize);

                        WriteProcessMemory(hProcessRet, (LPVOID)dwSunShineOffsetSecondValue, &uRet, sizeof(DWORD), &dwSize);


                }
       

       
        }


        return FALSE;
}

void Initializationvariable()
{
        hWnd = NULL;
        hProcessRet = 0;
        dwSize = 0;
        dwProcessID = 0;
        dwThreadID = 0;
        dwSunShineBaseAddress = SUN_SHINE_BASE_ADDR;
        dwSunShineBaseAddressValue = 0;
        dwSunShineOffsetFirst = SUN_SHINE_OFFSET_FIRST;
        dwSunShineOffsetFirstValue = 0;
        dwSunShineOffsetSecond = SUN_SHINE_OFFSET_SECOND;
        dwSunShineOffsetSecondValue = 0;
}



最佳答案
70_avatar_small
2020-12-15 09:20:11
WriteProcessMemory似乎没有问题,可以GetLastError看看什么错误,
最好用CE看一下,你dwSunShineOffsetSecondValue地址是否可以用CE更改,
怀疑dwSunShineOffsetSecondValue定位到了不可写的地址上了




上一篇:MFC类之间数据传递的问题
下一篇:wchar_t* P = new wchar_t[100]什么意思
19_avatar_middle
最佳答案
12 
在线会员 发表于 2020-12-15 00:16:02 | 显示全部楼层
本帖最后由 236a 于 2020-12-15 00:31 编辑

WriteProcessMemory的第二个参数  LPVOID  lpBaseAddress,  不要用VOID强制转    用BYTE字节类型

写入大小 你也填错了  定义UING  你填的DWORD

0x400.. 直接用的十六进制 你用变量 需要byte转

第四个参数是实际写入了多少可以不用管直接填0

int value=123456;
WriteProcessMemory(打开进程的句柄, 0x00400000, &value, sizeof(value),0);

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small thzzl + 2 + 2 很给力!

查看全部评分

70_avatar_middle
最佳答案
28 
在线会员 发表于 2020-12-15 09:20:11 | 显示全部楼层    本楼为最佳答案   
bestAnswer
WriteProcessMemory似乎没有问题,可以GetLastError看看什么错误,
最好用CE看一下,你dwSunShineOffsetSecondValue地址是否可以用CE更改,
怀疑dwSunShineOffsetSecondValue定位到了不可写的地址上了

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small thzzl + 2 + 2 很给力!

查看全部评分

37_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-12-14 20:56:37 | 显示全部楼层
这个是源代码

源代码.rar

29.13 KB, 下载次数: 1

08_avatar_middle
最佳答案
9 
在线会员 发表于 2020-12-14 21:09:45 | 显示全部楼层
欸。可惜没有这个游戏。
37_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-12-15 18:47:29 | 显示全部楼层
tony666 发表于 2020-12-15 09:20
WriteProcessMemory似乎没有问题,可以GetLastError看看什么错误,
最好用CE看一下,你dwSunShineOffsetSe ...

GetLastError   返回值  998  看来确实是 内存访问失效了。。。。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2021-1-17 04:35

Powered by CcTry.CoM

© 2009-2020 cctry.com

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