CALL参数的构造与需求
写好调用CALL的模型后,我们便可以分析数据然后填入模型 那么一个调用CALL的代码便写好了. 我认为寄存器中的值可以分为3种. 一是常量,也就是固定的值,比如说push 23123,push 0 等等二是基址,这类一般是控件或者类的基址,或者游戏的基址,人物的基址,一般由ECX储存
三是数据,你可以认为是自定义的值 如 坐标, 喊话频道,喊话指针地址等等.这些都是可以自定义的. 也就是可以构造的. 常量和基址就不说了,第一种你按照反汇编代码里来写就可以了 或者你可以把1改为0或者把0改为1可能会有一些额外的收获. 参数的分析最重要的是分析出这个寄存器或者压入堆栈的数据是作什么用的. 一个构造的参数也是如此. 有新手可能会认为,调用CALL的参数看游戏调用代码如何不就可以了,反汇编写啥我们就写啥.我觉得做任何东西,我们都要知道他的原理这样才能事倍功半. 要构造一个函数,你便要知道这个参数到底在游戏中是干吗的.简单的如:走路的坐标,喊话的内容等等.这些都会比较直观的表现出来,还有就是 买卖物品的格子数,吃药的物品位置.这些也是比较好知道的.但很多数据就不是那么直观了,需要你自己一步步的去调用游戏动作的不同状态. 比如说剑侠3的走路,他没有坐标,而是4个参数,每个方向这4个参数的值都不一样,所以你要调用往那边走就要知道这4个参数的作用. 游戏中的喊话一般储存在一个临时变量里,喊完就会被这个内存地址就会被释放.这个时候是否需要辛苦的去找这个值的来源呢? 首先我们要知道喊话CALL到底需要什么东西.有些朋友就会说,需要喊话内容. 没错,喊话CALL的确只需要喊话内容.那么我在内存中开辟一个地址来存放喊话的内容.然后把这个地址代替原来反汇编中调用代码的地址,那不是更方便?写过喊话CALL的朋友可能会清楚一点. 记住 写CALL最重要的是你要知道CALL内部需要的是什么东西 例子:很多初学者朋友都不是很清楚,
为啥只要写一个CALL就可以调用喊话.
我们都知道最后那个CALL是调用喊话的核心CALL.我在文章前面说过,要给一个CALL传入适当的参数是要看CALL内部调用了那些参数.我们进入到CALL内部看看
这里是喊话CALL内部的头部部分.这里我们可以看出CALL的内部调用了4个参数.(或者是指向参数部分具体请看之前的文章)
我们分别来看看这里的4个参数到底读取了什么.按照顺序来看,首先是 喊话内容 喊话方式 喊话对象 喊话基址.从这个CALL的内部我们可以看出 CALL只需要4个参数.断在程序调用CALL的地方,我们从堆栈里可以看到这里压入了4个参数跟CALL内部是对应的.所以我们这里只需要压入4个参数即可.不需要写上面的那几个CALL
页:
[1]