首页
社区
课程
招聘
编程方面的小问题,编程高手请进
发表于: 2004-8-11 19:55 6478

编程方面的小问题,编程高手请进

2004-8-11 19:55
6478
因为没有编程版,不得已发在这里,请见谅。

如下面程序,窗口句柄和Process ID都可以得到,但是
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
这一行执行后得到的总是零,为什么?我的系统是XP
hwnd和pid都可以得到值,但是pHandle就总是0.不知道这是为什么?我想要对某程序的固定内存地址写入,如果这个方法不行,有没有别的方法?

Dim hwnd As Long ' 储存 FindWindow 函数返回的句柄
Dim pid As Long ' 储存进程标识符( Process Id )
Dim pHandle As Long ' 储存进程句柄

hwnd = FindWindow(vbNullString, "计算器")
If (hwnd = 0) Then
MsgBox "Window not found!"
Exit Sub
End If

GetWindowThreadProcessId hwnd, pid

pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)

If (pHandle = 0) Then
MsgBox "Couldn't get a process handle!"
Exit Sub
End If

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (21)
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
2
跟到这行pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
看看pid与任务管理器中的pid是否相同?

试一下我那个工具Dirapi看不能改指定进程的内存内容
2004-8-11 21:25
0
雪    币: 176
活跃值: (100)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
谢谢你。
是相同的。我有在这行一前面弄一个text=pid,和进程管理器中的PID是一样的,就是这一句得不到结果,不知道怎么回事。
2004-8-11 22:36
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
4
试试 OpenProcess(16, 0, pid)
2004-8-11 22:51
0
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
5
最初由 波导终结者 发布
谢谢你。
是相同的。我有在这行一前面弄一个text=pid,和进程管理器中的PID是一样的,就是这一句得不到结果,不知道怎么回事。


提升一下本进程的权限,再openprocess.如果还不行,试一下获取出错信息
2004-8-11 23:18
0
雪    币: 176
活跃值: (100)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
谢谢二位。
使用
OpenProcess(16, 0, pid)
不再报错,应该是成功了。
能告诉我为什么要这样写吗?

接下来的问题,我要修改某游戏中的4FCBD0内存地址为数值0
WriteProcessMemory pHandle, &H4FCBD0, "0", 2, 2&
我是这样写的,但是并未成功。使用游戏修改器看内存,并未被修改。请问我哪里写错了?把后面的2改成1也是没写入。
2004-8-11 23:44
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
7
你的参数类型有问题,声明API的时候不要用系统提供的默认参数类型,应该是:
Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long    (注意变量的参数类型)

这是我以前写的一个:
Dim p1 As Long
p1 = &HB8
WriteProcessMemory pHandle, &H40360F, p1, 2, 0&
2004-8-12 00:50
0
雪    币: 176
活跃值: (100)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
8
谢谢你。
我把语句改成:
Dim p1 As Long
p1 = &HB8
WriteProcessMemory pHandle, &H4FCBD0, p1, 2, 0&
但是执行以后,内存地址未发生变化。
是否因为我的系统是XP,需要提高权限?该怎么做呢?

语句
OpenProcess(16, 0, pid)
的原理是什么?
谢谢。
2004-8-12 10:52
0
雪    币: 176
活跃值: (100)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
9
顶下。
2004-8-15 20:59
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
#define PROCESS_VM_READ           (0x0010)
2004-8-15 23:15
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
//提升权限
void EnableDebugPriv( void )
{
        HANDLE hToken;
        LUID sedebugnameValue;
        TOKEN_PRIVILEGES tkp;
       
        if ( ! OpenProcessToken( GetCurrentProcess(),
                TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
                return;
        if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) ){
                CloseHandle( hToken );
                return;
        }
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Luid = sedebugnameValue;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
                CloseHandle( hToken );
}
使用方法:
EnableDebugPriv();
HANDLE hWnd = ::OpenProcess PROCESS_ALL_ACCESS,FALSE,m_notepadID);
2004-8-15 23:21
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
12
我写的那个在XP里面的确不好用
用一下mhsong的这个.应该可以的
2004-8-16 01:44
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
13
WriteProcessMemory pHandle, &H4FCBD0, "0", 2, 2&
------------------
DWORD是4BYTE,你这样写了2BYTE的字符"0"+NULL吧
2004-8-16 07:59
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
14
最初由 forgot 发布
WriteProcessMemory pHandle, &H4FCBD0, "0", 2, 2&
------------------
DWORD是4BYTE,你这样写了2BYTE的字符"0"+NULL吧


长度好像没关系.随便写个数就可以.好像是这样
但是"0"设置成string是很不可取得
2004-8-16 11:42
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
15
最初由 nbw 发布



长度好像没关系.随便写个数就可以.好像是这样
但是"0"设置成string是很不可取得

谬论。
2004-8-16 12:29
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
16
最初由 forgot 发布

谬论。


多谢大虾指正,我有试验了一下,长度果真不可以随便填写.看来VB语法要求没我想象中那么松
2004-8-16 13:41
0
雪    币: 176
活跃值: (100)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
17
嗯,原来是我写错了。
我已经成功了,谢谢大家!
2004-8-17 17:18
0
雪    币: 176
活跃值: (100)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
18
最初由 mhsong 发布
//提升权限
void EnableDebugPriv( void )
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;

if ( ! OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return;
if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) ){
CloseHandle( hToken );
return;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
CloseHandle( hToken );
}
使用方法:
EnableDebugPriv();
HANDLE hWnd = ::OpenProcess PROCESS_ALL_ACCESS,FALSE,m_notepadID);


收藏。
果然是权限不够。
还有我的写入也有问题
谢谢大家,这里高手真多,问了N个地方,还是在这里得到解答,谢谢!
2004-8-17 17:22
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
VB就是不一样啊,跨进程读写都不用去掉内存读写保护??有意思!不过用Delphi编就更容易了!!
2004-8-17 22:29
0
雪    币: 201
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
木马?
2004-8-18 00:11
0
雪    币: 186
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
最初由 lordor 发布
跟到这行pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
看看pid与任务管理器中的pid是否相同?

试一下我那个工具Dirapi看不能改指定进程的内存内容


Dirapi是甚么工具?
2004-8-18 12:08
0
雪    币: 186
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
lorder你的主页打不开……
2004-8-18 12:10
0
游客
登录 | 注册 方可回帖
返回
//