call游戏函数

来源:互联网 发布:三国杀新于吉 淘宝 编辑:程序博客网 时间:2024/05/19 23:52
一直以来我都是在潜水,很感谢dxmqj1983的两篇原创,是他让我有动力去写这篇文章

现在网上很多人都问如何调用游戏中的CALL,这里我就演示一下如何调用一个简单的CALL,其实调用可以算是比较简单的一件事,主要就是堆栈平衡就可以了,最难的还是找CALL,这需要很强的反汇编能力,还有分析能力,我只是菜鸟一只,只能做下面这个简单的教程.
调用游戏中的CALL必须要注入才能调用,关于如何注入我就不多说了,网上很多,而且我也是刚接触DELPHI,只看了4天的《delphi7完美经典》,好像ccb也是用DELPHI的,我记得他说过^_^
好,下面我就开始正题
下面的代码包括两部分,一个是函数,一个是调用,大家应该理解的,很简单。
procedure number(num:integer);
var
sum:integer;
begin
sum:=num+485;
showMessage(inttostr(sum)); //显示结果用
form1.edit1.text:=inttostr(sum);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage('aaaaaaaaaaaaaaaaaaa'); //调用函数前先showmessage,方便调试
number(45);
end;
生成程序后我们就可以接下去做了,调试当然是使用Ollydbg了,查找字符串“aaaaaaaaaaaaaaaaaaa”(上面在调用函数之前showmessage就是这个原因),下断点,运行程序,程序断下了
00453838   MOV EAX,Project1.00453858 ; ASCII "aaaaaaaaaaaaaaaaaaa" 断在这里
0045383D   CALL Project1.0042736C
00453842   MOV EAX,2D           ;2D的十进制是多少?
00453847   CALL Project1.004537C4
单步运行,到第一个CALL的时候弹出“aaaaaaaaaaaaaaaaaaa”对话框,说明下一步就是调用开始,到第二个CALL 的时候,弹出“530”对话框,说明已经调用了函数,这里第二个CALL就是关键,004537C4就是函数的入口,好了,Ollydbg就到此结束了,接着就到了实现的部分。

记住,调用CALL需要注入,我只写实现的部分。
procedure TTestForm.Button1Click(Sender: TObject);
var
Address:pointer;
begin
Address:=Pointer($004537C4);   //函数入口地址
asm
  pushad             //保存寄存器环境
  mov eax,47         //参考上面的反汇编
  call Address         //正式调用函数
  popad             //恢复寄存器环境
end;
end;

运行一下,结果出来了,是532,调用成功。

是不是很简单,VB是不行的了,所以就不要问VB的实现方法了,VC我不会,谁会的就写一下,方便一下大家。有什么不懂的,我可能不能解答了,还有一个星期就要考试了,需要奋力看书了。
PS:基础还是最重要的,如果什么都不懂,我算我给你源码,你也不会,所以尽量学好基础,熟练了,自然就很容易掌握其他语言,所以学VB的不要放弃,我之前也是学VB的,目的是做修改器-。-!我转DELPHI也是一两个星期前的事,主要是帮我的室友写武林外传的外挂。
文科一直以来都很差,所以表达不是很清楚,请多多包涵。

By gatt
----------------------------------------

这个47是哪儿来的,不是45么...

还有DELPHI不是PARSCAL调用么?也就是说它是函数体外平衡堆栈的,number()函数中有临时变量SUM,是否应该在CALL完以后要平衡堆栈retn 4...

------------------------------------------

关于47怎么来的,刚才我看了一下源代码,基本上理解了,我来回答你。
原程序调用函数时用十进制45做参数,结果函数中因为sum:=num+485;,所以函数调用后会显示530(485+45)。并且把45做为参数来调用函数,在汇编中就体现为这一句:00453842   MOV EAX,2D。

而楼主在调用部分中,故意以一个不同于45的参数,就是47,来调用同一个函数,主要是要让大家看到由程序自己调用和由我们从外部调用之间的不同。结果经过我们用47做参数来调用,显示的结果就是532了(485+47)。就是这个意思。

原创粉丝点击