最近一直忙着写毕业论文,但对于我这种没语言天赋的人,写写实际做的工作还可以,但要写课题背景、意义什么的,头都要大了,憋了两天才憋出两页的绪论,我容易吗我。。。

所以这半个月也没时间更新博客,现在论文初稿终于写完了,所以来写点东西吧。

这还是要从我写的魔兽改键显血助手WarKey说起。之前的版本因为判断是否是聊天状态的功能不完善,于是我就按网上的说法,用CE(Cheat Engine,专门用于修改游戏内存的工具)搜索了一下魔兽进程的内存内容,找到存储是否处于聊天状态的内存地址。于是,在WarKey中,只需要取到该内存地址的内容,根据其内容来判断是否处于聊天状态,然后决定是否需要改键即可。但实际上,在调用API函数ReadProcessMemory()时,并不能取出其内容,也就是说无论魔兽是否处于聊天状态,ReadProcessMemory()总是调用失败。经查MSDN,发现该函数操作的句柄需要PROCESS_VM_READ访问权限,而这个是由OpenProcess()函数来处理的。OpenProcess()这个函数指定的访问权限的安全描述符比较复杂,但有一句话很给力:If the caller has enabled the SeDebugPrivilege privilege, the requested access is granted regardless of the contents of the security descriptor.也就是说如果调用者具有SeDebugPrivilege权限,那么就不用管什么安全描述符了。于是只需要给程序提升权限,使其具有SeDebugPrivilege权限即可。

关于提升权限的方法,在MSDN里面查了半天,居然找到了一个很给力的例子:

  
#include <windows.h> #include <stdio.h> #pragma comment(lib, "cmcfg32.lib")BOOL SetPrivilege(HANDLE hToken, // access token handle LPCTSTR lpszPrivilege, // name of privilege to enable/disable BOOL bEnablePrivilege // to enable or disable privilege ) {TOKEN_PRIVILEGES tp;LUID luid;if ( !LookupPrivilegeValue( NULL, // lookup privilege on local system lpszPrivilege, // privilege to lookup &luid ) ) // receives LUID of privilege {printf("LookupPrivilegeValue error: %u\n", GetLastError() ); return FALSE; }tp.PrivilegeCount = 1;tp.Privileges[0].Luid = luid;if (bEnablePrivilege)tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;elsetp.Privileges[0].Attributes = 0;// Enable the privilege or disable all privileges. if ( !AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) ){ printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); return FALSE; } if (GetLastError() == ERROR_NOT_ALL_ASSIGNED){printf("The token does not have the specified privilege. \n");return FALSE;} return TRUE; }

这个例子应该是比较经典的,经过分析之后,于是写出开关Debug权限的函数:

  
BOOL CWarKeyDlg::EnableDebugPrivilege(BOOL bEnableDebugPrivilege) { HANDLE hToken;TOKEN_PRIVILEGES tp;LUID luid;if(!::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)){::MessageBox(this->GetSafeHwnd(), GET_TOKEN_ERROR, MSG_BOX_TITLE, MB_OK);return FALSE;}if(!::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)){::MessageBox(this->GetSafeHwnd(), GET_PRIVILEGE_VALUE_ERROR, MSG_BOX_TITLE, MB_OK);::CloseHandle(hToken);return FALSE;}tp.PrivilegeCount = 1;tp.Privileges[0].Luid = luid;if(bEnableDebugPrivilege){tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;}else{tp.Privileges[0].Attributes = 0;}if(!::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL)){::MessageBox(this->GetSafeHwnd(), ADJUST_PRIVILEGE_ERROR, MSG_BOX_TITLE, MB_OK);::CloseHandle(hToken);return FALSE;}::CloseHandle(hToken);if(::GetLastError() == ERROR_NOT_ALL_ASSIGNED){::MessageBox(this->GetSafeHwnd(), ENABLE_DEBUG_ERROR, MSG_BOX_TITLE, MB_OK);return FALSE;}return TRUE; }

利用这个函数给自己的WarKey开启Debug权限,再访问魔兽进程的内存时,就可以读出其中的数据了。

读取其他进程的内存-让程序提升Debug权限相关推荐

  1. 进程线程007 进程挂靠与跨进程读写内存

    文章目录 进程挂靠 进程与线程的关系 线程与进程如何关联 为什么需要ApcState.Process CR3的值可以随便改吗 分析NtReadVirtualMemory函数 总结 跨进程读写内存 跨进 ...

  2. 用内存断点找OEP 问题 脱壳时提示无法读取被调试进程的内存 bad dos signature

    1. 本文要解决的问题是:    1.什么是内存断点?    2.如何在寻找OEP时使用内存断点.    3.内存断点的局限性.     2.内存断点寻找OEP的原理   i.首先,在OD中内存断点, ...

  3. Linux程序内存跟踪,分享一款Linux进程和内存活动监视神器

    原标题:分享一款Linux进程和内存活动监视神器 像"top "之类的命令行工具使得监视CPU使用率和内存使用率有些困难.这就是我们今天向您介绍vtop的原因, vtop是一个用N ...

  4. (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。) (Microsoft SQL Server,错误: 233)...

    ------------------------------ 无法连接到 IFCA-LIUWEI/SQL2005. ------------------------------ 其他信息: 已成功与服 ...

  5. 【C语言进阶深度学习记录】三十六 程序与进程的区别(程序的内存布局)

    上一篇文章学了堆,栈以及静态存储区.它们实际上都是针对进程来说的.那么程序与进程有什么区别呢? 本文不细讲程序与进程. 1 程序与进程 1.1 什么是程序 写完的.c文件是源文件.也叫源代码. 将源代 ...

  6. 通过WriteProcessMemory改写进程的内存

    http://www.cnblogs.com/feiyucq/archive/2009/10/21/1587628.html 以PROCESS_ALL_ACCESS权限打开进程以后既能够使用ReadP ...

  7. 线程的挂起是错误的概念实际是线程的阻塞,挂起只针对进程,将进程挂起会将进程从内存空间交换到磁盘空间的过程

    线程的挂起是错误的概念实际是线程的阻塞 线程的主要状态有运行态,就绪态和阻塞态.挂起态对线程没有什么意义,这是由于此类状态是一个进程级的概念.特别地,如果一个进程被换出,由于它的所有线程都该进程的地址 ...

  8. 文件读取 linux_Linux 进程、线程、文件描述符的底层原理

    说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案:在 Linux 系统中,进程和线程几乎没有区别. Linux 中的进程其实就是一个数据结构,顺带可以理解文件描述符.重定向.管 ...

  9. win32进程共享内存

    在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换.     进程间 ...

最新文章

  1. 细细品味大数据--初识hadoop
  2. DELPHI replace into 语句的语法错误 解决方法
  3. DL之DNN优化技术:神经网络算法简介之GD/SGD算法(BP的梯度下降算法)的简介、理解、代码实现、SGD缺点及改进(Momentum/NAG/Ada系列/RMSProp)之详细攻略
  4. ZOJ - 1450 Minimal Circle HDU - 3007 Buried memory 最小圆覆盖模板 【随机函数】【增量法】
  5. java二维数组的常见初始化
  6. 20140704笔试面试总结(java)
  7. 网站地图生成器_10个相见恨晚的PPT网站 让你看一眼就心动
  8. PPT图片快速编辑技巧
  9. SpringApplication#run⽅法第5步,打印banner(四)
  10. 泛函分析复习笔记(二)线性算子与线性泛函
  11. 关于SiamRPN代码的一些要点
  12. Java中一个数的N次方
  13. python中x%y是什么意思_python是什么
  14. Arduino - PC817C光耦
  15. js promise的用法
  16. 对于共享电脑的到来,您有什么想说的
  17. 成为顶级博主的秘诀是什么?《乘风者周刊》专访“处女座程序猿”牛亚运
  18. 几种蔬菜帮你降糖 血糖过高的人别错过
  19. 忘记windows10密码重置密码
  20. android apk安装工具,APK安装器下载-APK安装器手机版下载v2.9-1 安卓版-西西软件下载...

热门文章

  1. java实现飞机_java实现飞机游戏代码
  2. C语言 实验10-1 圆形体体积计算器 (20分)
  3. 老鱼Python数据分析——篇十二:使用selenium+BeautifulSoup获取淘股吧数据
  4. Python浪漫七夕:可爱的卡通图案合集分享
  5. 初级前端高频面试题之VUE
  6. 转型并非放弃 诺基亚年底宣布MeeGo1.1
  7. https安全解决方案证书certbot教程
  8. 世博上黑莓手机啦 英文版本
  9. vuex及其内部核心成员介绍及使用
  10. ros+科大迅飞语音包+图灵机器人(一)sdk下载及测试