200分求助,修改内存地址的值,出现问题,请进,问题解决立即结贴,好人一生平安!

ww94949403 2010-01-30 07:29:50
请先看我的源码↓
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,TLHelp32;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;




implementation

{$R *.dfm}
function GetProcessID(ProcessName:string):TProcessEntry32;
var
lppe: TProcessEntry32;
found : boolean;
Hand : THandle;
P:DWORD;
s:string;

begin
FillChar(result,SizeOf(TProcessEntry32),0);
Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
lppe.dwSize := Sizeof(lppe);

while found do
begin
s := string(lppe.szExeFile);
if lppe.th32ProcessID>0 then
p := lppe.th32ProcessID
else
p := 0;
if UpperCase(ExtractFileName(s))=UpperCase(ExtractFileName(ProcessName)) then
begin
GetProcessID:=lppe;
break;
end;
found := Process32Next(Hand,lppe);
end;
end;


procedure TForm1.Button1Click(Sender: TObject);


var

s,x:integer;
hProcess: THandle;
PID:DWORD;
vNumberOfBytesWritten: DWORD;
Retlppe:TProcessEntry32;



begin
s:=500;
Retlppe := GetProcessID('zzllk.exe');// 查找'****.exe'进程ID

PID:=Retlppe.th32ProcessID;
if PID <> 0 then
begin

hProcess := OpenProcess(PROCESS_ALL_ACCESS, False,PID);

WriteProcessMemory(hProcess,Pointer($0012FEC0), @s,4,PID);

end
else
begin
messagebox(0,'连连看4.1没有开启','错误',MB_OK)
end;
end;

end.



测试游戏,连连看V4.1
测试得分内存地址:0012FEC0
测试修改内存地址0012FEC0的值 WriteProcessMemory(hProcess,Pointer($0012FEC0), @s,4,PID);
S:=500;

可以修改成功..




我把同样的方法放到传奇SF里,就不行了,
传奇SF进程Game2.dat 也可以获取进程ID ,没有错误的,但就是改不了传奇SF一个HP的血量,这是为什么?
我用CE就可以改?
我查了一下午,说内存没有写入权限?需要VirtualProtectEx函数?但是我试了下
VirtualProtectEx(hProcess, Pointer($0012FEC0), 4, PAGE_EXECUTE_READWRITE,@vNumberOfBytesWritten);

加入了这行代码,可以运行,但是还是改不了HP的值

PS.我不会DLL注入

求助,200分,分多分少是个意思,真正是好人一生平安!

等下我在开一个贴子(100分),解决问题一共200分,帮顶帮解决另开贴送分,谢谢!

...全文
532 39 打赏 收藏 举报
写回复
39 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dbWindy 2010-03-19
  • 打赏
  • 举报
回复
gyk120 2010-02-01
  • 打赏
  • 举报
回复
对,这个游戏可能HOOK了一些API,从而造成上面那种结果
获取模块路径使用GetModuleFileName,
如果以NULL参数调用GetModuleFileName,将会返回当前模块的路径.如果在程序主模块(exe)中获得当前模块路径,便可以从当前模块路径中提取程序运行时所在的路径.
ww94949403 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 gyk120 的回复:]
不是啊,一般情况下,修改内存只涉及到Debug权限,其他的权限有很多,比如关机权限,还原权限等,但这些和修改内存都没关系
[/Quote]

恩恩 谢谢 你不说我还迷茫了 哪有那么多权限.

谢谢
gyk120 2010-02-01
  • 打赏
  • 举报
回复
不是啊,一般情况下,修改内存只涉及到Debug权限,其他的权限有很多,比如关机权限,还原权限等,但这些和修改内存都没关系
ww94949403 2010-02-01
  • 打赏
  • 举报
回复
恩 虽然我不理解为什么那几个代码就提权了

虽然我只遇到这一个不能修改内存的例子,

估计以后会遇到很多不能修改内存的时候,要用到各种提权?


呵呵..

总之谢谢你哈...解决了我的大问题~~~谢谢 结贴
gyk120 2010-02-01
  • 打赏
  • 举报
回复
SeDebugPrivilege指的就是debug权限,根据不同的操作可能需要不同的权限
gyk120 2010-02-01
  • 打赏
  • 举报
回复
其实这个道理也很简单,你要修改一个程序的内存,必须要拥有一定的权限,Windows下面,你修改一个程序,必须要Debug权限,那一段代码就是用来提权的,否则OpenProcess会默认拒绝打开其他的进程,因为你权限不够
ww94949403 2010-02-01
  • 打赏
  • 举报
回复
那DLL注入就没意义了

DLL注入就等于和那个进程融合到一起了

融合到一起还得用WriteProcessMemory,那还不如不注入呢是吧

不清楚也罢了


只是为什么把你给我代码放进去

就可以提权


var 
OldTokenPrivileges, TokenPrivileges: TTokenPrivileges;
ReturnLength: dword;
hToken: THandle;
Luid: int64;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
LookupPrivilegeValue(nil, 'SeDebugPrivilege', Luid);
TokenPrivileges.Privileges[0].luid := Luid;
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, False, TokenPrivileges, SizeOf(TTokenPrivileges), OldTokenPrivileges, ReturnLength);
OldTokenPrivileges.Privileges[0].luid := Luid;
OldTokenPrivileges.PrivilegeCount := 1;
OldTokenPrivileges.Privileges[0].Attributes := TokenPrivileges.Privileges[0].Attributes or SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, False, OldTokenPrivileges, ReturnLength, PTokenPrivileges(nil)^, ReturnLength);
end;


你的源码,我发进去了,就可以提权,我很无奈.
以前别人的代码我拿来要这修改那修改的
这个拿过来就可以用了

能解释下吗

解释下结贴了,

回头在开个贴问DLL的事
谢谢啊,,前辈
gyk120 2010-02-01
  • 打赏
  • 举报
回复
如果你的资源分够多的话也可以到这里找找
http://search.download.csdn.net/search/Delphi%20%E5%A4%96%E6%8C%82
gyk120 2010-02-01
  • 打赏
  • 举报
回复
DLL注入后恐怕还是得用WriteProcessMemory,一般来说修改内存还是用WriteProcessMemory居多,而不是想怎么修改就怎么修改
一般来说,个人的经验是,先用CheatEngine这类工具找到HP的地址,然后对这个地址内联汇编进行操作,不过我没写过网游的外挂,目前就弄过单机修改器,对这一块也不是很清楚,据说可以抓数据包然后改数据的。
ww94949403 2010-02-01
  • 打赏
  • 举报
回复
OK那个贴子已经结了
在就是最后一个疑问了

在29的问题..解决完结贴

太谢谢你了
这个问题我弄2天了
ww94949403 2010-02-01
  • 打赏
  • 举报
回复
哈哈 成功了!!!! 根据26楼的代码

成功了~~~

前辈...谢死你了 你快去那个贴子回个贴

然后我28楼这个问题,求解

----------------------------------------------------------
我现在已经DLL注入到了 这个游戏,在游戏按F12也可以呼出我的程序界面,

我现在可以写什么函数能修改内存了?

听别人说,只要DLL注入后,想怎么修改内存就怎么修改?

----------------------------------------------------------

DLL注入后不用WriteProcessMemory的修改方法

DLL注入后怎么方便的修改内存


谢谢前辈

终于成功了好激动
我等下一点点分析你给我的代码的含意
ww94949403 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 gyk120 的回复:]
汗,前辈这两个字就免了,我还真算不上什么前辈
OpenProcess如果返回0的话,可以尝试提权到Debug权限然后再试
procedure SetPrivilege;
var
OldTokenPrivileges, TokenPrivileges: TTokenPrivileges;
ReturnLength: dword;
hToken: THandle;
Luid: int64;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
LookupPrivilegeValue(nil, 'SeDebugPrivilege', Luid);
TokenPrivileges.Privileges[0].luid := Luid;
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, False, TokenPrivileges, SizeOf(TTokenPrivileges), OldTokenPrivileges, ReturnLength);
OldTokenPrivileges.Privileges[0].luid := Luid;
OldTokenPrivileges.PrivilegeCount := 1;
OldTokenPrivileges.Privileges[0].Attributes := TokenPrivileges.Privileges[0].Attributes or SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, False, OldTokenPrivileges, ReturnLength, PTokenPrivileges(nil)^, ReturnLength);
end;
[/Quote]


我现在来试试

前辈就是前辈.
你先把http://topic.csdn.net/u/20100130/19/f29b71f0-95b0-4f33-aac6-c2cee00f60eb.html

这个贴子回个贴,我好结那个贴子



另外.我用DLL注入后在改内存不用这么麻烦了吧?


我现在已经DLL注入到了 这个游戏,在游戏按F12也可以呼出我的程序界面,

我现在可以写什么函数能修改内存了?

听别人说,只要DLL注入后,想怎么修改内存就怎么修改?





你去回贴/``前辈.
gyk120 2010-02-01
  • 打赏
  • 举报
回复
还有一种情况就是他inline hook了NtOpenProcess,这个比较凶残,可能要用到驱动去破解
inline hook可以在冰刃里面查找
gyk120 2010-02-01
  • 打赏
  • 举报
回复
汗,前辈这两个字就免了,我还真算不上什么前辈
OpenProcess如果返回0的话,可以尝试提权到Debug权限然后再试
procedure SetPrivilege;
var
OldTokenPrivileges, TokenPrivileges: TTokenPrivileges;
ReturnLength: dword;
hToken: THandle;
Luid: int64;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
LookupPrivilegeValue(nil, 'SeDebugPrivilege', Luid);
TokenPrivileges.Privileges[0].luid := Luid;
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, False, TokenPrivileges, SizeOf(TTokenPrivileges), OldTokenPrivileges, ReturnLength);
OldTokenPrivileges.Privileges[0].luid := Luid;
OldTokenPrivileges.PrivilegeCount := 1;
OldTokenPrivileges.Privileges[0].Attributes := TokenPrivileges.Privileges[0].Attributes or SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, False, OldTokenPrivileges, ReturnLength, PTokenPrivileges(nil)^, ReturnLength);
end;
ww94949403 2010-02-01
  • 打赏
  • 举报
回复
gyk120前辈,你14楼给代码好象有问题

h := OpenProcess(PROCESS_ALL_ACCESS, false, p); //p 为 进程

这一句,我在21楼说了,返回的句柄是0,你给的这个和我自己的一样,也就是说你给的代码下面的都不能技术运行了.下面 if h > 0 then 直接H就等于0了,

ww94949403 2010-02-01
  • 打赏
  • 举报
回复
如果我用DLL注入后,还会这么麻烦吗?

DLL注入后好象就不用这么麻烦,直接可以修改 该游戏的内存了吗?

如果DLL注入后,用什么函数可以修改/
ww94949403 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 gyk120 的回复:]
对,这个游戏可能HOOK了一些API,从而造成上面那种结果
获取模块路径使用GetModuleFileName,
如果以NULL参数调用GetModuleFileName,将会返回当前模块的路径.如果在程序主模块(exe)中获得当前模块路径,便可以从当前模块路径中提取程序运行时所在的路径.

[/Quote]



有点懂了,这张纸快捅破了,

前辈全去这个贴子回个贴先给你100分,
http://topic.csdn.net/u/20100130/19/f29b71f0-95b0-4f33-aac6-c2cee00f60eb.html

我来测试看看
gyk120 2010-01-31
  • 打赏
  • 举报
回复
你看看用冰刃能不能查出来路径
ww94949403 2010-01-31
  • 打赏
  • 举报
回复
我刚

edit2.Text := IntToStr(hProcess) ;

这样了一下,把hProcess值给了 EDIT2

一看果然是 0


请教,知道路径后就可以通过进程ID获得进程句柄了是吧?

这个游戏把路径隐藏起来了是么
加载更多回复(18)
发帖
Windows SDK/API

1177

社区成员

Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
帖子事件
创建了帖子
2010-01-30 07:29
社区公告
暂无公告