【发布时间】:2020-09-01 02:35:02
【问题描述】:
我正在尝试编写转储工具,并且在太平洋地址的内存中有一个文件,该文件包含一个文件大小为 41mb 的文件。 我正在尝试将具有文件大小的文件写入目录。 任何建议或意见,您都可以非常感谢。
我试过这个...
这是我更新的代码:
#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
int sizevalue = 43.417254; // size of file
DWORD address = 0x43417254;
char Wfilename[14] = "cartfile.dat";
char Rfilename[14] = "cartfile.dat";
//entry
int main(int argc, char* argv[])
{
HWND hwnd = FindWindowA(NULL, "gametutorial");
if (hwnd == NULL)
{
cout << "Cannot find window." << endl;
Sleep(3000);
exit(-1);
}
else
{
DWORD procID;
GetWindowThreadProcessId(hwnd, &procID);
HANDLE handle = OpenProcess(PROCESS_VM_READ, PROCESS_VM_WRITE, procID);
if (procID == NULL)
{
cout << "Cannot obtain process." << endl;
Sleep(3000);
exit(-1);
}
else
{
for (;;)
{
if (GetAsyncKeyState(VK_F10))
{
printf("Dumping cartfile now... \n");
ofstream outputStream("cartfile.dat", ios::out | ios::binary);
if (outputStream.is_open())
{
std::cout << "file opened okay\n";
}
else
{
std::cout << "Error opening file\n";
}
ReadProcessMemory_(handle, (void*)address, &sizevalue, Rfilename,
sizeof(sizevalue), 0);
WriteProcessMemory_(handle, (void*)address, &sizevalue, Wfilename,
sizeof(sizevalue), 0);
0);
outputStream.close();
system("pause");
return 0;
}
Sleep(1);
}
}
}
}
BOOL WriteProcessMemory_(HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID
lpBuffer, CHAR* lpfile, SIZE_T nSize, SIZE_T* lpNumberOfBytesWritten)
{
return 0;
}
BOOL ReadProcessMemory_(HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID
lpBuffer, CHAR* lpfile, SIZE_T nSize, SIZE_T* lpNumberOfBytesRead)
{
return 0;
}
这是我的头文件...
#pragma once
#include <Windows.h>
#include <stdio.h>
#include <iostream>
//#include .lib header
BOOL WriteProcessMemory_(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
CHAR* lpfile,
SIZE_T nSize,
SIZE_T* lpNumberOfBytesWritten
);
BOOL ReadProcessMemory_(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
CHAR* lpfile,
SIZE_T nSize,
SIZE_T* lpNumberOfBytesRead
);
但它仍然会以 0 文件大小 0kb 转储购物车文件。 那么现在呢?
但它只转储 Cartfile,但它的大小为 0。 二进制文件中该位置的字节包含一个文件大小为 41 mb 的文件。 该文件打开正常,因此我可以成功打开该文件。 它必须与它从内存中的字节写入文件的方式和文件大小有关吗? 那我做错了什么?
【问题讨论】:
-
你怎么确定地址
0x81865e58有东西需要转储?您是从哪里以及如何得出这样一个地址的? -
由于现代操作系统使用virtual memory,任何来自其他进程的内存地址都是没有意义的。
-
ofs是干什么用的?您是否尝试从另一个没有读取任何内容的文件中写入 2072 字节? -
我编辑了我的代码。我获取字节并将其转换为十进制,转换为 MB 时等于 41 mbs。所以这给了我正确的内存字节大小。我使用十六进制编辑器来获取我从中派生的那些字节。 @安迪
-
在打开后立即检查
outputStream的流状态并在写入后再次检查可能会为正在发生的任何流错误提供一些线索。