游戏修改的常用方法之一——远程读写内存(asm源码详注)

 *-----------------------------------------------------------------------
  前几日,几个朋友在局域网中玩红警对战,常因游戏中无钱而使战斗长时间不能结束,
有人就想到用游侠修改金钱来作弊,无奈在网络对战中用游侠修改游戏是要暂停游戏的,一
人停下大家都停了,作弊就被人发现了。能不能整它个一键锁定,神不知鬼不觉,不被人发
现?于是我就编写了这个“傻瓜式RA2游戏修改器”。为什么没有去破解游戏或做补钉呢?那
样的话别人玩这个机子的RA2游戏也能享受作弊待遇了,且钱数不变易被人发现作弊了:)

用法:
  ①把本程序拷到RA2游戏目录中,运行本程序,游戏程序被启动了
  ②开始一场战斗,切记,等游戏界面显示的钱数“不变”时,按下数字键盘上的星号键
第一遍搜索开始了,也许要好几秒时间,这段时间内你可以点兵派将,但不可使钱数增减。
  ③当你听到提示音且鼠标被置于屏幕左上角时,第一遍搜完了。现在赶紧让你的钱数变
化,比如建一座电站,最好是钱数再次“不变“时,可以按下数字键盘上的星号键进行第二
遍搜索了,这次是极极极的快,鼠标没有被置于左上角,说明找到正确地址并已自动锁定钱
数了。什么?钱数在变化没有锁定?非也!五秒之内你用钱了自然要减少挣钱了自然要增加
不然旁观者看到钱数不变就知道你作弊了:),这是不同于游侠的地方,要的就是这个效果。

  当一场战斗终了,要开始下一场战斗时,你只要按一下“-”键,然后重复上述步骤即
可。为什么要重新搜索?因为每一盘游戏的金钱数地址都不同。

  本程序在WinXP/SP2、ra2之1.006英文版(有中国超牛机器人的那个)运行通过且稳定
无误。如果是其他版本,只要用十六进制编辑工具搜索数值“008373cch”,改为你想要的
地址值即可,共有两处要改。这个地址值是怎么得来的?最简单的方法是用游侠了。有游侠
为啥还要用我这个破玩意儿?因为游侠的界面和暂停会让别人发现你作弊的。用游侠搜索到
的地址一般有三个,有两个地址值相差4,取较小的那个即可,最大的也是最另类的那个每
盘游戏都会变,它才是正直的金钱数保存地址,本程序就是要找到这个变化的地址并锁定数
值。

  对于那些弹出游侠界面或暂停后就死掉的游戏,用类似的方法就可以修改了吧?!如果
数值地址不是象ra2这样有多个,可在游戏中记下几个数值,然后写入一文件中,搜索时从文
件中读取数值即可。也可用键盘钩子记录按键,进行无界面动态输入。
*-------------------------------------------------------------------------------


 ,
 :

    windows.inc
    kernel32.inc
    user32.inc
    psapi.inc
   
    kernel32.lib
    user32.lib
    psapi.lib

ADD_DATA1     008373cch    

ADD_DATA3_START  01000000h    
ADD_DATA3_END     0f600000h    
MEMSIZE     10000h    







_GetProcessHandle 

 *在调试时用这段代码取得游戏进程的句柄为好
      info:PROCESSENTRY32
      :
    
     CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0 
        ,
        info.dwSize,sizeof PROCESSENTRY32
     Process32First,, info
    
           ,@F
         lstrcmpi, info.szExeFile, 
         !
             CloseHandle,
            
             OpenProcess,PROCESS_ALL_ACCESS,,info.th32ProcessID
             EXIT
        
         Process32Next,, info
     !
     CloseHandle,
     ,
EXIT:    
    

@@:    
     ,0
    *通常情况下也可以用下面的方法取得游戏进程的句柄,但要注意……
     ProcessId
     GetForegroundWindow 
        ,ProcessId
     GetWindowThreadProcessId,,
     OpenProcess,PROCESS_ALL_ACCESS,,ProcessId
    
    
    
_GetProcessHandle 





_GetDataAddr     hProcess:,num:,hmem:
     N,ListMemSize,pListMem,ReadSize
     mbi:MEMORY_BASIC_INFORMATION

     EmptyWorkingSet,hProcess 
     SetProcessWorkingSetSize,hProcess,-1,-1 

     GlobalLock,hmem 
      pListMem,
     GlobalSize,hmem
        ListMemSize,
     ReadProcessMemory,hProcess,ADD_DATA1, N,sizeof N,NULL 
     ,N 
     GlobalAlloc,GMEM_FIXED,MEMSIZE 
     , 
     ,ADD_DATA3_START 
     
@@:         VirtualQueryEx,hProcess,, mbi,sizeof MEMORY_BASIC_INFORMATION 
         mbi.State == MEM_COMMIT && mbi.Protect == PAGE_READWRITE 
              ReadSize,MEMSIZE 
             
                  mbi.RegionSizeListMemSize 
                             
                             
                              ,1000h 
                             GlobalReAlloc,hmem,,GMEM_MOVEABLE 
                             GlobalLock,
                              pListMem, 
                             GlobalSize,hmem
                              ListMemSize, 
                              
                              
                        
                          ,pListMem 
                          ,mbi.BaseAddress
                          , 
                          [-4h], 
                    
                     ,4h 
                 >=N 
                  ,ReadSize 
                  mbi.BaseAddress, 
                  mbi.RegionSize, 
              mbi.RegionSize<=0h 
        
          ,mbi.BaseAddress
          ,mbi.RegionSize 
     >=ADD_DATA3_END 
     GlobalFree,

    

_GetDataAddr 






_FindAddrInList     hProcess:,num:,hmem:
     Data,N
     DD1,DD2

     ReadProcessMemory,hProcess,ADD_DATA1, DD1,sizeof DD1,NULL 
     GlobalLock,hmem
        , 
        , 
        N, 
     
         ,[+*4h] 
         ReadProcessMemory,hProcess,, DD2,sizeof DD2,NULL 
         ,DD1
         ==DD2 
             [+*4h]
             ,N
             [+*4h] 
             N 
        
         ,num
          
     >=[] 
        ,N 
        [], 
        ,2h 

     GlobalReAlloc,hmem,,GMEM_MOVEABLE 

    
    
_FindAddrInList 





_WriteProcessData     hProcess:,hmem:
     DATA,IsRun
    
        ,2000 
        DATA,
     GlobalLock,hmem
        ,[] 
    
         >=5h 
                , 
             WriteProcessMemory,hProcess,, DATA,sizeof DATA,NULL 
            
         Sleep,1000 
             
         GetExitCodeProcess,hProcess, IsRun 
         GetAsyncKeyState,VK_SUBTRACT 
      || IsRun!=STILL_ACTIVE 
    
    
    
_WriteProcessData 






_StartGame 
     StartInfo:STARTUPINFO
     PI:PROCESS_INFORMATION

     RtlZeroMemory, StartInfo,sizeof STARTUPINFO
     StartInfo.cb,sizeof STARTUPINFO
     ,GAME_NAME
     ,
     CreateProcess,,,,,,,,, StartInfo, PI 
     Sleep,10000 
     TerminateProcess,PI.hProcess,0h 
     CloseHandle,PI.hProcess 

    
GAME_NAME:
     ,0

_StartGame 

start:
MAIN    
     msg:MSG
     num,hmem,hProcess,MutexName

     _StartGame 
     ,
     MutexName,
     CreateMutex,NULL,, MutexName
     GetLastError
     !=ERROR_ALREADY_EXISTS 
         RegisterHotKey,NULL,VK_MULTIPLY,0h,VK_MULTIPLY 
         RegisterHotKey,NULL,VK_SUBTRACT,0h,VK_SUBTRACT 
         RegisterHotKey,NULL,'X',MOD_CONTROL  MOD_ALT,'X' 
         GlobalAlloc,GMEM_MOVEABLE,1000h 
         hmem, 
         ,
         num, 
         hProcess, 
         1
             GetMessage, msg,NULL,NULL,NULL 
             msg.message==WM_HOTKEY 
                  msg.wParam=='X' 

                 msg.wParam==VK_SUBTRACT 
                     num,0h 
                 
                     num==0h 
                         hProcess 
                             CloseHandle,hProcess 
                        

                         _GetProcessHandle 
                         hProcess,
                         ,num 
                         _GetDataAddr,,,hmem
                     num>1h 
                         _FindAddrInList,hProcess, num,hmem  
                    
                
                     num==1h 
                         _WriteProcessData,hProcess,hmem 
                          ==0 
                                    
                
                 MessageBeep,MB_OK 
                 SetCursorPos,9h,9h 
                 GetCurrentProcess
                 EmptyWorkingSet, 
            
        
         UnregisterHotKey,NULL,VK_MULTIPLY 
         UnregisterHotKey,NULL,VK_SUBTRACT
         UnregisterHotKey,NULL,'X'

         CloseHandle,hProcess
         GlobalUnlock,hmem
         GlobalFree,hmem
         ExitProcess,NULL
    
    
    
    
MAIN    

 start
   

你可能感兴趣的:(病毒汇编和调试逆向技术加脱壳)