写入/读取受内存保护的进程的内存
Write/Read a memory-protected process's memory
我会尽力解释我的问题
我正在尝试访问受内存保护的进程内存(扫雷器)
我会把我的代码放在第一位,然后我会解释我想要归档的东西是什么。(如果你阅读了所有内容并知道另一种方法,请发布)
首先是getProcessHandle,该函数为名为procName的进程返回一个打开句柄
它工作得很好,我可以列出所有的过程。
HANDLE getProcessHandle(const wchar_t *procName){
HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 procEnt;
procEnt.dwSize = sizeof(PROCESSENTRY32);
Process32First(snap, &procEnt);
printf("--Listando procesos...n");
do{
printf("Process name: %S n", procEnt.szExeFile);
if (!wcscmp(procName, procEnt.szExeFile)){
printf("Encontrado %S.nn", procName);
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, procEnt.th32ProcessID);
}
} while (Process32Next(snap, &procEnt));
printf("No se ha encontrado el proceso.");
CloseHandle(snap);
return NULL;
第二,getModule函数。它的工作应该是查找和枚举作为HANDLE传递的过程中的所有模块。
HMODULE getHModule(HANDLE procHandle, const wchar_t *procName){
HMODULE moduleHandle[1024];
DWORD bytesNeeded;
unsigned int i = 0;
if (EnumProcessModulesEx(procHandle, moduleHandle, sizeof(moduleHandle), &bytesNeeded, LIST_MODULES_ALL)){
printf("--Modulos del proceso:n");
for (i = 0; i < (bytesNeeded / sizeof(HMODULE)); i++){
TCHAR pathModule[1024];
GetModuleBaseName(procHandle, moduleHandle[i], pathModule, sizeof(pathModule) / sizeof(TCHAR));
if (!wcscmp(procName, pathModule)){
printf("Encontrado modulo %S.", procName);
return moduleHandle[i];
}
printf("Module %d: %S n", i + 1, pathModule);
}
printf("No se ha encontrado el modulo.");
return NULL;
}
else {
printf("Error en EnumProcessModulesEx n: %ls", GetLastError());
}
return NULL;
问题来了。当我试图枚举进程中的所有模块时,如果进程是一个正常的进程,我的意思是,一个没有内存保护的进程,它会完美地工作
问题出在进程受内存保护的情况下
在这一点上,我决定搜索,我发现了特权令牌。据说,如果我激活SE_DEBUG_NAME令牌,我的进程可能会超过保护,所以,我已经完成了这个功能:
int privileges(){
HANDLE token;
TOKEN_PRIVILEGES tp;
DWORD siz = sizeof(TOKEN_PRIVILEGES);
if (OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &token) != 0){
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (AdjustTokenPrivileges(token, 0, &tp, siz, NULL ,NULL) != 0){
cout << "--Conseguido acceso debug.n";
return TRUE;
}
else {
cout << "fail adjustn";
return FALSE;
}
}
else {
cout << "fail if: " << GetLastError() << endl;
cin.get();
return FALSE;
}
以及"主要"功能:
int _tmain(int argc, _TCHAR* argv[])
{
privileges();
wchar_t *processName = _T("calc.exe");
HANDLE hProc = getProcessHandle(processName);
if (hProc){
HMODULE hMod = getHModule(hProc, processName);
cout << hMod;
}
cin.get();
return 0;
}
我现在的问题是,当我执行这个函数privileges()
时,它会返回ERROR_NO_TOKEN代码号
这里有人让我把OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &token)
改成OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)
,这不会造成任何问题,也不会造成任何结果,有了这个修复,我就有了和privileges()
没有执行一样的问题
感谢您阅读所有的文本,如果有其他方法可以做到这一点,请告诉我,我正在努力学习。
EnumProcessModulesEx的文档中说:
此功能主要用于64位应用程序。如果该函数由在WOW64下运行的32位应用程序调用,则dwFilterFlag选项将被忽略,并且该函数将提供与EnumProcessModules函数相同的结果。
转到EnumProcessModules的文档,我们发现:
如果从WOW64上运行的32位应用程序调用此函数,则它只能枚举32位进程的模块。
因此,要处理64位进程,您的代码本身必须是64位的。
文件继续:
如果进程是64位进程,则此函数将失败,最后一个错误代码为error_PARTIAL_COPY(299)。
这似乎是不正确的,因为您收到的是访问违规异常。
像这里一样编写ImpersonateSelf(SecurityImpersonation);
:
ImpersonateSelf(SecurityImpersonation);
OpenThreadToken
(
GetCurrentThread(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
FALSE,
&token
);
ImpersonateSelf-make函数获取一个访问令牌,该令牌模拟调用进程的安全上下文。令牌被分配给调用线程。
要查看所有SECURITY_IMPERSONATION_LEVELs,请单击此处
- 可以读入进程内存的最大块大小是多少?
- 如何读取特定地址的进程内存?
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 读取进程内存多级指针(DLL 注入)
- 读取进程内存作弊引擎值
- 获取进程内存信息失败,错误 6 句柄无效
- c++ 读取进程内存基址 + 偏移量不起作用
- 如何编辑受保护的进程内存?
- 内核模式驱动程序可以在任何进程上执行读取进程内存吗?
- 如何获取进程内存的最小值和最大值?(C++)
- C++ - 读取进程内存到缓冲区,写入进程内存(同一缓冲区上的新值)将缓冲区恢复为旧值
- 读取进程内存 C++ 不会读取
- 尝试编写进程内存并获取用户定义的文字运算符未找到
- 具有多个偏移量的写入进程内存C++
- C++如何使用读取进程内存查找进程内存中使用的最后一个(偏移量 - 地址)
- 读取进程内存无法正常工作,使用 UTF16 字符串
- 读取进程内存上的错误 299
- 写入进程内存没有错误,它不会写入正确的地址
- 将进程内存转储到文件/从转储文件重新创建进程