您的位置:首页 > 其它

Windows程序设计基础

2011-08-02 18:24 239 查看
基本概念:

1.CPU保护模式:

1.各进程的地址空间:被分为用户空间和系统空间,用户空间是私有的空间,保证进程间不能互相访问,虽然是同一地址,但是可以不同进程可以保存不同数据。但是通过调用API函数,就可以访问所有数据

2.内核模式和用户模式:系统通过环来管理特权级别。一般情况下用户进程是处在用户模式下,访问的是用户空间,但是,当用户访问系统资源的时候,也就是调用系统的API函数的时候,就会切换到内核模式。

2.内核对象

内核对象主要3个概念:什么是内核对象,什么是对象句柄,怎么管理内核对象的使用

3.进程

1.创建进程

Win32应用程序的启动过程:调用CreateProcess创建一个进程内核对象,其初始值是1,分配虚拟地址空间,加载所需要的代码和数据,创建主线程,主线程调用c++的运行启动代码,运行启动代码再调用main函数

当进程将自己的内核对象句柄传给hProcess,对应的句柄数会由1增加至2,所有在调用完结束的时候要closehandle,否则,无法释放这个内核对象。

2.进程控制

获取系统进程
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h> // 声明快照函数的头文件

int main(int argc, char* argv[])
{
PROCESSENTRY32 pe32;
// 在使用这个结构之前,先设置它的大小
pe32.dwSize = sizeof(pe32);

// 给系统内的所有进程拍一个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf(" CreateToolhelp32Snapshot调用失败! \n");
return -1;
}

// 遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
while(bMore)
{
printf(" 进程名称:%s \n", pe32.szExeFile);
printf(" 进程ID号:%u \n\n", pe32.th32ProcessID);

bMore = ::Process32Next(hProcessSnap, &pe32);
}

// 不要忘记清除掉snapshot对象
::CloseHandle(hProcessSnap);
return 0;
}

 

终止当前进程

终止进程有4个原因
1.主线程的入口函数返回
2.进程中某个线程调用了ExitProcess
3.所有的线程都结束了
4.其他进程的一个线程通过调用TerminateProcess结束这个进程
注:通过调用TerminateProcess结束进程,对于操作系统是正常的,但是对于c++运行库来说,系统会没有机会去析构全局和静态的对象。
 

终止其他进程

通过进程的ID调用OpenProcess获取需要的进程的句柄,然后TerminateProcess来结束该进程
一旦进程被终止会发生下面的事情
1.所有被这个进程打开的句柄会关闭
2.该进程的所有线程结束
3.进程内核对象变为受信状态,所有的等待在这个对象上的线程开始执行
4.系统进程对象中退出码变为指定的退出码。
 

保护进程

其他进程需要结束一个进程,会先用ToolHelp或者EnumProcess查找相应的进程,然后再去kill这个进程,所以可以通过Hook这两个函数,或者直接HookTerminateProcess函数就可以保护进程不被kill掉
 

练习:《游戏内存修改器》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows kill api hook 游戏 c