怎样读取一个应用程序区的内容(200分)

  • 主题发起人 主题发起人 ridle
  • 开始时间 开始时间
R

ridle

Unregistered / Unconfirmed
GUEST, unregistred user!
请教:
我想编一个程序,让它能够访问其他正在运行的一个程序在内存中的
内容。不知道怎样可以做到这点。例如:现在有一个任务"记事簿",
我想得到它这个任务所占用的内存中的内容。
我自己也知道这是不建议的编程手法,但是我有一特殊用途,必须
要这麽做。试了好多方法,都不行。

MyEmail:jhj@990.net
 
好象不能吧? 32位系统中各进程的代码段是保护的, 如果你级别不够没法访问的.
除非你象softice那样在config.sys中加载, 获得系统级特权指令, 或者自己编个
shell运行指定的程序, 才能访问该程序代码段
 
我想应该可以,否则FPE6.0(整人专家)是如何做到的。
 
Hehe, Set your application as a DEBUGAPP, then if you have the previllege to debug(NT),
you can watch any program if you like, :)
 
可访问该程序代码段,使用API函数 GetCSAliaseDS。也不用什么系统级
的权限,其实我想实现方法可以是:得到这个任务的32位
shell运行指定的程序, 才能访问该程序代码段实例句柄,再设置一个
选择子,让它的基地址为这个实例的BASE,然后再把它的Limit设置为
你想要的范围,用这个选择子生成一个指针,用这个指针按道理就可以
访问这个任务的内存内容了。可我试了很多次都不行。也不知错再哪儿了,
请各位指教指教。
 
可访问该程序代码段,使用API函数 GetCSAliaseDS。也不用什么系统级
的权限,其实我想实现方法可以是:得到这个任务的32位
shell运行指定的程序, 才能访问该程序代码段实例句柄,再设置一个
选择子,让它的基地址为这个实例的BASE,然后再把它的Limit设置为
你想要的范围,用这个选择子生成一个指针,用这个指针按道理就可以
访问这个任务的内存内容了。可我试了
 
If you are running NT, then you must use DEBUG APP to do this job, :)
I have an example shows how to write a Debug APP, :)
 
我见过一个访问任意内存块的程序示例,不过,我得找找。

另外,你可以用物理方法(嘿嘿,有些黑暗。不过,我搞反病毒的,这是从
敌人那儿学的。),你可以用DPMI访问Win32分配的每一个段,最大可达2G的
内存。然后seek,seek,seek,就到了。 :)
 
可以看Jeff Rither的<Windows NT高级编程>最后几章,有详细例子
我手头一时没有,查到再贴上来吧
 
使用 WWW.NEASE.NET/~DCE页面中的
http://www.nease.net/~dce/Tvichw32.zip
控件即可完成物理地址的读取
 
rockboy说的对,是一定可以的。
aimingoo讲的也对,关键是怎样将这样一个实例句柄和
指向物理内存的指针联系起来(BASE和Limit)。如果
你知道怎么做,还麻烦你给出一小段代码(C或PAS都
可以)。
jiangtao说有例子,可惜我手头没有这本书。希望你能早一点
贴上来。
李亚平 介绍的控件是个好东西,可我要求的不是浏览整个内存,
我要的是某个任务实例占用的内存。如果能够知道这块
内存的物理地址的范围,再用此控件就很容易了。
 
To aimingtao,找到了没有,如果有的话,请告知那里下载,谢谢。
TO ridle,cstods是16位的,用Thunk试试,深度历险有例子w32d16.zip,不过我不想用。
 
目前,刚巧我也碰到这个问题,现将我研究得出的一些结果叙述如下,

TO ridle:你的方法在win31(286模式)下是行得通的,但在win95(386模式)下不行.
TO rockboy:据我所知 FPE5.11的Win95程序似乎仍然是DOS程序.

恐怕不能直接编写32位程序访问所有的内存(只有通过VXD),
但可以编写16位程序(win31)或DOS下的程序访问到所有的内存.
原因如下:

在dos或286(保护)模式下对内存的访问是通过段地址(或选择符):偏移量(16:16位)的形式进行的,
他们工作在同一级别上.而Win95是工作386(虚拟86)模式下,对内存的访问是Flat的内存访问也就是
0:32位的形式,而只有工作在ring0级别的程序才能访问到所有内存,在加之叶面内存调度管理使得对内存的访问更复杂化,0-2G的内存地址是系统分配给应用程序的,2G-4G的内存是系统占用.一般工作在win95下的32位程序只是工作在ring3上,因此不能直接访问不属于自己的内存,除非编写一个特殊的DLL---VXD,设备驱动程序(VXD)工作在ring0上,因此可以访问所有内存.用Delphi来编写VXD是可行的,但需要转换大量的头文件,同时必须找资料,学习VXD的特殊编写规则(不知道是不是DDK--VXD的开发工具包for C,听说有for Delphi 的VXD开发工具包,使得在delphi下开发非常轻松,可惜要美元!).李亚平提到的Tvichw32.zip 就是使用了VXD才得以实现的,可惜没有源代码.

如果你只是希望能访问所有的内存,那么你可以使用Tvichw32元件,或则编写16位程序(win31)或DOS下的程序,那里没有级别的限制,方便得多,而我则不得不想法编写32位程序,不光是要解决内存问题,还有中断直接调用问题:-(.

当然,针对你的问题,首先你必须使用WinAPI取出该实例的基址.
附:
编写16位程序访问指定内存的值的函数:

{Access Memory for win31&win95}
{must compile with delphi1.0---16bit App}
{no VXD or DLL need}
{pure native source code here,all include}
{Writen by Xueyu,LEE}
const fMemoryMapped:boolean=false;
var fSelector :word;
fBaseAddr :LongInt;
fMemoryPointer :Pointer;
fMemorySize :Word;

function MapPhysMemory(PhAddr:LongInt; Size:Word):Pointer;
{input: }
{ phAddr: physics Address}
{ Size : Alloc Size(bytes)}
{output:}
{ Result: pointer to the physics memory}
{example:}
{ access the address 0:$123}
{ ptr:=MapPhysMemory($123,1)}
begin
Result:=fMemoryPointer;
if fMemoryMapped then UnmapPhysMemory;
fMemorySize:=Size;
fBaseAddr:=PhAddr;
fMemoryMapped:=TRUE;
fSelector:=AllocSelector(DSeg);
SetSelectorBase(fSelector,PhAddr);
SetSelectorLimit(fSelector,Size);
fMemoryPointer:=Ptr(fSelector,0);
Result:=fMemoryPointer;
end;

procedure UnmapPhysMemory;
begin
if fMemoryMapped then FreeSelector(fSelector);
fSelector:=0;
fMemoryMapped:=FALSE;
fBaseAddr:=0;
fMemoryPointer:=NIL;
fMemorySize:=0;
end;
 
目前,刚巧我也碰到这个问题,现将我研究得出的一些结果叙述如下,

TO ridle:你的方法在win31(286模式)下是行得通的,但在win95(386模式)下不行.
TO rockboy:据我所知 FPE5.11的Win95程序似乎仍然是DOS程序.

恐怕不能直接编写32位程序访问所有的内存(只有通过VXD),
但可以编写16位程序(win31)或DOS下的程序访问到所有的内存.
原因如下:

在dos或286(保护)模式下对内存的访问是通过段地址(或选择符):偏移量(16:16位)的形式进行的,
他们工作在同一级别上.而Win95是工作386(虚拟86)模式下,对内存的访问是Flat的内存访问也就是
0:32位的形式,而只有工作在ring0级别的程序才能访问到所有内存,在加之叶面内存调度管理使得对内存的访问更复杂化,0-2G的内存地址是系统分配给应用程序的,2G-4G的内存是系统占用.一般工作在win95下的32位程序只是工作在ring3上,因此不能直接访问不属于自己的内存,除非编写一个特殊的DLL---VXD,设备驱动程序(VXD)工作在ring0上,因此可以访问所有内存.用Delphi来编写VXD是可行的,但需要转换大量的头文件,同时必须找资料,学习VXD的特殊编写规则(不知道是不是DDK--VXD的开发工具包for C,听说有for Delphi 的VXD开发工具包,使得在delphi下开发非常轻松,可惜要美元!).李亚平提到的Tvichw32.zip 就是使用了VXD才得以实现的,可惜没有源代码.

如果你只是希望能访问所有的内存,那么你可以使用Tvichw32元件,或则编写16位程序(win31)或DOS下的程序,那里没有级别的限制,方便得多,而我则不得不想法编写32位程序,不光是要解决内存问题,还有中断直接调用问题:-(.

当然,针对你的问题,首先你必须使用WinAPI取出该实例的基址.
附:
编写16位程序访问指定内存的值的函数:

{Access Memory for win31&win95}
{must compile with delphi1.0---16bit App}
{no VXD or DLL need}
{pure native source code here,all include}
{Writen by Xueyu,LEE}
const fMemoryMapped:boolean=false;
var fSelector :word;
fBaseAddr :LongInt;
fMemoryPointer :Pointer;
fMemorySize :Word;

function MapPhysMemory(PhAddr:LongInt; Size:Word):Pointer;
{input: }
{ phAddr: physics Address}
{ Size : Alloc Size(bytes)}
{output:}
{ Result: pointer to the physics memory}
{example:}
{ access the address 0:$123}
{ ptr:=MapPhysMemory($123,1)}
begin
Result:=fMemoryPointer;
if fMemoryMapped then UnmapPhysMemory;
fMemorySize:=Size;
fBaseAddr:=PhAddr;
fMemoryMapped:=TRUE;
fSelector:=AllocSelector(DSeg);
SetSelectorBase(fSelector,PhAddr);
SetSelectorLimit(fSelector,Size);
fMemoryPointer:=Ptr(fSelector,0);
Result:=fMemoryPointer;
end;

procedure UnmapPhysMemory;
begin
if fMemoryMapped then FreeSelector(fSelector);
fSelector:=0;
fMemoryMapped:=FALSE;
fBaseAddr:=0;
fMemoryPointer:=NIL;
fMemorySize:=0;
end;
 
BOOL DebugActiveProcess(DWORD dwProcessId); //将dwProceeeID进程设置为被当前进程调试

BOOL ReadProcessMemory(
HANDLE hProcess, // handle of the process whose memory is read
LPCVOID lpBaseAddress, // address to start reading
LPVOID lpBuffer, // address of buffer to place read data
DWORD nSize, // number of bytes to read
LPDWORD lpNumberOfBytesRead // address of number of bytes read
);

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
);
可以干任何肮脏的事情......
 
我干了,果然肮脏。。。
 
求D4同志:
能不能把你读写内存的例子公布一下?或发到hylwy@163.net信箱中去。
 
D4同志:
能否也给我一份您的例子,或发信到junlv@263.net,谢谢!
 
; D4同志:
能否也给我一份您的例子,或发信到
pount@pdns.jsitec.edu.cn,谢谢!
 
能否也给我一份shermanxie@990.net
 
后退
顶部