天,哪里下还要别人告诉你啊? 搜索是最基本的技能,如果这个不会的话,应该先学一学电脑基础,不能直接就学编程,因为编程是在了解系统、熟悉系统基本操作的前提下进行的。话说得难听了点,但事实确实如此。 Visual C++6.0+MSDN2001 ISO 1.88G版本 http://www.cn029.com/soft/118/2006/2006072429475.htmlVisualStadio.net2005集成SP1&MSDNsp1 ISO 4.6GB http://www.downtool.com/Bt/86651.htmlBT、FTP、电驴、HTTP,各种方式的都可以,再不会还可以到电脑城买套光盘。
http://www.dssz.com/45114.html
内存修改器
http://down.csdn.net/source/1303686
这个更好一点。
0x0~~0xFFFF 64KB 不可访问区域,只是用来防止非法的指针访问,访问该范围的地址会导致访问违例。
0x10000~~0x7FFEFFFF 2GB 减去至少192KB 进程的私有地址空间
0x7FFDE000~~0x7FFDEFFF 4KB 进程中第一个线程的线程环境块,即TEB(Thread environment block)
0x7FFDF000~~0x7FFDFFFF 4KB 进程的进程环境块,即PEB(Process environment block)
0x7FFE0000~~0x7FFE0FFF 4KB 一个共享的只读用户数据块,该块映射到到系统空间的一个数据块,其中存放的是一些系统信息如系统时间、时钟的滴答数、系统版本号等。这样访问这些信息的时候系统就不用切换到核心模式。
0x7FFE1000~~0x7FFEFFFF 60KB 不可访问
0x7FFF0000~~0x7FFFFFFF 64KB 不可访问,用于防止线程的缓冲跨越两种模式空间的边界从上表可以看出,我们要扫描范围的起点和终点不是从0~~2GB,而只是其中的一部分。要得到这个起点和终点可以使用API函数GetSystemInfo,函数的原型如下:
VOID GetSystemInfo(
LPSYSTEM_INFO lpSystemInfo // system information
);
而在结构SYSTEM_INFO中有两个域:lpMinimumApplicationAddress和 lpMaximumApplicationAddress(类型都是LPVOID) 中,我们就可以得到一个应用程序可用的最小和最大的地址空间。这样我们就得到了要扫描的地址的起点和终点。那么是不是这起点和终点间所有的地址都要扫描呢?并不是这样的,因为一般情况下一个进程是用不着这么大(接近2GB)的地址空间的。因此一个进程的大部分地址空间都是未用(Free)或是保留(Reserved)的,真正用到的只是那些已提交(Committed)的内存而已。
内存页面可以有三种状态:未用(Free)、保留(Reserved)和提交(Committed)。一个未用的页面是指该页面未被保留或是提交,对一个进程来讲一个未用的页面是不可访问的,访问这样的页面将导致访问违例。进程可以要求系统保留一些页面以备后用,系统返回一段保留的地址给进程,但是这些地址同样是不可访问的,进程若想使用这段地址空间,使用必须先提交。只有一个提交的页面才是一个真正可以访问的页面。不过你提交了一个页面,系统并不会马上分配物理页面,只有在该页面第一次被访问到时,系统才会分配页面并初始化。另外,这三个状态的两两之间都是可以相互转化的。相关的API函数有VirtualAlloc、VirtualAllocEx、VirtualFree、VirtualFreeEx等.
这样我们的工作已大大减少了,只需要扫描那些提交的页面就好了。接下来要做的就是得到一个进程的已提交的页面范围。这就要用到另外两个API函数VirtualQuery和VirtualQueryEx。两个函数的功能相似,不同就是VirtualQuery只是查询本进程而VirtualQueryEx可以查询指定进程的内存空间信息,后者正是我们所需要的,函数原型如下:
DWORD VirtualQueryEx(
HANDLE hProcess, // handle to process
LPCVOID lpAddress, // address of region
PMEMORY_BASIC_INFORMATION lpBuffer, // information buffer
SIZE_T dwLength // size of buffer
);
第一个参数是进程的句柄;第二个参数是内存地址指针;第三个参数是指向MEMORY_BASIC_INFORMATION结构的指针,用于返回内存空间的信息;第四个参数是lpBuffer的长度。再来看一下结构MEMORY_BASIC_INFORMATION的声明:
typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress;
PVOID AllocationBase;
DWORD AllocationProtect;
SIZE_T RegionSize;
DWORD State;
DWORD Protect;
DWORD Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
第一个参数是查询内存块的基地址;第二个参数指的是用VirtualAlloc分配该内存时实际分配的基地址,可以小于BaseAddress,也就是说BaseAddress一定包含在AllocationBase分配的范围内;第三个参数指的是分配该页面时,页面的一些属性,如PAGE_READWRITE、PAGE_EXECUTE等(其它属性可参考Platform SDK);第四个参数指的是从BaseAddress开始,具有相同属性的页面的大小。第五参数指的是页面的状态,有三种可能值:MEM_COMMIT、MEM_FREE和MEM_RESERVE,这个参数对我们来说是最重要的了,从中我们便可知指定内存页面的状态了;第六个参数指的是页面的属性,其可能的取值与AllocationProtect相同;最后一个参数指明了该内存块的类型,有三种可能值:MEM_IMAGE 、MEM_MAPPED和MEM_PRIVATE。
这样我们就可得到进程中需要扫描的地址范围了。到这里剩下的问题就是要读取指定的进程的指定的地地址空间的内容了。这里要用到的是用于调试程序和错误处理(Debugging and Error Handling)的API函数。在“Platform SDK: Debugging and Error Handling”章节中,介绍了一部分与程序调试和错误处理相关的API函数,有许多是很有用,例如我们下面用到的ReadProcessMemory和WriteProcessMemory,它们原型如下:
BOOL ReadProcessMemory(
HANDLE hProcess, // handle to the process
LPCVOID lpBaseAddress, // base of memory area
LPVOID lpBuffer, // data buffer
SIZE_T nSize, // number of bytes to read
SIZE_T * lpNumberOfBytesRead // number of bytes read
);
BOOL WriteProcessMemory(
HANDLE hProcess, // handle to process
LPVOID lpBaseAddress, // base of memory area
LPCVOID lpBuffer, // data buffer
SIZE_T nSize, // count of bytes to write
SIZE_T * lpNumberOfBytesWritten // count of bytes written
);
参数很简单从它们的名字都可以猜出其意义了,这里就不多做说明了。根据工作方式不同,用到的API可能还涉及到以下几个:
FindWindow
GetWindowThreadProcessId
OpenProcess
WrITeProcessMemory
ReadProcessMemory
CloseHandle
virtualallocex
virtualfreeex
对了。。随便问句比较弱的问题怎么在MSDN上找资料啊。。
比如我想找VC里控件的资料
咋就笨笨的没找到呢。。是不是这些资料都收费啊
有没有API文档之类的东西。
直接就能搜到各个控件什么的
能给个下载地址什么的嘛。。
我找了半天也没找到一个完整的能下的。
理论上MSDN的网站上应该有啊。
搜索是最基本的技能,如果这个不会的话,应该先学一学电脑基础,不能直接就学编程,因为编程是在了解系统、熟悉系统基本操作的前提下进行的。话说得难听了点,但事实确实如此。
Visual C++6.0+MSDN2001 ISO 1.88G版本
http://www.cn029.com/soft/118/2006/2006072429475.htmlVisualStadio.net2005集成SP1&MSDNsp1 ISO 4.6GB
http://www.downtool.com/Bt/86651.htmlBT、FTP、电驴、HTTP,各种方式的都可以,再不会还可以到电脑城买套光盘。
不是我不会搜。
搜了 10个有9个有毒
1个下不了我有啥办法。。
而且理论上这个应该在MSDN官方网站上有下的。你给的不也是1G+版本的嘛~~~这个迅雷上有~~~就是因为太大了才没下精简版的下了几个又不全。才有次一问难道论坛上问。。不也是搜索资源的一种嘛我估计我这贴子要是20分你肯定不会回答一个字!!!你这么喜欢分?????
你以为我是要看你给我的那几个函数啊我自己就已经做出这个修改器了。。只不过我觉得不用将内存全部都搜索一遍才发的这个帖子MSDN网上的都上G还不一定能用。。每个都下来再试看能用不我得试多少次。。占着带宽成天下东西寝室人得削死我你真以为别人都傻啊。。就你聪明
在这里我只回答100分的题,你说对了。MSDN都是至少三张CDROM的,精简就说明被删除掉很多,你下了当然就不全,这个本来就是无法二全的事情。我可以对你另开贴再回答一切问题,不喜欢一个贴里问很多事情的。这样不公平,但在QQ群里可以无限回答,上这来不就为了分吗?我是这样的。你可以BS。
我说的过激了点。。
我道歉不过确实很气愤啊。我大学3年所有学到的东西都是自己查资料学的。。竟然说我连搜索资源都不会。。天啊。。要是不会
怎么学到今天的我只不过以前一直都学JAVA。。最近有低层需要要攻下VC
大家都知道开源的文档在各个官方网站都下得到有保证
而我习惯行的去MSDN的网站找资料的时候发现真是一片混乱啊。。
于是利用迅雷啊BAIDU,GOOGLE啊。。什么的
那些资源的评论都不好
也不知道哪个是完整能用的,每个都上G
在寝室的带宽条件大家也知道
你一下东西那别人开网页都费劲
我不可能每个都下来。。然后看看哪个好使
所以才问哪有下的想直接就找到一个完全没有问题的资源,就这样而已
确遭来类似于计算机盲的评价。气愤。。非常气愤
所以言行过激在次道歉结贴给分