C#调用API函数VirtualProtectEx总是返回0 这是一个植物大战僵尸的游戏修改器..

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#调用API函数VirtualProtectEx总是返回0 这是一个植物大战僵尸的游戏修改器..相关的知识,希望对你有一定的参考价值。

为什么调用VirtualProtectEx函数后总是返回0,
获取的句柄是绝对没有问题的..
以下是代码:

[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(UInt32 dwDesiredAcess, Int32 bInheritHandle, UInt32 dxProcessId);

[DllImport("kernel32.dll")]
public static extern int VirtualProtectEx(IntPtr hWnd, uint[] lpAddress, Int32 dwSize, Int32 flNewProtect, Int32 lpflOldProtect);

private void button1_Click(object sender, EventArgs e)

uint[] ads_ps = 0x41ba74 ;//起始地址
Int32 xiugaiqian=0; //放置修改前的保护方式
int temp = 0; //放置VirtualProtectEx函数的返回值
System.Diagnostics.Process[] PinCallProcessId = System.Diagnostics.Process.GetProcessesByName("PlantsVsZombies");//获取进程ID
if (PinCallProcessId.Length != 0)

IntPtr hWnd = OpenProcess(0x1F0FFF, 0, (UInt32)PinCallProcessId[0].Id); //获取进程句柄
temp = VirtualProtectEx(hWnd, ads_ps, 2, 4, xiugaiqian); //执行VirtualProtectEx函数
MessageBox.Show(temp.ToString());

参考技术A OpenProcess方法错了

OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。

HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);

在输入访问权限时错误 0为默认 dwDesiredAccess 要采用读写权限
PROCESS_VM_READ or PROCESS_VM_WRITE
参数说明:
dwDesiredAccess: 指定打开后,该进程的访问权限
PROCESS_ALL_ACCESS 给予进程所有可能允许的权限.
PROCESS_DUP_HANDLE允许使用DuplicateHandle函数进行进程句柄的复制操作.
PROCESS_QUERY_INFORMATION允许函数GetExitCodeProcess 或函数GetPriorityClass functions 查询进程的信息时使用该句柄.
PROCESS_SET_INFORMATION允许函数SetPriorityClass使用此句柄进行优先级设置.
PROCESS_TERMINATE允许函数TerminateProcess 使用此句柄关闭进程.
PROCESS_VM_OPERATION 允许函数VirtualProtectEx使用此句柄修改进程的虚拟内存.
PROCESS_VM_READ or PROCESS_VM_WRITE 允许函数访问和写入权限
SYNCHRONIZE Windows NT 专用: 允许同步函数使用此句柄.追问

请问OpenProcess函数哪里错了??
第一个参数的PROCESS_ALL_ACCESS不是等于0x1F0FFF吗?
而且我用我上面的OpenProcess返回的进程句柄可以读取内存地址的值..请问是哪里错??

也谢谢你了...就是因为声明的时候声明错了..~`!感谢感谢....已经解决了

参考技术B 最后一个参数引用类型 ref 就可以了
给分本回答被提问者采纳

如何从托管 C# 代码调用 SystemParametersInfoW 函数

【中文标题】如何从托管 C# 代码调用 SystemParametersInfoW 函数【英文标题】:How to call SystemParametersInfoW function from Managed C# code 【发布时间】:2019-02-14 14:42:31 【问题描述】:

我希望运行来自 C++ API 的 SystemParametersInfoW 函数。 (https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-systemparametersinfow#return-value)。

但是,此方法需要从 C# 应用程序运行。

下面链接的 Microsoft pinvoke 示例对我来说毫无意义。 (https://docs.microsoft.com/en-us/cpp/dotnet/calling-native-functions-from-managed-code?view=vs-2017)

我该怎么做?我对 C++ 比较陌生。

谢谢。

【问题讨论】:

为什么你需要使用SystemParametersInfoW,你确定没有c#等价物吗? 为什么不直接使用docs.microsoft.com/en-us/dotnet/api/…? 【参考方案1】:

我还没有测试过,但是这样的东西应该可以工作:

[DllImport("user32"), CharSet=CharSet::Ansi)]
extern "C" bool SystemParametersInfoW(
  uint  uiAction,
  uint  uiParam,
  IntPtr pvParam,
  uint  fWinIni
);

一般:

[DllImport(<dll-file of function>]
extern "C" return_value function_name(<function_parameters>);

【讨论】:

[DllImport("user32"), CharSet=CharSet::Ansi)] extern "C" bool SystemParametersInfoW WinAPiFunctionW 不是安西..

以上是关于C#调用API函数VirtualProtectEx总是返回0 这是一个植物大战僵尸的游戏修改器..的主要内容,如果未能解决你的问题,请参考以下文章

高分求助:C#中如何调用UpdateResource这个API函数!

(74)C#里怎么样调用WIN API的函数时实现回调函数

(72)C#里怎么样调用WIN API的函数

函数失败后我是不是应该重新调用 API 函数并在 c# 中刷新我的访问令牌?

C#函数调用baidu或google地图API

C#调用user32.dll Win32的API函数