首页
社区
课程
招聘
[求助]如何改写某进程的数据(头疼※※)
发表于: 2007-8-3 02:14 7546

[求助]如何改写某进程的数据(头疼※※)

2007-8-3 02:14
7546
现在我有一个进程的句柄、id等等,我还知道一个他的内部地址(开线程用的地址),我想把内存中的这个地址的内容改掉,请问怎样实现?我找了很多资料,但是也不清楚writeprocessmemory等函数的用法。关于基地址,网上的资料大都没说明白。
我只是想在运行时改他的一个数据,就像游戏修改器一样。
谢谢哪位能指点一下!

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

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
2
前提你得有权限修改
BOOL WriteProcessMemory(
  HANDLE hProcess,  // handle to process whose memory is written to
  LPVOID lpBaseAddress,
                    // address to start writing to
  LPVOID lpBuffer,  // pointer to buffer to write data to
  DWORD nSize,      // number of bytes to write
  LPDWORD lpNumberOfBytesWritten
                    // actual number of bytes written
);
2007-8-3 06:56
0
雪    币: 431
活跃值: (442)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
3
修改器的例子,其中第二篇是修改代码的.
BLOG地址:
http://blog.csdn.net/prince_vegeta/archive/2005/03/02/308025.aspx
http://blog.csdn.net/prince_vegeta/archive/2005/03/02/308047.aspx
或:
http://vegeta.blog.enorth.com.cn/article/865.shtml
http://vegeta.blog.enorth.com.cn/article/875.shtml
2007-8-3 10:47
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
先ZwOpenProcess,然后得到ProcessHandle再ZwWriteVirtualMemory/ZwReadVirtualMemory
搞定后记得ZwClose
2007-8-3 11:18
0
雪    币: 196
活跃值: (96)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
内存默认只读,修改内存之前需要先用VirtualProtect 把要修改的内存块改成可写
2007-8-3 12:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
但是我无法获得正在运行的程序的可写权限。我要改的是可执行的内存段
2007-8-4 00:18
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
7
你都没试,怎么能获得正在运行程序的可写权限啊 .
一般的应用程序是可以获得的.
这是个简单的例子
先打开计算器
.386
.model flat ,stdcall
option        casemap:none

include windows.inc
include user32.inc
includelib user32.lib
include        kernel32.inc
includelib kernel32.lib

.data?
hProcess dd ?
dwProcessID dd ?

.const
szName db '计算器',0
szBuffer db 50h

.code
start:
invoke FindWindow,NULL,addr szName
invoke GetWindowThreadProcessId,eax,offset dwProcessID
invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,dwProcessID
mov hProcess,eax
mov ecx,010021ACh
invoke WriteProcessMemory,hProcess,ecx,addr szBuffer,1h,NULL
end start
2007-8-4 09:54
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
8
bithaha的就可以了吧!
2007-8-4 09:58
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
ZwProtectVirtualMemory?
2007-8-4 19:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我不是没试,你的那几句我早试过了根本不行
2007-8-7 23:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我试了根本不行。
2007-8-7 23:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
你看一下几篇HOOK API的文章就可以了

这里面有很多,如: 汇编ring3下实现HOOK API【原创】    

它里面用的是修改内存的方法来HOOK API的,你可以参考下

;============================下面是核心部分=========================

WriteApi proc Process:DWORD ,Papi:DWORD,Ptype:DWORD,Psize:DWORD

LOCAL mbi:MEMORY_BASIC_INFORMATION
LOCAL msize:DWORD

;返回页面虚拟信息
invoke VirtualQueryEx,Process, Papi,addr mbi,SIZEOF MEMORY_BASIC_INFORMATION

;修改为可读写模式

invoke VirtualProtectEx,Process, mbi.BaseAddress,8h,PAGE_EXECUTE_READWRITE,addr

mbi.Protect

;开始写内存

invoke  WriteProcessMemory,Process, Papi, Ptype,Psize ,NULL

PUSH eax

;改回只读模式

invoke VirtualProtectEx,Process,mbi.BaseAddress,8h,PAGE_EXECUTE_READ,addr mbi.Protect

pop eax

ret

WriteApi endp

=======================
你可以直接引用

WriteApi proc
Process:DWORD ,   //进程句柄
Papi:DWORD,          //写入起点
Ptype:DWORD      //写入内容
,Psize:DWORD    //写入大小
2007-8-9 23:29
0
游客
登录 | 注册 方可回帖
返回
//