实现修改内存内容核心代码:
//进程列表信息
void CMemRepairDlg::InitProcessList()
{
PROCESSENTRY32 pe32;
ZeroMemory(&pe32, 0);
pe32.dwSize = sizeof(PROCESSENTRY32);
//对系统进程进行拍照
HANDLE handle = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ( INVALID_HANDLE_VALUE == handle )
{
MessageBox("调用CreateToolhelp32Snapshot函数失败!");
return;
}
BOOL bRect = ::Process32First(handle, &pe32);
if ( m_map.size() > 0)
m_map.clear();//清除
CString cs;
while( bRect )
{
((CComboBox*)GetDlgItem(IDC_PROCESSLIST_COBOX))->AddString(pe32.szExeFile);
m_map.insert(std::pair<DWORD, CString>(pe32.th32ProcessID, pe32.szExeFile));
bRect = ::Process32Next(handle, &pe32);
}
((CComboBox*)GetDlgItem(IDC_PROCESSLIST_COBOX))->SetCurSel(3);
//GetModuleFileNameEX::检索当前进程路径
UpdateData(FALSE);
CloseHandle(handle);
}
//获取当前进程句柄
void CMemRepairDlg::GetCurrentProcessHandle()
{
int nIndex = ((CComboBox*)GetDlgItem(IDC_PROCESSLIST_COBOX))->GetCurSel();
CString processStr = "";
((CComboBox*)GetDlgItem(IDC_PROCESSLIST_COBOX))->GetLBText(nIndex, processStr);
DWORD processId = 0;
if ( m_map.size() > 0 )
{
std::map<DWORD, CString>::iterator iterator;
for( iterator=m_map.begin();iterator != m_map.end();++iterator )
{
if ( !processStr.Compare(iterator->second) )
{
processId = iterator->first;
break;
}
}
}
if ( processId == 0 ) return;
m_handle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
if ( m_handle == NULL )
{
CString errorInfo;
errorInfo.Format("error code:%d 调用函数失败!", GetLastError);
MessageBox(errorInfo);
return;
}
}
//读取一页内存
void CMemRepairDlg::ReadOnePageMem(DWORD baseptr, const char* pStr)
{
BYTE byte[4096] = {0};
//lpBaseptr:起始地址
BOOL bRect = ::ReadProcessMemory(m_handle, (LPCVOID)baseptr, byte, 4096, NULL);
LPDWORD ptr = NULL;
if ( bRect )
{
for( int i = 0;i < 4*1024-3;++i )
{
ptr = (DWORD*)&byte[i];
if ( *ptr == atoi(pStr) )
{
m_vector.push_back(baseptr+i);
}
}
}
}
//获取操作系统用于存储数据的地址
void CMemRepairDlg::GetBasePtr(const char* pStr)
{
OSVERSIONINFO osInfo;
ZeroMemory(&osInfo, sizeof(OSVERSIONINFO));
osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
::GetVersionEx(&osInfo);
DWORD baseAddr = 0;
if ( osInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )//98
{
baseAddr = 4*1024*1024;//98系统是采用的是4M
}
else
{
baseAddr = 64*1024;
}
if ( m_vector.size() > 0)
m_vector.clear();
//在开始地址到2G内存空间进行查找
for( ;baseAddr < 2*1024*1024*1024;baseAddr+=4*1024 )
{
ReadOnePageMem(baseAddr, pStr);
}
}
//通过输入值找到当前进程中内存地址
void CMemRepairDlg::OnSearchBtn()
{
// TODO: Add your control notification handler code here
GetCurrentProcessHandle();
((CEdit*)GetDlgItem(IDC_VALUE_EDIT))->GetWindowText(m_value);
GetBasePtr(m_value.GetBuffer(m_value.GetLength()));
OperatorListBox();
}
//地址列表控件操作
void CMemRepairDlg::OperatorListBox()
{
CListBox* listBox = (CListBox*)GetDlgItem(IDC_PROCESS_LIST);
std::vector<DWORD>::iterator itrator;
listBox->ResetContent();
CString str;
for( itrator = m_vector.begin();itrator != m_vector.end();++itrator )
{
str.Format("%p", *itrator);
listBox->AddString(str);
}
UpdateData(FALSE);
}
void CMemRepairDlg::OnSelchangeProcessList()
{
// TODO: Add your control notification handler code here
CListBox* listBox = (CListBox*)GetDlgItem(IDC_PROCESS_LIST);
int nIndex = ((CListBox*)GetDlgItem(IDC_PROCESS_LIST))->GetCurSel();
CString strItem;
listBox->GetText(nIndex, strItem);
((CEdit*)GetDlgItem(IDC_ADDR_EDIT))->SetWindowText(strItem);
UpdateData(FALSE);
}
//从指定的内存范围内进行搜索
void CMemRepairDlg::OnStartBtn()
{
// TODO: Add your control notification handler code here
int nSize = m_vector.size();
DWORD dwValue;
if ( m_nextVector.size() > 0 )
m_nextVector.clear();
std::vector<DWORD>::iterator iterator;
for( iterator = m_vector.begin(); iterator != m_vector.end();++iterator )
{
BOOL bRect = ::ReadProcessMemory(m_handle, (LPCVOID)*iterator, &dwValue, sizeof(DWORD), NULL);
if (bRect)
{
if ( dwValue == atoi(m_value.GetBuffer(m_value.GetLength())) )//内存的内容与输入的值相等
{
m_nextVector.push_back(*iterator);
}
}
}
m_vector.clear();
m_vector = m_nextVector;
OperatorListBox();
}
//修改内存内容
void CMemRepairDlg::OnModifyBtn()
{
// TODO: Add your control notification handler code here
CString addrStr = "";
CString modifyStr = "";
((CEdit*)GetDlgItem(IDC_ADDR_EDIT))->GetWindowText(addrStr);//需要修改的地址
((CEdit*)GetDlgItem(IDC_MODIFY_EDIT))->GetWindowText(modifyStr);
MessageBox(addrStr);
DWORD dwValue = atoi(modifyStr.GetBuffer(modifyStr.GetLength()));
DWORD addr = HexToNum(addrStr);;
BOOL bRect = ::WriteProcessMemory(m_handle,(LPVOID)addr, &dwValue, sizeof(DWORD), NULL);
if ( bRect )
MessageBox("修改成功!");
else
{
int nCode = GetLastError();
CString errorInfo;
errorInfo.Format("%d 错语码:%d", addr, nCode);
MessageBox(errorInfo);
}
}
//十六进制转化为十进制
DWORD CMemRepairDlg::HexToNum(CString str)
{
int nSum = 0;
int nLength = str.GetLength();
int i = 0;
int nTemp = 0;
do
{
TCHAR cChar = str.GetAt(--nLength);
switch(cChar)
{
case 'A':
case 'a':
nTemp = 10;
break;
case 'B':
case 'b':
nTemp = 11;
break;
case 'C':
case 'c':
nTemp = 12;
break;
case 'D':
case 'd':
nTemp = 13;
break;
case 'E':
case 'e':
nTemp = 14;
break;
case 'F':
case 'f':
nTemp = 15;
break;
default:
nTemp = cChar - 48;
break;
}
nSum += nTemp*pow(16, i);
++i;
} while (nLength > 0);
return nSum;
}
分享到:
相关推荐
游戏内存修改器是一种工具,允许用户在运行游戏时更改内存中的数据,以实现对游戏状态的修改,如生命值、金币、道具数量等。本文将深入探讨内存修改器的工作原理,以及如何使用VS2010进行编译,以及在实际应用中针对...
它提供了一个内存扫描器,可以搜索特定值或范围的内存地址,从而找到游戏中的变量。此外,CE还支持创建自定义脚本,以自动化内存修改过程,进一步提升用户对游戏数据的控制。 **2. 获取内存地址** 在CE中,用户首先...
例如,玩家可以利用它来调整角色的生命值、金币数量、等级等参数,从而提升游戏体验。GE内存修改器可能具备以下关键功能: 1. **内存搜索**:用户可以通过输入特定数值,让软件搜索内存中与该数值相关的地址,找到...
它允许用户搜索和更改程序运行时的内存值,从而实现对游戏数据的自定义,例如角色的生命值、金币数量或者游戏难度等级。源代码的公开对于学习编程、逆向工程以及软件调试有着重要的价值。下面将详细讨论内存查找修改...
2. **内存编辑**:找到目标内存地址后,用户可以直接修改内存中的数据,比如增加生命值、金币数量、技能点等,从而实现游戏作弊。 3. **动态扫描**:CE内存修改器支持动态扫描,即在游戏运行过程中持续监控内存变化...
内存修改神器,通常指的是能够对游戏或应用程序内存中的数据进行修改的工具,以实现特定功能,如提升游戏属性、作弊等。"Cheat Engine"是一款知名的开源内存调试和修改工具,它在IT领域中被广泛用于游戏调试和编程...
例如,在游戏中,玩家可能想修改角色的生命值、金币数量等,内存修改工具就提供了这样的可能性。 **MHS.exe**是这个工具的主要执行文件,双击后即可启动内存修改功能。它通常会提供一个扫描和编辑内存的界面,用户...
这个程序的功能类似于游戏内存修改器,用于改变游戏中的变量值,例如角色的生命值、金币数量等。 首先,我们要理解VC是如何与内存交互的。在C++中,我们可以通过指针来访问和修改内存。通过获取进程ID和线程ID,...
1. 法律风险:未经许可对游戏进行内存修改可能违反游戏的使用条款,甚至触犯法律,因此在实际操作时应谨慎。 2. 安全问题:不恰当的内存操作可能导致游戏崩溃,甚至影响整个系统的稳定性。因此,了解内存管理原则至...
网络游戏内存搜索修改器,通常称为游戏辅助或外挂,它的工作原理是通过读取游戏进程在内存中的数据,找到并修改关键数值,比如角色的生命值、经验、金币等。这种工具的制作涉及了几个核心知识点: 1. **内存扫描**...
2. 内存修改:找到目标数据后,用户可以直接在内存中修改这些值,实现对游戏状态的即时调整。 3. 数据跟踪:MHS_cn提供数据跟踪功能,可以监控特定地址的变化,这对于理解软件运行机制或调试程序非常有用。 4. ...
1. **内存扫描**:用户可以搜索特定的游戏数值,如生命值、金币数量等,然后修改这些数值以获得游戏优势。 2. **内存分析**:允许用户查看和修改应用程序的内存布局,了解程序运行时的数据结构。 3. **调试器**:...
5. **脚本语言**:CE还提供了一种定制的脚本语言,用户可以编写脚本来自动化内存修改过程。通过编写脚本,可以实现复杂的内存操作,比如自动跟踪、动态修改等。 6. **多进程支持**:CE可以同时连接多个进程进行内存...
CE最初是一款在个人电脑上广泛使用的作弊工具,允许用户在单机游戏中修改内存数据,如生命值、金币等,以实现游戏的自定义体验。现在,它已被开发成适用于手机的应用,让移动设备的用户也能享受到类似的功能。 在...
C#简易内存修改器的应用场景广泛,例如在游戏中修改角色的生命值、金币数量,或者在软件测试中快速修改变量值以进行调试。然而,值得注意的是,非法使用内存修改器可能导致违反软件使用协议,甚至触及法律问题,因此...
例如,如果我们知道游戏中金币的内存地址,并且已经计算出了金币到钻石之间的偏移量,我们就可以通过先找到金币的地址,然后应用这个偏移量来计算出钻石的内存地址。计算得到的地址可以被保存或添加到搜索结果列表中...
它允许用户修改运行中的应用程序的内存值,特别是对于游戏来说,可以用来调整游戏内的各种数值,如生命值、金币、经验等,从而实现对游戏体验的自定义。然而,这种行为在大多数情况下被视为作弊,特别是在多人在线...
这些游戏虽然有趣,但往往受到内置限制,如生命值、分数、金币等,而Flash游戏修改器则可以帮助玩家解除这些限制,提供更自由的游戏体验。 描述中提到的“一个可以对于FLASH制作游戏进行修改的小工具”,进一步解释...
虽然内存修改可以带来游戏体验的个性化,但这也可能违反游戏的公平性原则,甚至触犯游戏公司的服务条款。此外,不恰当的修改可能导致游戏崩溃或者不稳定。因此,在使用内存搜索工具时,应确保你了解可能的风险,并...
游戏内存扫描非CE,ArtMoney是一款来自国外的专业游戏辅助软件,它主要被用来进行游戏内存数据的搜索和修改,帮助玩家在游戏中找到并更改特定数值,例如角色的生命值、金币数量等。ArtMoney并非 Cheat Engine(CE)...