- 浏览: 205605 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
harim:
思路十分不错,最近两家公司面试都问到了这个问题,我没有答出来, ...
缓存策略之LRU实现(基于双链表实现) -
javatozhang:
楼主真是良苦用心,很可惜我现在才对Tomcat感兴趣并有时间来 ...
tomcat init中加载哪些类? -
javatozhang:
diecui1202 写道可以看看goldendoc.org小 ...
tomcat init思维图 -
cherishLC:
非常感谢~表示自己没用过jquery,如果 jquery地址改 ...
最简单的jQuery折叠菜单 -
zhypengjw2012:
非常感谢!我今天就用到了!
jQuery插件--滑动条
保护模式:
基于 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 位)
发表评论
-
博客停止更新
2012-04-24 11:37 1179该博客停止更新,请移步:ivanzhangwb.com -
JProfile初步使用图解
2011-11-02 13:28 5935最近参与平台的短信平台项目,在项目的后期,参与了一些性能 ... -
J2EE简单性的红利
2011-01-02 00:26 1416复杂性的代价: 系统架构上的复杂性,如果并非出于必要 ... -
读《Unix编程艺术》 第四章:模块化、保持清晰、保持简洁
2010-12-26 18:17 1623第四章: 模块化、保持 ... -
阿里巴巴电面整理(二)
2010-07-02 04:03 3988还是接着昨天的帖子来吧, 题目都在上一篇《阿里巴巴电面整理 ... -
阿里巴巴电面整理
2010-07-01 01:47 4944今天中午接到阿里巴巴的电话面试,电面了将近一 ... -
我的Google 在线文档地址
2010-06-26 02:18 1224本人整理的一些文档, 关于技术,工作,生活的。 会陆续发 ... -
读 IBM中国 《Java 理论和实践: 了解泛型》
2010-06-26 02:09 1313了解Java泛型 参考于IBM Develop ... -
世界杯期间离职……
2010-06-17 01:13 1386来深圳时间不长,但是很错误的进入一个外包公司待到现在, ... -
MD5验证文件
2010-01-22 01:31 1120参考多篇网上的资料。 记录一下 java用MD5验证文件的 ... -
超棒的验证码生成组件---Jcaptcha
2010-01-10 23:46 8508最近由于Springside3的发布,也来凑热闹学习学习 ... -
web服务器工作方式
2010-01-09 14:16 1799记录一下 web服务器 ... -
开源UML项目Udoc简介
2010-01-04 19:47 3048由于对开源的热爱,经常需要看开源的东东,但是像Strut ... -
非常不错的Struts2教程
2010-01-02 21:25 1211非常不错的Struts2教程,原创是downpour ... -
eclipse 配置C/C++开发环境
2009-12-22 00:21 7436关于正常配置,请参考:http://jimychen ... -
RBAC权限涉猎之关系处理
2009-12-19 01:45 1583最近需要关注到RBAC这部分的理论知识。 ... -
重装XP以后修复Ubuntu引导
2009-12-03 23:37 2400在重装XP系统之后,引导区被windows强制的重写了一遍,导 ... -
Ant创建项目模版Demo
2009-11-14 21:01 3248由于项目中有用到公司自己封装的SDK,那么如果有新的开发 ... -
Ant+Freemarker+xml 生成Html
2009-11-12 22:12 2949最近客户项目中有用到freemarker生成原始的项目模版 ... -
HSQLDB的简单使用
2009-10-22 14:31 1607本文只简单讲述hsqldb的使用方法, 具体Hsql是什 ...
相关推荐
本篇将深入探讨如何使用VC++实现进程管理,特别是基于高响应比的策略。 首先,我们需要理解什么是进程和进程管理。在计算机系统中,进程是程序的一次执行实例,拥有独立的内存空间和状态。进程管理则负责创建、撤销...
本篇文章通过对一个简单的VC++程序进行详细的分析,展示了如何使用Windows API来终止指定名称的进程。通过这个示例,初学者可以更好地理解如何调用API函数,以及如何利用这些函数来完成特定的任务。此外,对于进程...
本篇文章将详细介绍如何使用VC++来实现关闭进程的功能,并探讨这一技术背后的原理。 首先,我们需要理解进程在操作系统中的概念。进程是执行中的程序实例,每个进程都有自己的内存空间和系统资源。在Windows系统中...
《VC++技术内幕(Windows编程篇)》是深入探讨Windows平台下使用Microsoft Visual C++进行应用程序开发的专业资料。这份学习笔记涵盖了从基础知识到高级技术的全方位讲解,旨在帮助读者掌握Windows编程的核心技能。 ...
本篇将详细探讨一个基于VC++实现的模拟进程分配器的设计与实现,这对于我们理解操作系统的工作原理、进程调度算法以及编程实践具有深远意义。 首先,我们要明白什么是进程分配器。在操作系统中,进程是执行中的程序...
在Windows操作系统中,桌面壁纸是用户个性化电脑环境的重要元素之一。使用VC++编程语言,我们可以编写应用程序来改变或设置桌面壁纸。这篇描述提及的源码就是为此目的而设计的,适用于初学者学习如何通过编程来操作...
本篇文章将详细介绍如何通过VC++和API调用来实现“进程映像到PID”的转换。 首先,我们需要了解几个关键的API函数: 1. **CreateToolhelp32Snapshot**: 这个函数创建一个系统进程快照,可以用来遍历所有运行的进程...
本篇文章将深入探讨如何使用VC++来实现创建进程以及如何在创建后通过进程ID获取窗口句柄进行操作。 首先,我们需要理解创建进程的基本步骤。在VC++中,我们可以使用Windows API函数`CreateProcess`来创建新的进程。...
总的来说,"vc++ 应用篇资料源码包15"是一个宝贵的资源库,它能帮助开发者系统地学习和实践VC++的各个方面,从而提升Windows应用开发的能力。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。
本篇文章将深入探讨使用VC++实现进程间通信的方法,特别是通过广播通信的实现。 首先,我们要理解什么是进程。在操作系统中,进程是程序执行时的一个实例,每个进程都有自己的内存空间和系统资源。由于进程间的内存...
本篇文章将聚焦于一个名为“ProcessMg”的系统进程管理工具,该工具采用C++编程语言中的Microsoft Visual C++(VC++)环境开发,旨在为用户提供便捷、直观的方式来监控和管理系统中的进程。 首先,我们来了解VC++。...
**VC++之ActiveX开发** 在Windows编程领域,ActiveX技术是Microsoft提出的一种组件对象模型,它允许开发者创建可重用的控件和组件,这些控件可以在多种应用程序中嵌入,实现跨平台交互。VC++(Visual C++)作为微软...
这个"vc++ 应用篇资料源码包12"包含了一系列的实例源码和相关说明文档,是学习和提升VC++应用编程能力的宝贵资源。源码实例通常包括完整的代码结构、函数实现、数据结构设计以及与其他库的交互等内容,通过阅读和...
本篇文章将深入探讨如何利用VC++创建系统服务,以及如何实现服务的控制,如开启、关闭、暂停等功能。 首先,我们需要了解创建服务的基本步骤。在VC++中,我们可以使用`CreateService` API函数来创建一个新的服务。...
本篇将详细介绍基于VC++开发的聊天室源码,主要涉及的关键技术包括网络编程、多线程以及用户界面设计。这个聊天室应用利用了异步套接字来实现客户端之间的实时通信,使得用户可以看到在线的用户名并能够在多个客户端...
《Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率》 http://blog.csdn.net/morewindows/article/details/8678359 配套程序。 讲解了在Windows系统下使用VC++获取系统CPU整体使用率。已经测试,能运行于...
本篇将详细介绍如何在VC++6.0中安装和使用pthread库。 首先,我们需要获取pthread库。pthread库通常在Unix/Linux系统中是内建的,但在Windows上需要额外下载。可以从官方网站或者其他可靠的开源软件仓库下载适用于...
本篇文章将深入探讨如何使用VC++ MFC来开发一个任务管理器,以及这个过程中涉及的关键知识点。 首先,任务管理器是一个系统工具,允许用户监控和控制运行在操作系统上的进程、服务、性能等。在Windows系统中,任务...
在计算机编程领域,Socket通信是实现网络间进程通信的重要手段,而VC++作为Microsoft公司推出的C++编译器,广泛应用于Windows平台上的系统级开发。本篇将深入探讨如何使用VC++创建一个Socket通信的动态链接库(DLL)。...