FindWindow ,GetWindowThreadProcessId , OpenProcess 和ReadProcessMemory

article/2025/10/16 8:08:19

文章目录

    • FindWindow
    • 函数功能:
    • 函数声明:
    • 第一个参数
    • 第二个参数
    • 返回值
    • 注意:
    • GetWindowThreadProcessId
    • 函数功能
    • 函数声明
    • 第一个参数:
    • 第二个参数:
    • 返回值
    • 代码实现
    • OpenProcess
    • 函数功能:
    • 函数声明:
    • 第一个参数:
    • 第二个参数:
    • 第三个参数:
    • 返回值:
    • 代码实现:
    • ReadProcessMemory
    • 函数功能:
    • 函数声明:
    • 第一个参数:
    • 第二个参数:
    • 第三个参数:
    • 第四个参数:
    • 第五个参数:
    • 返回值:
    • 代码实现:
    • 练手题目
    • 插入一个提示(vs如何打开MSDN帮助文档)

FindWindow

函数功能:

函数检索处理顶级窗口的类名和窗口名称匹配指定的字符串,这个函数不搜索子窗口。
第一个是要找的窗口的类,第二个是要找的窗口的标题

函数声明:

WINUSERAPI
HWND
WINAPI
FindWindowW(_In_opt_ LPCWSTR lpClassName,_In_opt_ LPCWSTR lpWindowName);

在搜索的时候不一定两者都知道,但至少要知道其中的一个。

第一个参数

lpClassName,输入参数,指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。

如果该参数为null时,将会寻找任何与lpWindowName参数匹配的窗口。

第二个参数

指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名

返回值

如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄

如果函数执行失败,则返回值为NULL。可以通过调用GetLastError函数获得更加详细的错误信息

注意:

如果要搜索的外部程序的窗口标题比较容易得到,问题是比较简单的。可如果窗口的标题不固定或者根本就没有标题,怎么得到窗口的类呢?这时我们可使用Microsoft Spy++,运行Spy++,按ALT+F3,在弹出的界面中拖动目标图标到程序上即可。
举例:
在调用时使用如下语句:
hwndCalc = FindWindow(0&, “计算器”)
这里的0&就表示忽略类名。需要注意的是FindWindow(0&, “计算器”)和FindWindow("", “计算器”)有两种完全不同的含义,前者表示忽略窗口的类,而后者表示窗口的类是个空串

在搜索的时候不一定两者都知道,但至少要知道其中的一个。有的窗口的标题是比较容易得到的,如"计算器",所以搜索时应使用标题进行搜索。但有的软件的标题不是固定的,如"记事本",如果打开的文件不同,窗口标题也不同,这时使用窗口类搜索就比较方便。如果找到了满足条件的窗口,这个函数返回该窗口的句柄,否则返回0
举例:

	HWND hwnd = FindWindow(NULL, "计算器");if (hwnd != NULL){MessageBox(NULL,"来吧","找到计算器窗口",MB_OK);}else{MessageBox(NULL, "来吧", "未找到计算器窗口", MB_OK);}hwnd = FindWindow("Notepad", NULL);if (hwnd != NULL){MessageBox(NULL, "来吧", "找到记事本窗口", MB_OK);}else{MessageBox(NULL, "来吧", "没有找到记事本窗口", MB_OK);}

注意,此时我打开记事本文件名字叫做01.txt - 记事本,即第二个参数

HWND hwnd = FindWindow(NULL, "计算器");if (hwnd != NULL){MessageBox(NULL,"来吧","找到计算器窗口",MB_OK);}else{MessageBox(NULL, "来吧", "未找到计算器窗口", MB_OK);}hwnd = FindWindow(NULL, "01.txt - 记事本");if (hwnd != NULL){MessageBox(NULL, "来吧", "找到记事本窗口", MB_OK);}else{MessageBox(NULL, "来吧", "没有找到记事本窗口", MB_OK);}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

GetWindowThreadProcessId

函数功能

该函数返回创建指定窗口线程的标识和创建窗口的进程的标识符,后一项是可选的。得到窗口句柄后我们可以通过GetWindowThreadProcessId来获得窗口所属进程ID线程ID从而判断创建窗口的进程和线程。

函数声明

WINUSERAPI
DWORD
WINAPI
GetWindowThreadProcessId(_In_ HWND hWnd,_Out_opt_ LPDWORD lpdwProcessId);

第一个参数:

输入参数,hWnd,窗口句柄。

第二个参数:

输出参数,lpdwProcessld,接收进程标识的32位值的地址。如果这个参数不为NULL,GetWindwThreadProcessld将进程标识拷贝到这个32位值中,否则不拷贝,输出参数是进程ID地址

返回值

返回值为创建窗口的线程标识,返回的是窗口所属线程ID

代码实现

  HWND hWnd; DWORD ProcessID, ThreadID;hWnd=FindWindow(NULL, L"计算器");if (hWnd == NULL)return 0;ThreadID = GetWindowThreadProcessId(hWnd, &ProcessID);printf("%d\n%d", ProcessID, ThreadID);

在这里插入图片描述

OpenProcess

函数功能:

开一个已存在的进程对象,并返回进程的句柄。

函数声明:

WINBASEAPI
HANDLE
WINAPI
OpenProcess(_In_ DWORD dwDesiredAccess,_In_ BOOL bInheritHandle,_In_ DWORD dwProcessId);

第一个参数:

输入参数,dwDesiredAccess: 想拥有的该进程访问权限。

  • PROCESS_ALL_ACCESS //所有能获得的权限
  • PROCESS_CREATE_PROCESS //需要创建一个进程
  • PROCESS_CREATE_THREAD //需要创建一个线程
  • PROCESS_DUP_HANDLE //重复使用DuplicateHandle句柄
  • PROCESS_QUERY_INFORMATION //获得进程信息的权限,如它的退出代码、优先级
  • PROCESS_QUERY_LIMITED_INFORMATION /*获得某些信息的权限,如果获得
  • PROCESS_QUERY_INFORMATION,也拥有PROCESS_QUERY_LIMITED_INFORMATION权限*/
  • PROCESS_SET_INFORMATION //设置某些信息的权限,如进程优先级
  • PROCESS_SET_QUOTA //设置内存限制的权限,使用SetProcessWorkingSetSize
  • PROCESS_SUSPEND_RESUME //暂停或恢复进程的权限
  • PROCESS_TERMINATE //终止一个进程的权限,使用TerminateProcess
  • PROCESS_VM_OPERATION //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory)
  • PROCESS_VM_READ //读取进程内存空间的权限,可使用ReadProcessMemory
  • PROCESS_VM_WRITE //读取进程内存空间的权限,可使用WriteProcessMemory
  • SYNCHRONIZE //等待进程终止

第二个参数:

输入参数,bInheritHandle: 表示所得到的进程句柄是否可以被继承

第三个参数:

输入参数,dwProcessId:被打开进程的PID

返回值:

如果函数调用成功将返回一个进程句柄值,否则将返回NULL
注意:在使用完所获得的进程句柄后一定要调用CloseHandle(handle)来关闭进程的句柄。

代码实现:

  HWND hWnd; DWORD ProcessID, ThreadID;hWnd=FindWindow(NULL, L"计算器");if (hWnd == NULL)return 0;ThreadID = GetWindowThreadProcessId(hWnd, &ProcessID);HANDLE handle=OpenProcess(PROCESS_ALL_ACCESS, 0, ProcessID);printf("%d", handle);CloseHandle(handle);

在这里插入图片描述

ReadProcessMemory

函数功能:

函数声明:

WINBASEAPI
_Success_(return != FALSE)
BOOL
WINAPI
ReadProcessMemory(_In_ HANDLE hProcess, // 被读取进程的句柄;_In_ LPCVOID lpBaseAddress,, // 读的起始地址;_Out_writes_bytes_to_(nSize,*lpNumberOfBytesRead) LPVOID lpBuffer,// 存放读取数据缓冲区;_In_ SIZE_T nSize, // 一次读取的字节数;_Out_opt_ SIZE_T* lpNumberOfBytesRead// 实际读取的字节数;);

第一个参数:

[in] Handle to the process whose memory is being read.

In Windows CE, any call to OpenProcess returns a process handle with the proper access rights.
输入参数,远程进程句柄。被读取者

第二个参数:

[in] Pointer to the base address in the specified process to be read.

Before data transfer occurs, the system verifies that all data in the base address and memory of the specified size is accessible for read access. If so, the function proceeds; otherwise, the function fails.
输入参数,远程进程中内存地址。从具体何处读取(关键,因为不是随便取一个就能读出来的)

第三个参数:

[out] Pointer to a buffer that receives the contents from the address space of the specified process.
输出参数,本地进程中内存地址.函数将读取的内容写入此处

第四个参数:

[in] Specifies the requested number of bytes to read from the specified process.
输入参数,要传送的字节数。要写入多少

第五个参数:

[out] Pointer to the number of bytes transferred into the specified buffer.

If lpNumberOfBytesRead is NULL, the parameter is ignored.
输出参数,实际传送的字节数. 函数返回时报告实际写入多少

返回值:

If the function succeeds, the return value is nonzero.
如果成功,返回非0。

If the function fails, the return value is 0 (zero). To get extended error information, call GetLastError.
如果失败,返回0,错误可通过GetLastError获得

The function fails if the requested read operation crosses into an area of the process that is inaccessible.
重点:当操作进入了进程不可读取的部分时会失败,大多数人犯的错误。

代码实现:

大家需要用CE进行一系列操作,然后找到一个可以有读写权限的地址,别猜,

HWND hWnd; DWORD ProcessID, ThreadID;DWORD nSize;unsigned char gamedata[24] = { 0 };hWnd=FindWindow(NULL, L"计算器");if (hWnd == NULL)return 0;ThreadID = GetWindowThreadProcessId(hWnd, &ProcessID);HANDLE handle=OpenProcess(PROCESS_ALL_ACCESS, 0, ProcessID);printf("%d", handle);int a=ReadProcessMemory(handle, (LPCVOID)0x14D56107798, &gamedata, MAX_PATH, &nSize);if (a == 0)return 0;printf("%d", gamedata);CloseHandle(handle);

在这里插入图片描述
在这里插入图片描述

练手题目

看完之后就去练练手吧,前往这篇博客,这里能理解的话,那么接下来将会对你有更大的提升:
https://blog.csdn.net/CSNN2019/article/details/112035707

插入一个提示(vs如何打开MSDN帮助文档)

比如要查看float的特征。
在vs中输入float,然后按F1键,会在默认浏览器上打开帮助文档。


http://chatgpt.dhexx.cn/article/sUQTtyg9.shtml

相关文章

【CV系列】主动轮廓模型snake及其应用

DATE: 2019.5.30 前言 主动轮廓模型(Active Contour Model),又被称为Snake,是由Andrew Blake教授提出的一种目标轮廓描述方法,主要应用于基于形状的目标分割。该模型的优越之处在于它对于范围广泛的一系列视觉问题给出了统一的解决方法,在最…

图像分割之Snake主动轮廓模型(Matlab代码)

示例演示 如果在中文搜索的话,一般会找到《数字图像处理-图像分割:Snake主动轮廓模型 Matlab代码及运行结果》。里面有句代码,千万别用,否则出不来效果。(别问我怎么知道的) % 转化为双精度型 %I im2doub…

Snake活动轮廓模型Matlab实现

1. Snake模型 人为地在图像感兴趣的区域(ROI)上给出初始轮廓曲线,最小化一个能量函数,使轮廓曲线在图像中运动(变形),最终逼近该区域的边界。 设v(s)[x(s),y(s)]为活动轮廓线,s∈[0,…

snake主动轮廓模型

模型:一条可变形的参数曲线及相应的能量函数,以最小化能量函数为目标,控制参数曲线变形,具有最小能量的闭合曲线即是目标轮廓。 snake模型调和了上层知识和底层图像特征矛盾。 上层知识指物体形状。表示内部力。 底层图像特征是局…

Snake活动轮廓模型

1. Snake模型 人为地在图像感兴趣的区域(ROI)上给出初始轮廓曲线,最小化一个能量函数,使轮廓曲线在图像中运动(变形),最终逼近该区域的边界。 设v(s)[x(s),y(s)]为活动轮廓线,s∈[0,…

基于边缘的主动轮廓模型——从零到一用python实现snake

从零到一实现snake算法 1、Snake算法原理2、基于曲线演化的实现方法2.1演化方程推导2.2离散化过程2.3 代码实现 3、基于水平集的实现方法4、讨论与分析源码地址[snake](https://github.com/woshimami/snake) 1、Snake算法原理 Kass等人1最早于1988年提出了主动轮廓模型&#x…

主动轮廓模型snake

原理概述 snake模型将图像分割问题转换为求解能量泛函最小值的问题。主要思路是构造能量函数进行迭代后,轮廓曲线由初始位置逐渐向使能量函数最小(局部极小)的图像边缘逼近,最终分割出目标。 曲线理论 假设一条光滑封闭曲线 C …

腾讯电脑管家,vs安装文件报成木马,还能信吗?

今天在公司安装vs2013,安装过程中腾讯公司的产品“电脑管家”提示有新版本,没有犹豫的点了升级,完成后直接在管家主界面上点了“全面体检”按钮,这一点不要紧,报告有一个木马,看紧看一下“详情”&#xff0…

计算机windows8黑屏怎么办,Win8电脑开机黑屏只有鼠标光标怎么解决

有些win8系统用户在开机的时候,遇到了黑屏的情况, 整个屏幕上面只有一个闪烁的鼠标光标,导致无法进入到系统桌面,遇到这样的情况该怎么解决呢?现在给大家分享一下Win8电脑开机黑屏只有鼠标光标的具体解决方法吧。 Win8…

解决ValueError: Cannot run multiple SparkContexts at once; existing SparkContext

一、问题描述 创建sparkcontext和SparkSession,连接spark集群时报错,如题ValueError: Cannot run multiple SparkContexts at once; existing SparkContext。 from pyspark.sql import SparkSession from pyspark.sql import functions as F from pysp…

1、Qt线程(二):继承QThread,重写run

一、功能说明 1、通过继承QThread,重写run的方式实现多线程 2、点击“开始”按钮启动子线程,同时通过信号槽的方式给子线程发送“开始”字符串; 3、子线程每隔1秒向主线程发送累加数; 4、点击"停止"按钮&#xff0c…

诡异的RunOnce病毒启动项和神奇的URL Protocol

整理磁盘发现之前有个有趣的流氓招数忘记分享了,每次看到新鲜的东东都感慨黑暗势力的层出不穷的招数,比某些安全厂商是不是自相残杀好多了.电脑日常使用过程中我们经常输入开头为http ftp,点击诸如ed2k的链接,每个链接的背后都会执行相应的功能.如http 通过iexplore.exe,ed2k通…

如何创建水晶报表

开发工具与关键技术:VS与MVC 作者:刘华叶 撰写时间:2019年4月29日 MVC是软件工程中的一种软件架构模式,涉及到的知识点也是相当广泛,而我们在做项目的过程中,总会遇到要制作一些报表,水晶报表就…

java 水晶报表教程_水晶报表 (Crystal Reports 2008)的配置

概要: Crystal Reports(水晶报表)是一款商务智能(BI)软件,主要用于设计及产生报表。水晶报表是业内最专业、功能最强的报表系统,它除了强大的报表功能外。最大的优势是实现了与绝大多数流行开发工具的集成和接口。在VS.Net平台做过报表开发的…

水晶报表教程:手把手教你制作基本报表

ASP.NET水晶报表的学习 这篇文章教你如何在.Net Web应用中使用水晶报表,也可以让你在学习过程中少走一些弯路。为了得到最好的效果,读者最好需要有一些基础的Asp.Net访问数据库的知识以及使用VS.Net的开发经验。 简介 水晶报表可以由很多的方法得到&a…

水晶报表基本使用方法

开发工具与关键技术:VS/MVC 作者:何桂朋 撰写时间:2019年4月22日 Crystal Reports(水晶报表)是一款商务智能(BI)软件,主要用于设计及产生报表。水晶报表是业内最专业、功能最强的报…

php try catch 不处理,如何解决php try catch不起作用的问题

如何解决php try catch不起作用的问题 发布时间:2020-09-22 09:59:14 来源:亿速云 阅读:103 作者:小新 这篇文章主要介绍了如何解决php try catch不起作用的问题,具有一定借鉴价值,需要的朋友可以参考下。希…

try catch执行过程分析

本篇文章带大家聊聊try catch的执行过程,有时候在开发的过程中,try代码里如果出现异常,catch后的步骤还会继续执行吗?以及finally的使用。 下面来分析一下几种使用场景: 场景一: try代码块中出现异常后&a…

面试官问我 ,try catch 应该在for循环里面还是外面?

前言 有个老哥昨天被面试官欺负了,但是是被这个问题(标题)欺负的? 其实是个比较基础的问题,只要有了解过,叙述是非常简单OK的。 只要有初学者觉得有疑惑,那么我相信不止是他一个。 所以&#…

try catch异常捕获

这次我们介绍try catch异常捕获。下面是try catch的语法。 thy catch 的作用就是异常捕获,在一些会报错的地方时的时候才会用到。 例如这个代码,当我们在控制器时输入的不是数字而是其他的文字或者其他符号呢?所以这里程序就会报错&#xff0…