(转)Delphi新手跟我学写CALL,附完整原程序


======================================================
注:本文源代码点此下载
======================================================

在开始进入正题前先罗嗦几句:

1、本人也刚学delphi不久,也刚通过《诛仙》游戏的绝大部分call不久。所以在以下所说所列举的例子并不算是名门正中的写法,如有不当,请各位原谅。

2、本人所学基本都是在“漆黑一片”中自己摸索出来的。也正因如此,因而深感各位新手想入门但又无处可问的无奈心情。所以将在下面为各位新手较详细地列举2个call的应用例子。希望大家不要象我一样走那么多的弯路。更希望论坛的各位老大能多多开源,多点无私的奉献。

抗日时期,中国之所以能屡屡打败强大的帝国,就是因为有大多数国人的无私奉献和团结一致的精神!

......

废话一堆后进入正题,下面我将会通过《诛仙》游戏分几段讲述有参数call、无参数call的调用;call在游戏更新后,自己如何找回入口地址;以及《诛仙》游戏中几个基址间的关系。

第一讲 --- 《诛仙》的基址

在论坛中看过相关帖子的朋友不难发现《诛仙》有三个所谓的基址:基址1:$12f82c基址2:$9045ec基址3:$900adc

其中它们之间的关系如下:[$12f82c]=$9045ec 、 $9045ec=[$900adc+1c]

之所以一开始就先说这个,是想希望大家学会在游戏更新后,如何快速地找到新的,适合自己习惯的有用基址。从上面关系不难看出。$12f82c是三个基址中最为稳定的一个,事实上在6.19、7.3更新时它就没,而其他2个都变了。当然如果你本身是用$12f82c这个做基址的也就免去了不少麻烦。不过我可以证实这个基址1并不能在大部分的环境下(winxp、win2000等)通过,如果不是只做给自己一个用的,最好不用这基址。

我就选用了基址2:$9045ec。因为[$12f82c]=$9045ec,所以当游戏更新了基址时,只要用ce看看[$12f82c]=?就ok了,明白了吗?(当然这并不绝对,但大部分是可行的啦,除非游戏真的动大手术啦)

而基址3:$900adc则是用于call里面的(大家看看《诛仙》call地址公布就知道这地址的重要性了),所以一定要学会怎找到这基址。

方法就是用ce跟踪[$12f82c]=?这个“?”地址是啥(现在是$9045ec),再根据“mov ecx, [eax+1c]”查看 eax的值(现在是$9045d0),最后查找$9045d0 得到 $900adc,ok?

第二讲 --- 《诛仙》的死亡回城call(无参数call)

为了大家方便学习,我一次性把整个讲解的实例程序打包贴出来,里面包括了角色基本信息的读取(含名字);无参数call(死亡回城)调用;有参数call(技能攻击)调用(仅以重击为例)。

许多新手也象我当初一样,会问论坛怎没有一个无参数call的例子。其实有参数和无参数call的调用是一样的。我就用《诛仙》的死亡回城call作为无参数call的实例,其中关键过程如下:

......

// ---- 定义参数指针

type

p1_str = packed record

param1: dword;

param2: dword;

end;

pp1_str = ^p1_str;

......

//打开游戏进程并一次性申请注入空间

procedure tform1.formcreate(sender: tobject);

begin

myhwnd:=findwindow(nil, 'element client');

getwindowthreadprocessid(myhwnd, @threadid);

hprocess_n := openprocess(process_all_access, false, threadid);

if hprocess_n = 0 then

begin

messagebox(handle, ' 请退出先登录运行《诛仙》游戏。 ','提示',mb_ok+mb_iconerror);

exit;

end;

base0:=$9045ec;// 基址

memsize:=128;// 128的空间已足够,无须4096这么浪费

threadadd := virtualallocex(hprocess_n, nil, memsize, mem_commit, page_readwrite);

paramadd := virtualallocex(hprocess_n, nil, 20, mem_commit, page_readwrite);

end;

.....

//一次性释放空间

procedure tform1.formdestroy(sender: tobject);

begin

virtualfreeex(hprocess_n, threadadd, memsize, mem_release);

virtualfreeex(hprocess_n, paramadd, 20, mem_release);

closehandle(hprocess_n);

end;

.....

//call注入

procedure injectfunc(func: pointer; param: pointer; paramsize: dword);

var

hthread: thandle;

lpnumberofbytes: dword;

begin

if hprocess_n0 then

begin

injectfunc(@mycall1, @myparam, paramsum);

end;

end;

.....

//死亡后按这按钮能回城

procedure tform1.button2click(sender: tobject);

begin

retcity;

end;

.....

第三讲 --- 《诛仙》的技能攻击call(有参数call)

有了上面无参数call做基础,有参数call就好做了,下面以《诛仙》“重击”技能攻击call为例,其中关键过程如下:

......

// ---- 定义参数指针

type

p1_str = packed record

param1: dword;

param2: dword;

end;

pp1_str = ^p1_str;

......

//打开游戏进程并一次性申请注入空间

procedure tform1.formcreate(sender: tobject);

begin

myhwnd:=findwindow(nil, 'element client');

getwindowthreadprocessid(myhwnd, @threadid);

hprocess_n := openprocess(process_all_access, false, threadid);

if hprocess_n = 0 then

begin

messagebox(handle, ' 请退出先登录运行《诛仙》游戏。 ','提示',mb_ok+mb_iconerror);

exit;

end;

base0:=$9045ec;// 基址

memsize:=128;// 128的空间已足够,无须4096这么浪费

threadadd := virtualallocex(hprocess_n, nil, memsize, mem_commit, page_readwrite);

paramadd := virtualallocex(hprocess_n, nil, 20, mem_commit, page_readwrite);

end;

.....

//一次性释放空间

procedure tform1.formdestroy(sender: tobject);

begin

virtualfreeex(hprocess_n, threadadd, memsize, mem_release);

virtualfreeex(hprocess_n, paramadd, 20, mem_release);

closehandle(hprocess_n);

end;

.....

//call注入

procedure injectfunc(func: pointer; param: pointer; paramsize: dword);

var

hthread: thandle;

lpnumberofbytes: dword;

begin

if hprocess_n0 then

begin

injectfunc(@mycall8, @myparam, paramsum);

end;

end;

.....

//按这按钮能用“重击”技能攻击怪

procedure tform1.button3click(sender: tobject);

begin

jnid:=$da;// 这里举例用“重击”的id号为例

jineng;

end;

.....


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
第一部分: 感受Delphi 7的可视化开发环境,并制作了若干简单的实例,着重从开发步骤的角度引导读者完成实例的制作,并详细讲解了开发过程中遇到的关于控件的和语言的相关问题,使得读者对Delphi 7的开发流程有初步的了解。 第1章 主要介绍Delphi 7的安装以及对可视化开发环境的熟悉。 第2章 通过手把手的几个实例的讲解,引导读者进行“搭积木”式的实例开发,从中感受使用Delphi 7开发应用程序的简洁和高效,并进一步掌握可视化开发环境的使用。 第二部分: 第3章和第4章分别对使用Delphi 7进行系统开发的语言语法以及开发中有关错误的调试技巧进行了讲解,使读者从理性上认识Delphi 7开发并熟练掌握程序调试技巧。 第3章 主要讲解Delphi 7开发应用程序所使用的语言——Object Pascal语言。除了概念上的阐述外,绝大部分的基本知识将从实例的制作中获取,避免了枯燥的讲解。 第4章 介绍用Delphi 7进行软件开发过程中经常遇到的错误以及解决办法。本章摈弃了传统的Delphi教程中枯燥的调试工具操作讲解和对错误理论的讲解,而是集中介绍了开发过程中最经常和最有效的调试手段,并简要介绍了错误的类型和解决办法。同样的,本章以实例的形式把相关的知识融入其中。 第三部分: 接下来的第5章、第6章和第7章对使用Delphi 7进行系统的软件开发进行了讲解,使读者在更高的层次上看清Delphi 7开发是进行设计而不仅仅是进行编码。 第5章 主要介绍如何使用Delphi 7开发出美观大方的应用程序以及开发过程中的相关原则。 第6章 主要介绍了有关图形控件方面的运用技巧。 第7章 主要介绍了有关数据库开发的相关知识,用一个简单的例子讲解了数据库的查询、删除、插入和更新等基本功能。 第四部分: 第8章是本书的最后一部分。该部分通过一个实例完成对本书基本知识的总结与复习。这里既有美观的界面设置,也有逻辑的代码设计,还有整个系统开发的分析说明。通过这一章力求读者从整体上把握软件开发的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值