如何在特定的内存写入数据?

lenga1 2008-04-11 05:06:11
比如说我想在自身程序内存的123456地址处写入数据为"100",该怎么做啊?
假设这个数据地址原本是没有初始化也没有被使用过的。。。
...全文
184 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
daixiulin 2008-05-26
  • 打赏
  • 举报
回复
up
大大怪老张 2008-05-26
  • 打赏
  • 举报
回复
直接往指定地址上写? 这需求真够操蛋的。
anypsky 2008-05-24
  • 打赏
  • 举报
回复
WriteProcessMemory 用这个貌似可以,呵呵,暂时没领悟LZ的意思。。
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
不明LZ在说什么
knowledge_Is_Life 2008-04-30
  • 打赏
  • 举报
回复
关注 接分
LIANGQIAN1984 2008-04-15
  • 打赏
  • 举报
回复
up
lenga1 2008-04-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 fasmot 的回复:]
引用 11 楼 lenga1 的回复:
引用 9 楼 sheenl 的回复:
Delphi(Pascal) codevarpi : PInteger;beginpi :=PInteger($123456);
pi^ :=5;//如果$123456是个非法地址, 程序就会崩溃.end;
当然$123456确实是个非法地址, 所以这段程序会崩溃. 你先要找到一个合法的地址, 才能这么做.



那怎么让$123456这个原本不存在的非法地址变成合法的呢?

楼上的是通过a的地址来修改a的值吧,这个时候a的地址是已经初始化的合法地址了

[/Quote]
直接Write的试过了,写不进去。。。
汇编的还没测。。。

VirtualQuery我试的时候好像也没成功(反正是跟这个差不多名字的一个函数,不过代码丢了。。。)。。。也偶可能是我的方法不对。。。
UndefinedCoder 2008-04-12
  • 打赏
  • 举报
回复
VirtualQuery
fasmot 2008-04-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lenga1 的回复:]
引用 9 楼 sheenl 的回复:
Delphi(Pascal) codevarpi : PInteger;beginpi :=PInteger($123456);
pi^ :=5;//如果$123456是个非法地址, 程序就会崩溃.end;
当然$123456确实是个非法地址, 所以这段程序会崩溃. 你先要找到一个合法的地址, 才能这么做.



那怎么让$123456这个原本不存在的非法地址变成合法的呢?

楼上的是通过a的地址来修改a的值吧,这个时候a的地址是已经初始化的合法地址了
但是如果我想使用$1…
[/Quote]

只是演示下修改某内存地址
你把
WriteProcessMemory(hProcess, Pointer(p), @b, 4, lpNumberOfBytesRead);
p换成$123456不就可以了?

或者直接
asm
mov [$123456],1
end;
修改之前最好读一下那个地址,如果不为0最好就不要写了
喝口水 2008-04-12
  • 打赏
  • 举报
回复
指针很有用,但是却不能乱用,否则会死的。。。
oosmile 2008-04-12
  • 打赏
  • 举报
回复
没有关系吧,分配有4G的内存啊,主要不要超了啊
fasmot 2008-04-12
  • 打赏
  • 举报
回复
var
a:dword;

procedure TForm1.Button1Click(Sender: TObject);
var
hwnd,hPID,hProcess,lpNumberOfBytesRead,b:dword;
p:Pointer;
begin
a:=123;
b:=1;
p:=@a;
hwnd:= FindWindow(nil,'Form1');
GetWindowThreadProcessId(hwnd, @hPID);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, hPID);
WriteProcessMemory(hProcess, Pointer(p), @b, 4, lpNumberOfBytesRead);
CloseHandle(hProcess);
showmessage(inttostr(a));
end;
sheenl 2008-04-12
  • 打赏
  • 举报
回复

var
pi : PInteger;
begin
pi := PInteger(Integer(@pi) + 400);
pi^ := 100;
ShowMessageFmt('%x - %x', [Integer(pi), pi^]);
end;

这个程序, 在栈上乱改数据, 可能也能运行, 当然你要是把
PInteger(Integer(@pi) + 400);
改成
PInteger(Integer(@pi) + 40000);

一定会死得很难看.
sheenl 2008-04-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lenga1 的回复:]
引用 9 楼 sheenl 的回复:
Delphi(Pascal) codevarpi : PInteger;beginpi :=PInteger($123456);
pi^ :=5;//如果$123456是个非法地址, 程序就会崩溃.end;
当然$123456确实是个非法地址, 所以这段程序会崩溃. 你先要找到一个合法的地址, 才能这么做.



那怎么让$123456这个原本不存在的非法地址变成合法的呢?

楼上的是通过a的地址来修改a的值吧,这个时候a的地址是已经初始化的合法地址了
但是如果我想使用$1…
[/Quote]
操作系统保证你说的访问方法不能发生, 如果你一定想这么做, 请自己写一个允许这种操作的操作系统.(某些操作系统在栈区, 如果你强行访问非法的内存区, 有可能会自动为你分配内存, 保证这种操作的顺利完成)
lenga1 2008-04-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sheenl 的回复:]
Delphi(Pascal) codevarpi : PInteger;beginpi :=PInteger($123456);
pi^ :=5;//如果$123456是个非法地址, 程序就会崩溃.end;
当然$123456确实是个非法地址, 所以这段程序会崩溃. 你先要找到一个合法的地址, 才能这么做.

[/Quote]

那怎么让$123456这个原本不存在的非法地址变成合法的呢?

楼上的是通过a的地址来修改a的值吧,这个时候a的地址是已经初始化的合法地址了
但是如果我想使用$123456这个没有被系统初始化过的地址,该怎么办呢?
sheenl 2008-04-11
  • 打赏
  • 举报
回复

var
pi : PInteger;
begin
pi := PInteger($123456);
pi^ := 5; //如果$123456是个非法地址, 程序就会崩溃.
end;

当然$123456确实是个非法地址, 所以这段程序会崩溃. 你先要找到一个合法的地址, 才能这么做.
lihuasoft 2008-04-11
  • 打赏
  • 举报
回复
别误会
退出讨论,是因为问题涉及的领域已经超出我的能力范围

灌水.... 我一般不灌水的

帮你顶吧。

^_^
lenga1 2008-04-11
  • 打赏
  • 举报
回复
老兄,不用这样吧,灌水也欢迎啊~
lihuasoft 2008-04-11
  • 打赏
  • 举报
回复
楼主:

我又改变看法了:你的行为不简单!

这就是我说的非正常途径!

俺才疏学浅,退出本贴讨论。
lenga1 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lihuasoft 的回复:]
Delphi(Pascal) codevarX: integer;procedureTForm1.Button1Click(Sender: TObject);varP : ^Integer;beginP :=@X;
Showmessage(Format('%p', [P]));{P的内容,即X的地址} //在我这里,P的内容即X的地址是12F5D0
P^ :=9999;
Showmessage(inttostr(X));end;
[/Quote]

现在X的地址是12F5D0,应该是由编译器指定的吧
现在我想让X的地址变成123456。 //12F5D0--我变-->123456
或者生成另外一个变量Y:integer,强制Y使用123456这个地址,再Y:=9999;
就是这个样的了~
加载更多回复(4)
db服务器连接mysql+redis高可用高性能框架干货1、使用c++语言,vs2019开发垮平台[windows和linux]连接MySql和redis框架。2、使用MySql持久化玩家数据,redis做玩家数据缓存层,redis不做数据持久化。mysql搭配redis工作效率非常高效,就好比男女搭配干活不累,没有redis,mysql也能独立很好的完成用户读写请求。有了redis,用户访问数据的效率更高,时间更短,快速的完成请求。3、讲解如何保持mysql和redis数据强一致性策略,并在代码里实现。每次启动redis,使用管道技术,从mysql批量导入活跃用户数据到redis中,并设置过期时间.4、教程使用线程池技术,每个线程拥有自己独立的数据,线程绑定类。每一个实例就包含一个线程每个线程数据里包含:mysql连接器、redis连接器、内存回收池、安全的串行队列、条件变量、互斥量保证线程内的数据安全。5、工作原理:没有请求时,各个工作线程处于休眠状态。有读写请求时,从线程池获取一个线程,添加读写请求,把数据推送到线程工作队列中。然后工作线程获取队列的数据,进行串行工作任务安排,进行mysql数据库读写操作,以及redis读写数据操作,当完成工作任务时,执行下一个工作任务,同时把处理结果推送到逻辑线程,把数据给用户。6、用户读数据策略:用户获取数据首先是先从redis查找数据,redis命中,返回数据给玩家,redis命中失败,mysql中查找数据,然后写入数据到redis中,返回数据给用户。7、用户写数据策略:用户先从redis中删除数据,然后写数据到mysql中,最后再把数据写入到redis中,保持数据一致性。8、教程是一个干货教程,不是新手教程,mysql基础语法讲解的少,redis有讲解基础系列。教程讲解的是如何搭建一个支持高并发,高性能的读写数据库框架,使用mysql+redis搭配的高可用、高性能框架。该套框架在多个项目使用过,也在棋牌类项目里面使用过。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧