`
gogole_09
  • 浏览: 205605 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

VC++之 Windows进程篇

阅读更多

保护模式:

基于 X86 微处理器 (80836) 处理器有 3 种工作模式:

               实模式,保护模式,虚拟 86 模式。

 

实模式和虚拟 86 模式是为了和 8086 处理器兼容而设置的,而保护模式是 80836 处理器的主要工作模式。

      windows 操作系统就在此模式之下运行。

 

虚拟内存:

       在保护模式下, 80836 所有 32 根地址线都是可以寻址的,处理器寻址范围是

0x00000000~0xFFFFFFFF(232   ,4GB) 所以 32 windows 操作系统可寻址 4GB 的地址空间 .

       而机器的 RAM 不可能是 4GB ,主要靠 CPU 支持, CPU 在保护模式下支持虚拟存储,既为虚拟内存 。它可以帮助操作系统将磁盘空间作为内存使用。

       在磁盘空进应用这一机制的文件叫做页文件

      

       通常情况下, Windows 4G 的前半部分留给进程作为私有存储,而自己使用另一半 2G 来存储操作系统内部使用的数据。

 

进程的创建

       操作系统通过 CreateProcess 函数来创建进程。

              STARTUPINFO

进程创建后,会分配一个此类型的变量。包含父进程传递给子进程的一些信息

 

              PROCESS_INFOMATION

                     存储当前进程的信息

      

       创建进程示例:

             

char szFileName[] = { "D:\\myeclipse6\\workspace \\02Test\\Debug\\02Test.exe " };

    STARTUPINFO si = { sizeof (si) };

    PROCESS_INFORMATION pi;

    :: CreateProcessA ( // 创建线程

NULL,       // 不指定文件名

szFileName, // 命令行参数

NULL,         // 默认进程安全性

NULL,        // 默认线程安全性

FALSE,      // 不可以被子进程继承

CREATE_NEW_CONSOLE, // 为新进程创建一个新的控制台窗口

NULL, // 使用本进程环境变量

NULL, // 使用本进程驱动器和目录

&si,

&pi);

 

 

内存区域操作:

       Windows 4KB 为单位为应用程序分配内存,其采用分页机制 来管理内存。每页大小是 4KB ,目的是按页来搜索目标内存,可以提高搜索效率 .

 

练习程序代码:

测试程序 Test.cpp

 

/*
 * test.cpp
 *
 *  Created on: 2009-12-22
 *      Author: Zhangwenbo
 */
#include <stdio.h>
int g_nNum;
int main(){
	int i=198;
	g_nNum=1003;
	while(1){
printf("i=%d,addr=%08lX;g_nNum=%d,addr=%08lX\n",
++i,&i,--g_nNum,&g_nNum);
	}
	return 0;
}
 

 

内存操作代码:

/*
 * Memrepair.cpp
 *
 *  Created on: 2009-12-22
 *      Author: Zhangwenbo
 */
#include <stdio.h>
#include <windows.h>
BOOL FindFirst(DWORD dwValue); //在目标空间进行第一次查找
BOOL FindNext(DWORD dwValue); //在目标空间进行第二次,三次查找
DWORD g_arList[1024]; //地址列表
int g_nListCnt; //有效地址个数
HANDLE g_hProcess; //目标进程句柄

/**
 * 比较内存页中的数据
 */
BOOL CompareAPage(DWORD dwBaseAddr, DWORD dwValue) {
	//读取一页内存 4KB为单位
	BYTE arBytes[4096];
	if (!::ReadProcessMemory(g_hProcess, (LPVOID) dwBaseAddr, arBytes, 4096, NULL)) {
		return FALSE;//此页不可读
	}

	//在这一页内存里面查找
	DWORD* pdw;
	for (int i = 0; i < (int) 4* 1024 - 3 ; i++) {
		pdw = (DWORD*) &arBytes[i];
		if (pdw[0] == dwValue) {//等于要查找的值
			if (g_nListCnt >= 1024)
				return FALSE;
			//添加到全局变量中
			g_arList[g_nListCnt++] = dwBaseAddr + i;
		}
	}
	return TRUE;
}

/**
 * 进行下次查找
 */
BOOL FindNext(DWORD dwValue) {
	//保存m_arList数组中有效地址的个数,初始化新的m_nListCnt的值
	int nOrgCnt = g_nListCnt;
	g_nListCnt = 0;
	//从m_arList数组记录的地址处查找
	BOOL bRet = FALSE;
	DWORD dwReadValue;
	for (int i = 0; i < nOrgCnt; i++) {
		if (::ReadProcessMemory(g_hProcess, (LPVOID) g_arList[i], &dwReadValue, sizeof(DWORD), NULL)) {
			if (dwReadValue == dwValue) {
				g_arList[g_nListCnt++] = g_arList[i];
				return TRUE;
			}
		}
	}
	return bRet;
}
/**
 * 第一次在指定空间查找
 */
BOOL FindFirst(DWORD dwValue) {
	//1GB
	const DWORD dwOneGB = 1024* 1024* 1024 ;
	//4KB
	const DWORD dwOnePage = 4* 1024 ;

	if (g_hProcess == NULL)
		return FALSE;
	//查看操作系统类型
	DWORD dwBase;
	OSVERSIONINFO vi = { sizeof(vi) };
	::GetVersionExA(&vi);
     //确定从哪个地址开始搜索
	if (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
		    dwBase = 4* 1024* 1024 ; //WINDOW98系列 4mb
		}else {
			dwBase=640*1024;//64kb windowsNT系列
		}

		//在开始地址到2GB的地址空间查找 递增1页大小(4kb)
		for(;dwBase<2*dwOneGB;dwBase+=dwOnePage) {
			//比较一页大小的内存
			CompareAPage(dwBase,dwValue);
		}

		return TRUE;
	}

	/**
	 * 打印列表
	 */
void ShowList() {
	for (int i = 0; i < g_nListCnt; i++) {
		printf("%08lX\n", g_arList[i]);

	}
}
/**
* 改写内存值
*/
BOOL WriteMemory(DWORD dwAddr,DWORD dwValue){
	return ::WriteProcessMemory(g_hProcess,(LPVOID)dwAddr,&dwValue,sizeof(DWORD),NULL);
}
int main() {
	//启动02Test进程
	char szFileName[] = {
			"D:\\myeclipse6\\workspace\\02Test\\Debug\\02Test.exe" };
	STARTUPINFO si = { sizeof(si) };
	PROCESS_INFORMATION pi;
	//创建线程
	::CreateProcessA(NULL, szFileName, NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
			NULL, NULL, &si, &pi);
	//关闭线程句柄,我们不使用此句柄
	::CloseHandle(pi.hThread);
	//获取目标进程句柄
	g_hProcess = pi.hProcess;
	//输入要修改的值
	int iVal;
	printf("输入值:");
	scanf("%d", &iVal);
	//进行第一次查找
	FindFirst(iVal);
	//打印出搜查结果
	ShowList();
	while (g_nListCnt > 1) {
		printf("输入值:");
		scanf("%d", &iVal);
		//进行下次查找
		FindNext(iVal);
		ShowList();
		printf("输入新值:");
		scanf("%d", &iVal);
		if(WriteMemory(g_arList[0],iVal)){
			printf("修改成功!");
		}
	}
	::CloseHandle(g_hProcess);
	return 0;
}

 

DWORD 是什么?

1 个二进制位称为 1 bit 1 位)

8 个二进制位称为 1 Byte ,( 1 字节)

2 个字节 (2Byte=2*8bit) 就是 1 Word    1 字, 16 位),

DWORD DOUBLE WORD )就是双字的意思,两个字( 32 位)

分享到:
评论

相关推荐

    VC++实现进程管理

    本篇将深入探讨如何使用VC++实现进程管理,特别是基于高响应比的策略。 首先,我们需要理解什么是进程和进程管理。在计算机系统中,进程是程序的一次执行实例,拥有独立的内存空间和状态。进程管理则负责创建、撤销...

    VC++杀进程的函数源码

    本篇文章通过对一个简单的VC++程序进行详细的分析,展示了如何使用Windows API来终止指定名称的进程。通过这个示例,初学者可以更好地理解如何调用API函数,以及如何利用这些函数来完成特定的任务。此外,对于进程...

    vc++如何实现关闭进程简介

    本篇文章将详细介绍如何使用VC++来实现关闭进程的功能,并探讨这一技术背后的原理。 首先,我们需要理解进程在操作系统中的概念。进程是执行中的程序实例,每个进程都有自己的内存空间和系统资源。在Windows系统中...

    VC++技术内幕(windows编程篇)

    《VC++技术内幕(Windows编程篇)》是深入探讨Windows平台下使用Microsoft Visual C++进行应用程序开发的专业资料。这份学习笔记涵盖了从基础知识到高级技术的全方位讲解,旨在帮助读者掌握Windows编程的核心技能。 ...

    VC++模拟进程分配器

    本篇将详细探讨一个基于VC++实现的模拟进程分配器的设计与实现,这对于我们理解操作系统的工作原理、进程调度算法以及编程实践具有深远意义。 首先,我们要明白什么是进程分配器。在操作系统中,进程是执行中的程序...

    VC++改变windows桌面壁纸

    在Windows操作系统中,桌面壁纸是用户个性化电脑环境的重要元素之一。使用VC++编程语言,我们可以编写应用程序来改变或设置桌面壁纸。这篇描述提及的源码就是为此目的而设计的,适用于初学者学习如何通过编程来操作...

    进程映像to PID (vc++,api,进程,PID)

    本篇文章将详细介绍如何通过VC++和API调用来实现“进程映像到PID”的转换。 首先,我们需要了解几个关键的API函数: 1. **CreateToolhelp32Snapshot**: 这个函数创建一个系统进程快照,可以用来遍历所有运行的进程...

    VC实现创建进程并控制

    本篇文章将深入探讨如何使用VC++来实现创建进程以及如何在创建后通过进程ID获取窗口句柄进行操作。 首先,我们需要理解创建进程的基本步骤。在VC++中,我们可以使用Windows API函数`CreateProcess`来创建新的进程。...

    vc++ 应用篇资料源码包15

    总的来说,"vc++ 应用篇资料源码包15"是一个宝贵的资源库,它能帮助开发者系统地学习和实践VC++的各个方面,从而提升Windows应用开发的能力。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。

    进程间通信源码 vc++

    本篇文章将深入探讨使用VC++实现进程间通信的方法,特别是通过广播通信的实现。 首先,我们要理解什么是进程。在操作系统中,进程是程序执行时的一个实例,每个进程都有自己的内存空间和系统资源。由于进程间的内存...

    processmg (VC++ 源程序)

    本篇文章将聚焦于一个名为“ProcessMg”的系统进程管理工具,该工具采用C++编程语言中的Microsoft Visual C++(VC++)环境开发,旨在为用户提供便捷、直观的方式来监控和管理系统中的进程。 首先,我们来了解VC++。...

    vc++之Activex开发

    **VC++之ActiveX开发** 在Windows编程领域,ActiveX技术是Microsoft提出的一种组件对象模型,它允许开发者创建可重用的控件和组件,这些控件可以在多种应用程序中嵌入,实现跨平台交互。VC++(Visual C++)作为微软...

    vc++ 应用篇资料源码包12

    这个"vc++ 应用篇资料源码包12"包含了一系列的实例源码和相关说明文档,是学习和提升VC++应用编程能力的宝贵资源。源码实例通常包括完整的代码结构、函数实现、数据结构设计以及与其他库的交互等内容,通过阅读和...

    VC++建立系统服务

    本篇文章将深入探讨如何利用VC++创建系统服务,以及如何实现服务的控制,如开启、关闭、暂停等功能。 首先,我们需要了解创建服务的基本步骤。在VC++中,我们可以使用`CreateService` API函数来创建一个新的服务。...

    VC++ 聊天室 源码

    本篇将详细介绍基于VC++开发的聊天室源码,主要涉及的关键技术包括网络编程、多线程以及用户界面设计。这个聊天室应用利用了异步套接字来实现客户端之间的实时通信,使得用户可以看到在线的用户名并能够在多个客户端...

    WindowsVC++获取CPU整体使用率

    《Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率》 http://blog.csdn.net/morewindows/article/details/8678359 配套程序。 讲解了在Windows系统下使用VC++获取系统CPU整体使用率。已经测试,能运行于...

    VC++6.0安装pthread库过程图解

    本篇将详细介绍如何在VC++6.0中安装和使用pthread库。 首先,我们需要获取pthread库。pthread库通常在Unix/Linux系统中是内建的,但在Windows上需要额外下载。可以从官方网站或者其他可靠的开源软件仓库下载适用于...

    VC++ 开发的任务管理器

    本篇文章将深入探讨如何使用VC++ MFC来开发一个任务管理器,以及这个过程中涉及的关键知识点。 首先,任务管理器是一个系统工具,允许用户监控和控制运行在操作系统上的进程、服务、性能等。在Windows系统中,任务...

    VC++ DLL for Socket

    在计算机编程领域,Socket通信是实现网络间进程通信的重要手段,而VC++作为Microsoft公司推出的C++编译器,广泛应用于Windows平台上的系统级开发。本篇将深入探讨如何使用VC++创建一个Socket通信的动态链接库(DLL)。...

Global site tag (gtag.js) - Google Analytics