现在的位置: 首页 > 综合 > 正文

Win32汇编WG系列教程1——《植物大战僵尸5211314》

2013年08月07日 ⁄ 综合 ⁄ 共 2889字 ⁄ 字号 评论关闭

  开篇语:  

         WG,一个很刺眼的名词,市面上大部分的挂都是使用VB/Delphi/C++或者E语言来写的,我之前也是使用Delphi和VB,这些语言的好处就是编写简单,容易入门!尤其是E语言,基本上说都实现了WG模块化...很多新手开始学的时间,都是跟着视频教程,一步一步操作,最后成功了都不知道为什么成功!这些都语言封装度太强,直观性不是很好!对于入门的话,我还有建议使用偏底层点的语言,如:Win32Asm,C这类语言...虽然编写繁琐,但原理能很清晰的表达出来,对于日后使用高级语言编写打下牢固的基础!

建议:有8086/Win32汇编语言的基础,熟悉C语言或者其他一门高级语言,了解PE结构和Win程序的原理运行机制,以及后期过保护要用到的内核编程知识等!本系列教程都使用Win32汇编语言和OD动态调试!

——————————————————————————————————————————————

   OK,从最简单的开始上菜...(高手越过吧)

游戏:《植物大战僵尸中文版》

目的:使游戏的阳光光值达到5211314,我爱你一生一世!

思路:单机游戏吗!简单的修改下游戏内存数据就OK

工具:RadASM,CE,Spy++  关于工具的使用,下次我列专版来说!大家也可谷歌!

步骤:

1.使用CE找到游戏阳光值的内存地址,Spy++获得游戏窗口标题

2.使用Win32汇编语言实现

涉及几个简单的API:

FindWindow

GetWindowThreadProcessId

OpenProcess

WriteProcessMemory

为了更直观的表达思路,代码可能过于繁琐!但十分容易理解!

———————————————————————————— 

源码:
.386

.model flat,stdcall

option casemap:none

;***********************************************************

include windows.inc

include user32.inc

include kernel32.inc

includelib user32.lib

includelib kernel32.lib

;***********************************************************

.data

h0 db '提示',0

h1 db '植物大战僵尸中文版',0     ;游戏窗口标题

t0 db'使用前请先进入游戏,如已准备完毕,请点击确定!',0

t1 db'未获取窗口句柄',0

t2 db'未获取进程ID',0

t3 db'未获取进程句柄',0

t4 db'内存写入失败',0

t5 db'修改成功',0

ww dd ?           ;用来存放进程ID

gg dd 5211314     ;我们要修改阳光的值

;***********************************************************

.code

start:

invoke MessageBox,0,offset t0,offset h0,MB_OK

;**********************************************************

;获取窗口的句柄,并判断是否成功

invoke FindWindow,0,offset h1       

.if eax==0

invoke MessageBox,0,offset t1,offset h0,MB_OK

.endif

;***********************************************************

;获取进程的ID,并判断是否成功

invoke GetWindowThreadProcessId,eax,offset ww

.if eax==0

invoke MessageBox,0,offset t2,offset h0,MB_OK

.endif 

;***********************************************************

;获取进程句柄,并判断是否成功

invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,ww

.if eax==0

invoke MessageBox,0,offset t3,offset h0,MB_OK

.endif

;**********************************************************

;向内存写入数据,并判断是否成功

invoke WriteProcessMemory,eax,10F58418H,addr gg,4,0

.if eax==0

invoke MessageBox,0,offset t4,offset h0,MB_OK

.else

invoke MessageBox,0,offset t5,offset h0,MB_OK 

.endif

;*********************************************************

invoke ExitProcess,0

end start


————————————————————————————————
总结:新手需要注意的几点:
1.区分模块句柄,窗口句柄!区分线程ID和进程ID

2.GetWindowThreadProcessId的返回值是线程ID,而进程ID是存放在第二个

参数当中,本例为ww变量

3.OpenProcess函数的权限问题

4.使用WriteProcessMemory函数时,注意写入数据的尺寸问题!

5.为了教程需求,本阳光值的地址为动态基地址,每次启动都会变化,请注意!
————————————————————————————————
注:由于水平有限,编写仓促,如有错误或不足,请指出!谢谢
                                                                                                 

 
                                                                                              
——小生


=================

BOOL WriteProcessMemory(
HANDLE hProcess,   //进程句柄
LPVOID lpBaseAddress, //要写的内存首地址
LPVOID lpBuffer,//指向要写的数据的指针
DWORD nSize,//要写入的字节数。
LPDWORD lpNumberOfBytesWritten
);
返回值
非零值代表成功。

invoke WriteProcessMemory,eax,10F58418H,addr gg,4,0

eax
是进程句柄

10F58418H
是要改阳光值的内存首地址

addr
gg 指向要写的数据的指针 也就是要修改的值5211314(16进制)

4

要写入4个字节数.

最后一个参数 填0 估计没什么用。


问题:每次都要重新使用CE找到游戏阳光值的内存地址吗?

抱歉!评论已关闭.