本打算直接公布 "幻想修改器 1.1" 源代码算了,但是由于它的大部分代码都是我第一次学 Masm32写的,注释又少,代码也不规范化,对于初学者来说极不方便,所以还不如直接把编写这种软件的思想写出来还好些,这也是对那些支持我的人的一个交待. 逆@风@者
时下,网络游戏横行江湖,单机版的游戏修改器已是昨日黄花,好像已无用武之地。但是我们了解了单机版的通用游戏修改器的编程原理后,再结合网络知识应该不难写出“外挂”来。
其实像 “金山游侠”,“FPE”,等等编写这些游戏修改器并不难,只不过是你不知道这些东西的思路罢了。也难怪网上关于制做通用游戏修改器的教程可以说是没有,可能是因为商业原因吧!大部分都是针对于某一个游戏的专用修改器而写的。(闲话少说!)
由于时间原因我不能一一细写,只能把那些关键部分写一写或描说。(终于开始了!) 一 、初始的准备工作。
首先我们可以这样想一下,要改写游戏的数据值,必需要有能对这个游戏进程中的数据改写的所有权限。这样我们才可以随心所欲的改游戏中的生命值,能量,锁定金钱等等。由于 windows中是不允许进程之间直接相互读的,所以我们要按照 windows的要求来操作方可进行读写。步骤如下: 要想能对某一个进程的数据进行读写,必需要获得这个进程的句柄,然后用Windows提供的ReadProcessMemory和WriteProcessMemory这两个API来读写游戏的内存。 获取进程句柄的方法很多,相信大家都应该知道吧!我还是提一下吧,第一种就是用CreateToolhelp32Snapshot,遍历系统中的所有进程,然后从中得到进程 ID后,再用 OpenProcess,打开,参数中一定要指明PROCESS_ALL_ACCESS,否则以后在写或查目标进程数据时会产生错误。第二种是用 Enuwindows(也就是递归法),或 Getwindow来得到所有窗体的句柄后用 GetWindowThreadProcessId,得到进程ID,再用 OpenProcess打开得到。需要说明的是,如果用第二种方法你还要过滤一下,因为有很多系统窗口是不可见的而且还要判断此窗口是不是父窗口,窗口标题是否为空。 所以还要加上 (IsWindowVisible,GetParent)这两个函数来判断,要不然展现在用户面前的是一大堆没用的信息。 一般的通游戏修改器都是采用的第二种方法都是以窗口标题来显示的用户只需点击相应的标题就可以了。 由于时间原因 CreateToolhelp32snapshot 和 Enumwindows我就不介绍了,我是采用的第一种方法 上面那两个许多资料上都有介绍。我就说一下如何用 Getwindow吧!
invoke GetDesktopWindow ;得到桌面窗口的句柄 invoke GetWindow,eax,GW_CHILD ;寻找桌面窗口的第一个子窗口 invoke GetWindow,eax,GW_HWNDFIRST mov phwnd,eax ;为这个子窗口寻找第一个兄弟窗口。 invoke GetParent,eax ;判断这个窗口是不是父窗口 .if !eax ;如果这个窗口没有父窗口,则置标志 mov parent,1 .endif mov eax,phwnd .while eax .if parent mov parent,0 ;复位标志 invoke GetWindowText,phwnd,addr titl,sizeof titl ;得到窗口标题文字 .if eax ;如果标题文字不为空则发到组合列表框。 invoke SendDlgItemMessage,hWinMain,combox1,CB_ADDSTRING,0,addr titl .endif .endif invoke GetWindow,phwnd,GW_HWNDNEXT ;寻找这个窗口的下一个兄弟窗口 movphwnd,eax invoke GetParent,eax .if !eax invoke IsWindowVisible,phwnd ;再判断这个窗口是否是可见的 .if eax mov parent,1 .endif .endif mov eax,phwnd .endw invokeSendDlgItemMessage,hWnd,combox1,CB_SETCURSEL,0,0 这样我们便实现了通用游戏修改器的目标进程选择功能。大家在写的过程中把符合条件的窗口句柄都保存在缓冲区中并把位置排列的和发到组合列表框中的窗口标题文字一一对应,这样可以通过选中的索引号去缓冲区中取相对 应的句柄。然后再去得到进程句柄。 本文章更多内容:1 - 2 - 下一页>> |