ReadProcessMemory/WriteProcessMemory 函数 第三方程序的进程内
第三方程序的进程内存访问
一般情况下普通的进程是不可以访问物理内存的,那么要访问其它进程的内存就需要用到ReadProcessMemory/WriteProcessMemory 函数.
1.变量与指针
回归定义,变量和指针都是和数据的操作有关,但不同之处是,变量根据标识符来进行数据操作,指针根据保存在标识符里面的地址来进行数据操作.用个简单的例子来说明这些微妙的差距:
9: int number=100;
00401168 mov dword ptr [ebp-4],64h ; 直接把100 写入到栈
10: int* point_number=&number;
0040116F lea eax,[ebp-4] ; 把number 的地址保存到point_number 中
00401172 mov dword ptr [ebp-8],eax
11: *point_number=10;
00401175 mov ecx,dword ptr [ebp-8] ; 读取point_number 保存的地址
00401178 mov dword ptr [ecx],0Ah ; 把10 写到这个地址中去
2.简单的游戏框架
class user_data {
public:
user_data(void) {
mon=0;
exp=0;
};
~user_data() {};
long get_mon(void) const {
return mon;
};
long get_exp(void) const {
return exp;
};
void set_mon(long in_number) {
mon=in_number;
};
void set_exp(long in_number) {
exp=in_number;
};
private:
long mon;
long exp;
};
class game {
public:
game(void) {
player=1;
};
~game() {
};
long get_player(void) const {
return player;
};
long get_mon(void) const {
return point_user_data.get_mon();
};
long get_exp(void) const {
return point_user_data.get_exp();
};
void set_mon(long in_number) {
point_user_data.set_mon(in_number);
};
void set_exp(long in_number) {
point_user_data.set_exp(in_number);
};
private:
user_data point_user_data;
long player;
};
对于游戏来说,每个用户都会有属于他的数据,诚然,上面的类架构对于真正的游戏是远远不够的,但是作为简单的实例,这也就足够了.
注意,在这里要提示一下,在game 类的数据堆栈中会出现这种状况:
mon [ebp - 4]
exp [ebp - 8]
player [ebp - 16]
它产生的原因是类把它组合的所有的对象的数据成员和它声名的数据成员都保存在它的堆栈中.也就是说,game 类组合了user_data 类,user_data 类里面有两个数据成员:mon ,exp ,由于在game 的数据成员声名中user_data 类比player 更要靠前,所以堆栈中user_data::mon 和user_data::exp 都在game::player 的前面.
本文来源 我爱IT技术网 http://www.52ij.com/jishu/4152.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
