- 浏览: 201587 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 1124该博客停止更新,请移步:ivanzhangwb.com -
JProfile初步使用图解
2011-11-02 13:28 5856最近参与平台的短信平台项目,在项目的后期,参与了一些性能 ... -
J2EE简单性的红利
2011-01-02 00:26 1366复杂性的代价: 系统架构上的复杂性,如果并非出于必要 ... -
读《Unix编程艺术》 第四章:模块化、保持清晰、保持简洁
2010-12-26 18:17 1574第四章: 模块化、保持 ... -
阿里巴巴电面整理(二)
2010-07-02 04:03 3886还是接着昨天的帖子来吧, 题目都在上一篇《阿里巴巴电面整理 ... -
阿里巴巴电面整理
2010-07-01 01:47 4750今天中午接到阿里巴巴的电话面试,电面了将近一 ... -
我的Google 在线文档地址
2010-06-26 02:18 1175本人整理的一些文档, 关于技术,工作,生活的。 会陆续发 ... -
读 IBM中国 《Java 理论和实践: 了解泛型》
2010-06-26 02:09 1268了解Java泛型 参考于IBM Develop ... -
世界杯期间离职……
2010-06-17 01:13 1334来深圳时间不长,但是很错误的进入一个外包公司待到现在, ... -
MD5验证文件
2010-01-22 01:31 1065参考多篇网上的资料。 记录一下 java用MD5验证文件的 ... -
超棒的验证码生成组件---Jcaptcha
2010-01-10 23:46 8423最近由于Springside3的发布,也来凑热闹学习学习 ... -
web服务器工作方式
2010-01-09 14:16 1748记录一下 web服务器 ... -
开源UML项目Udoc简介
2010-01-04 19:47 2949由于对开源的热爱,经常需要看开源的东东,但是像Strut ... -
非常不错的Struts2教程
2010-01-02 21:25 1158非常不错的Struts2教程,原创是downpour ... -
eclipse 配置C/C++开发环境
2009-12-22 00:21 7388关于正常配置,请参考:http://jimychen ... -
RBAC权限涉猎之关系处理
2009-12-19 01:45 1524最近需要关注到RBAC这部分的理论知识。 ... -
重装XP以后修复Ubuntu引导
2009-12-03 23:37 2305在重装XP系统之后,引导区被windows强制的重写了一遍,导 ... -
Ant创建项目模版Demo
2009-11-14 21:01 3203由于项目中有用到公司自己封装的SDK,那么如果有新的开发 ... -
Ant+Freemarker+xml 生成Html
2009-11-12 22:12 2893最近客户项目中有用到freemarker生成原始的项目模版 ... -
HSQLDB的简单使用
2009-10-22 14:31 1550本文只简单讲述hsqldb的使用方法, 具体Hsql是什 ...
相关推荐
《Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率》 http://blog.csdn.net/morewindows/article/details/8678359 配套程序。 讲解了在Windows系统下使用VC++获取系统CPU整体使用率。已经测试,能运行于...
DllMain带有三个参数,hModule表示本dll的实例句柄(听不懂就不理它,写过windows程序的自然懂),dwReason表示dll当前所处的状态,例如DLL_PROCESS_ATTACH表示dll刚刚被加载到一个进程中,DLL_PROCESS_DETACH表示...
本书设计了大量的实例演示Windows应用程序开发过程中的相关技术,分为3篇。 软件设计基础篇 ·第1章,软件开发起步:编写第一个软件,熟悉MFC应用程序框架。 ·第2章,对话框应用程序:熟悉模态、非模态对话框...
本书设计了大量的实例演示Windows应用程序开发过程中的相关技术,分为3篇。 软件设计基础篇 ·第1章,软件开发起步:编写第一个软件,熟悉MFC应用程序框架。 ·第2章,对话框应用程序:熟悉模态、非模态对话框...
本书设计了大量的实例演示Windows应用程序开发过程中的相关技术,分为3篇。 软件设计基础篇 ·第1章,软件开发起步:编写第一个软件,熟悉MFC应用程序框架。 ·第2章,对话框应用程序:熟悉模态、非模态对话框...
本书设计了大量的实例演示Windows应用程序开发过程中的相关技术,分为3篇。 软件设计基础篇 ·第1章,软件开发起步:编写第一个软件,熟悉MFC应用程序框架。 ·第2章,对话框应用程序:熟悉模态、非模态对话框...
本书设计了大量的实例演示Windows应用程序开发过程中的相关技术,分为3篇。 软件设计基础篇 ·第1章,软件开发起步:编写第一个软件,熟悉MFC应用程序框架。 ·第2章,对话框应用程序:熟悉模态、非模态对话框...
本书设计了大量的实例演示Windows应用程序开发过程中的相关技术,分为3篇。 软件设计基础篇 ·第1章,软件开发起步:编写第一个软件,熟悉MFC应用程序框架。 ·第2章,对话框应用程序:熟悉模态、非模态对话框...
(3)Windows系统程序设计篇。 第12章,进程与线程:介绍进程与线程的原理及其基本应用。 第13章,内存管理:介绍虚拟内存与内存映射两种内存管理机制。 第14章,进程间通信:介绍共享内存、管道等进程间...
7.3.2 分析ATL进程外组件与进程内组件的差别 7.3.2.1 文件生成差别 7.3.2.2 StdAfx.h文件差别 7.3.2.3 ATLSampleExe.cpp文件差别 7.3.3 增加COM对象类、属性和方法 7.3.4 测试ATL SanpleExe.Account中测试组件 7.4 ...
全书分为软件设计基础篇、软件设计综合应用篇和Windows系统程序设计篇,既包括对话框、控件、文档与视图等基本开发技能,也涉及网络通信、密码学算法、多媒体技术等综合应用开发技术,还深入到了进程与线程、内存...
本书设计了大量的实例演示Windows应用程序开发过程中的相关技术,分为3篇。 软件设计基础篇 ·第1章,软件开发起步:编写第一个软件,熟悉MFC应用程序框架。 ·第2章,对话框应用程序:熟悉模态、非模态对话框...
本书设计了大量的实例演示Windows应用程序开发过程中的相关技术,分为3篇。 软件设计基础篇 ·第1章,软件开发起步:编写第一个软件,熟悉MFC应用程序框架。 ·第2章,对话框应用程序:熟悉模态、非模态对话框...