为什么我这段程序读不出内存值。我可以用金山游侠找到。也可以用 Winhex 找到。(0分)

  • 主题发起人 主题发起人 inbreak
  • 开始时间 开始时间
I

inbreak

Unregistered / Unconfirmed
GUEST, unregistred user!
请高手帮帮忙

以下为我的源程序源代码。希望执行环境 DELPHI6.0(7.0) + WindowsXP

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Memo1: TMemo;
SpeedButton1: TSpeedButton;
Edit1: TEdit;
Edit2: TEdit;
Memo2: TMemo;
SpeedButton2: TSpeedButton;
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
ProcessHndle : THandle;
ProcessID : integer;
lngHand:Thandle;
i:integer;
lpBuffer:pByte;
nSize: DWORD;
lpNumberOfBytesRead: DWORD;
s:string;
begin
nSize:=8;
I:=$0941eb8;
lpBuffer:=AllocMem(nSize);
LngHand:=findwindow(nil,'加密程序');
ProcessID:=GetWindowThreadProcessID(lngHand,nil);

memo2.Lines.Add ('Process ID '+intTohex(ProcessID,8));
edit1.Text :=intTostr(ProcessID);
ProcessHndle:=OpenProcess(PROCESS_VM_READ,false,ProcessID);

memo2.Lines.Add ('Process Handle '+intTohex(ProcessHndle,8));
ReadProcessMemory(ProcessHndle,Pointer(i),
lpBuffer,nSize, lpNumberOfBytesRead
);
s:=s+intTohex(lpBuffer^,2)+' ';
//读取内容
Memo1.Lines.Add(s);
FreeMem(lpBuffer,nSize);
CloseHandle(ProcessHndle);
//关闭句柄,释放内存
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
memo1.Clear ;
memo2.Clear ;
end;

end.


 
在线等待中~~~~~~~~~~~~~~
 
等待中~~~~~~~~~~~~~~~~~~~
 
在线等待中~~~~~~~~~~~~~~~~~~~~~~~~~~
 
procedureHande对不对?

writeProcessMemory那句执行了没有?

delphi会把一些有危险的指针优化掉。
 
在线等待中~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
faint,

分也不给,问你问题也不回答。

这么简单的程序,设个断点,单步跟一次不就搞定了?
 
你得先判断ReadProcessMemory返回值,如果返回True,就没理由不成功!
若是返回False,表示函数执行失败,当然就什么都没有啦!
 
就是嘛
薄荷说得对
断点调试一下就ok了
 
还要看看你写的进程对不对,和spy++的比较一下。

自己不动手,就知道等待。
 
我是菜鸟嘛。我是VB转过来的。低级VB水平12月20日才转DELPHI的。

所以很多不明,我在这个论坛也没有什么分。

我只要读出里面的值出来。

不需要写。

因为我有一个加密内程序。他的密码在竞然在内存里面可以找到?!

所以呢??我只是想写一个程序。读出那个值出来。

我上面的程序,在9X下有反应。不过值是空的。在XP下面一点反应也没有。所以 ̄ ̄ ̄

谢谢 薄荷 对我的批评。由于小弟我在公司偷偷上网。有时一天都在上,有几天没得上。

所以 ̄ ̄ ̄ ̄真对不起各位呀。。

小弟我请求各位哥哥帮帮小弟!
 
我建议你先用SPY++直接找到'加密程序'的句柄值,然后代入程序中运行,看能否得到正确
的答案
 
只是要读的话,现成的工具很多,probe.还有一个是专门作注册机的。

你这个问题我估计是句柄的值不对。

 
to薄荷:
读值的软件很多。我也说过我用金山游侠。WinHex 都可以读出这个值的。

我只是想自己编写一个读出这个值来。但不知道问题出在何处!

我这个程序读出的进程ID不对。。

我试这个程序时时程是 129 但真实的却是 920

我不明白错在哪里。

to herotjun:
请问 SPY++ 哪里找呀。
 
spy++是vc里的工具,delphi里有winSight代替。
 
唉。问了好久。说了好久,我还是不能明白。

 
在线等待中!~~~~~~~~~~~~~~~~~~
 
出错了!
GetThreadProcessId的返回值是线程ID,那个指针是用来返回进程ID的
 
astros说得对,你连GetThreadProcessId怎么用都不知道,怎么可能正确呢?
DWORD GetWindowThreadProcessId(
HWND hWnd, // handle to window
LPDWORD lpdwProcessId // process identifier
);
返回值是thread id,不是process id.
 
谢谢指教!
 
后退
顶部