控制台版内存修改器

还没学MFC ,那就用控制台界面将就一下吧,一个游戏内存修改器。

先贴下代码:

 

#include  < stdio.h >
#include 
< windows.h >

BOOL FindFirst(DWORD dwValue);
//  函数声明 在目标进程空间进行第一次查找
BOOL FindNext(DWORD dwValue);  //  在目标进程地址空间进行第2、3、4……次查找

DWORD g_arList[
1024 ];         //  地址列表
int  g_nListCnt;             //  有效地址的个数
HANDLE g_hProcess;         //  目标进程句柄


BOOL WriteMemory(DWORD dwAddr, DWORD dwValue);
void   ShowList();

int  main()
{
    
//  启动02testor进程
     char  szFileName[] = " ..//02Testor//Debug//02testor.exe " ;
    STARTUPINFO si 
=  {  sizeof (si) };
    PROCESS_INFORMATION pi;
    ::CreateProcess(NULL,szFileName,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,
& si, & pi);

    
//  关闭线程句柄,既然我们不使用它
    ::CloseHandle(pi.hThread);
    g_hProcess
= pi.hProcess;

    
//  输入要修改的值
     int  iVal;
    printf(
" Input val =  " );
    scanf(
" %d " , & iVal);

    
//  进行第一次查找
    FindFirst(iVal);

    
//  打印出搜索的结果
    ShowList();
    
    
while (g_nListCnt > 1 )
    {
        printf(
" Input val =  " );
        scanf(
" %d " , & iVal);
        
//  进行下次搜索
        FindNext(iVal);
        
//  显示搜索结果
        ShowList();
    }

    
//  取得新值
    printf( " New value =  " );
    scanf(
" %d " , & iVal);

    
//  写入新值
     if (WriteMemory(g_arList[ 0 ],iVal))
        printf(
" Write data success  " );
        
    
    ::CloseHandle(g_hProcess);

    
return   0 ;
}

BOOL CompareAPage(DWORD dwBaseAddr,DWORD dwValue)
{
    
//  读取1页内存
    BYTE arBytes[ 4096 ];
    
if ( ! ::ReadProcessMemory(g_hProcess,(LPCVOID)dwBaseAddr,arBytes, 4096 ,NULL))
        
return  FALSE;

    
//  在这1页内存中查找
    DWORD *  pdw;
    
for ( int  i = 0 ;i < ( int ) 4 * 1024 - 3 ;i ++ )
    {
        pdw
= (DWORD * ) & arBytes[i];
        
if (pdw[ 0 ] == dwValue)  //  等于要查找的值?
        {
            
if (g_nListCnt >= 1024 )
                
return  FALSE;
            
//  添加到全局变量中
            g_arList[g_nListCnt ++ ] = dwBaseAddr + i;
        }
    }

    
return  TRUE;
}

BOOL FindFirst(DWORD dwValue)
{
    
const  DWORD dwOneGB = 1024 * 1024 * 1024 ;
    
const  DWORD dwOnePage = 4 * 1024 ;

    
if (g_hProcess == NULL)
        
return  FALSE;

    
//  查看操作系统类型,以决定开始地址
    DWORD dwBase;
    OSVERSIONINFO vi 
=  {  sizeof (vi) };
    ::GetVersionEx(
& vi);
    
if (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
        dwBase
= 4 * 1024 * 1024 ;
    
else
        dwBase
= 640 * 1024 ;

    
//  在开始地址到2GB的地址空间进行查找
     for (;dwBase < 2 * dwOneGB;dwBase += dwOnePage)
    {
        
//  比较1页大小的内存
        CompareAPage(dwBase,dwValue);
    }

    
return  TRUE;
}

BOOL FindNext(DWORD dwValue)
{
    
//  保存m_arList数组中有效地址的个数,初始化新的m_nListCnt值
     int  nOrgCnt = g_nListCnt;
    g_nListCnt
= 0 ;

    
//  在m_arList数组记录的地址处查找
    BOOL bRet = FALSE;

    DWORD dwReadValue;

    
for ( int  i = 0 ;i < nOrgCnt;i ++ )
    {
        
if ( ! ::ReadProcessMemory(g_hProcess,(LPVOID)g_arList[i], & dwReadValue, sizeof (DWORD),NULL))
            
return  FALSE;
        
if (dwReadValue == dwValue)
        {
            g_arList[g_nListCnt
++ ] = g_arList[i];
            bRet
= TRUE;
        }
    }
    
    
return  bRet;
}

//  打印出搜索到的地址
void  ShowList()
{
    
for ( int  i = 0 ;i < g_nListCnt;i ++ )
    {
        printf(
" %08lx " ,g_arList[i]);
    }
}

// 写内存
BOOL WriteMemory(DWORD dwAddr,DWORD dwValue)
{
    
return (::WriteProcessMemory(g_hProcess,(LPVOID)dwAddr, & dwValue, sizeof (DWORD),NULL));
}

 

几个注意的地方:

1.代码中出现的 (LPVOID)dwBaseAddr  指的是 (void*)dwBaseAddr  把地址dwBaseAddr做为空类型的指针,指针的值是 dwBaseAddr  地址的值。
2.代码中有这么一段:

    DWORD *  pdw;
    
for ( int  i = 0 ;i < ( int ) 4 * 1024 - 3 ;i ++ )
    {
        pdw
= (DWORD * ) & arBytes[i];
        
if (pdw[ 0 ] == dwValue)  //  等于要查找的值?
        {
            
if (g_nListCnt >= 1024 )
                
return  FALSE;
            
//  添加到全局变量中
            g_arList[g_nListCnt ++ ] = dwBaseAddr + i;
        }
    }

这里i为什么小于4×1024-3呢? 由 pdw=(DWORD*)&arBytes[i]  由左右相等原则 有 *pdw=*&arBytes[i] 因为他们都是DWORD型的,占四个字节,所以i最多取到4×1024-4,此时=*&arBytes[i]占据的字节号为4×1024-4,4×1024-3,4×1024-2,4×1024-1

附上测试例程:

 

#include  < stdio.h >

int  g_nNum;     // 全局变量测试

int  main( int  argc, char *  argv[])
{
    
int i=198;
    g_nNum
=1003;
    
while(1)
    
{
        printf(
"i=%d,addr=%08lx;g_nNum=%d,addr=%08lx  ",++i,&i,--g_nNum,&g_nNum);
        getchar();
    }


    
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值