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

   开篇语:  
         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找到游戏阳光值的内存地址吗?

你可能感兴趣的:(汇编ASM)