找CALL的时候我们最常见的方式就是从发包函数入手进行分析。而此时又会常常遇到线程发包对于很多新手来说这也是一个不小的挑战。在这种情况下一些没有线程发包的游戏就成了新手攻略的对象只需要send下断返回返回再返回就可以找到某一个功能的CALL。但是现实往往是残酷的很多的时候虽然你找到了这CALL也确定了他的参数但是你会发现调用起来还是不成功甚至会崩溃在排除了堆栈不平衡没有赋值ecx等常见的问题以后依然没有办法解决这才是新手找CALL中最大的坑。下面我们还是随便找一个有坑的 游戏来进行分析。打开NPC是一个游戏中使用次数非常频繁的功能通常来说这个函数只要有NPC的ID或者对象作为参数就可以直接调用成功但是我们找的这个游戏调用起来还是挺复杂的。首先我们在send处下断因为已接排除了是线程循环所以直接执行到返回找到明文包找明文包的方式在前面的课程里有过讲解。我们在这里重新下断然后点击NPC返回两层找到打开NPCCALL为什么不选择直接调用明文CALL呢因为这个明文包在前面的代码中也进行一个小小的加密所以并不算是纯粹的明文。返回两层之后我们来到一个有3个参数的CALL需要注意的是如果是第一次点击NPC有可能会返回到选中CALL此时需要再明文CALL处多点一次F9来跳过选中。再次下断观察3个参数如果分析过这个游戏的数据不难看出第一个参数和NPC对象很像几乎是一模一样其实这个参数是从NPC对象拷贝过来进行使用的。由于对象的结构体很大导致第二个参数其实也是在对象范围内的此时第二个参数等于对象252C偏移。由于第三个参数是立即数1所以我们可以尝试着直接传入这两个固定参数的地址来调CALL。调用之后游戏完全没有反应这说明我们还是差了一些参数。这就是新手在分析这种CALL的时候遇到的难点甚至已经无从下手了。如果遇到这种情况不要急首先确定调CALL是否成功在函数内部的头部下断注入后发现游戏会断下这就说明调用是成功的那么接下来我们可以单步执行看一下哪一个位置让代码跳过了明文CALL那个判断就我们缺少的参数。于是我们单步向下走在离头部不远的位置发现了一个与正常点击NPC不同的跳转判断向上分析我们发现这个如果想让这里跳需要在第一个参数39的位置写入02所以调CALL的代码更新为再次点击以后发现还是没反应这说明下面还有不同的跳转于是继续向下单步执行我们再次找到了一个不同的 跳转这里正常点击NPC是不会跳的也就是说eax应该是大于0的那么到底是什么影响到了这个eax呢向上分析我们可以看出他其实是一个CALL的返回值而这CALL只有一个参数为push dword ptr ds:[0x01C11668]我们在点击NPC时会看到这个基地址里的值是04而游戏放开以后他会被写入-1那么我们也可以尝试对他写入一个04成功的打开了NPC现在参数已经齐了push的两个参数我们直接用NPC对象即可基地址中的4经过我们的不懈努力终于发现他其实是周围遍历中这个NPC的数组下标至此这个简单的打开NPCCALL我们就全都分析出来了是不是很有成就感呢