ce吧 关注:195,842贴子:3,798,780
  • 3回复贴,共1

扫盲第三弹,带你看懂Call,自己分析参数

取消只看楼主收藏回复

重申,本扫盲系列目的:当你学习完全系列后,可以独立完成分析,及实现绝大部分常规功能。
往期回顾
1.扫盲第一弹,基址到底是什么? https://tieba.baidu.com/p/5833596628?pid=121363695480
2.扫盲第二弹,带你看懂解密函数,写出简单的解密 https://tieba.baidu.com/p/5834247161?pid=121372624427
今天的科普,带你分析call,完成call参数的分析,及如何实现调用
今日范例 城镇移动Call
不多说,老规矩,先上汇编代码


IP属地:云南1楼2018-08-11 11:52回复
    如上,今天的汇编代码有点长,我就不一一分析了,我们直接来看编译后的伪代码。通过伪代码,你就会有一个直观的认识,城镇移动call,到底是什么样的

    可以看到,城镇移动call,为__stdcall类型
    函数原型为
    int __stdcall sub_3406DC0(int a1)
    我们可以看到,函数第一句语句为 发送缓冲(36)是不是感觉超级眼熟?对,没错!这就是组包移动的来历,包括接下来发送的参数,都和组包移动一样。那我们接下来,就来分析这个call


    IP属地:云南2楼2018-08-11 11:58
    收起回复
      通过伪代码,我们可以直观的看到,参数为一个整数型。那么,我们可以基本确定,参数为一个指针,指向一个结构体。那么我们继续看下面我标注的结构体参数的内容,总共7个。
      由此,我们可以初步得到如下参数结构体

      好的,我们现在知道了参数,那怎么知道程序调用时的值呢? 最简单的办法,HOOK
      接下来,我们HOOK这个call,来查看参数
      关于HOOK,我在之后的教程,会一一来分析,包括__stdcall,__fastcall,__thiscall的HOOK
      现在略过,我们直接看HOOK后的调用结果

      看到这里,相信大家已经看明白了
      参数0=大地图ID,参数1=区域ID,参数2=X,参数3=Y 其余的为固定值
      那么,我们重新改下我们之前定义的结构体参数,以及函数原型

      函数原型


      IP属地:云南3楼2018-08-11 12:10
      回复
        那么,现在我们就可以很简单的调用城镇移动Call了
        如下

        今日的扫盲,到此就结束了,接下来的教程,重点为告诉大家,怎么找到call,以及如果通过HOOK获取参数
        大家如果有什么问题,可以在帖子提问


        IP属地:云南5楼2018-08-11 12:15
        回复(3)