26 授人以鱼不如授人以渔●亮剑吃药CALL 的分析 目标:亮剑吃药CALL 目的:写 CALL 的流程和寄存器值的跟踪. 壹 :开始分析: 今天我们来用一个笨办法来找CALL,把每一层觉得像的CALL 都断下来 ,然后把自动断下来的CALL 去掉. 下send 断点,我们先用快捷键吃药找,吃药断下来后返回 ,我们先来看看前8 层的CALL 除了send 断点 间接地址CALL 以外都断下来,然后将自动断下来的CALL 排除了.(没有执行相关动作却断下来的断点). 我们发现,一个都没有留下,继续 从第8 层开始断,到12 层,为何到12 层呢,因为12 层开始都是间接CALL了. 间接CALL 是指 CALL [ebx+12] 之类的CALL. 好了 这次剩下 3 个 我们从最底层开始写 这里是十二层的CALL, 贰:开始分析CALL 我们按照写CALL 篇的方法来写一个 CALL 首先处理堆栈. 这里压入了 6 个数据. 经过调试 发现暂时是不变的. pu sh 0b2 pu sb 0a3 pu sh 146 pu sh 1 pu sh 1 pu sh 0 call 5E8590 因为这里的数值是不变的所以我们先来处理 CALL 所需要的寄存器. 上面是 CALL的内部,我们发现其并没有调用任何寄存器的值.所以这里我们就不需要写了 然后是 内存方面的处理 这里也没有找到任何用指针写入的代码,略过. 最后我们处理堆栈平衡.我们来看看 CALL 内部的尾部是否自动平衡了堆栈 这里结尾是 RETN 并没有自动平衡,所以我们需要自己平衡下堆栈 我们这里压入了6 个数字 那么就是6*4=24 转换成16 进制就是18 好了我们来CALL 一下 好了 ,写成功了,这里我们发现 第三个压入堆栈的数值每次启动会有变化. 我们来找下 这个寄存器的值的来源. 图中红框的ECX 就是我们要找的值,这里上面我们可以看出 ECX 的值是从 [ESI+10] 我们记录一下 ECX,[ESI+10] 然后我们来找ESI 的值 图中我们可以看出 EAX 传给了ESI 值. 这里如果代码太多太乱如何找呢? 其实可以用一个方法. 首先在上面下一个断点.看看ESI 的值啥时候变的. 图中我们可以看出 运行了 005E8667 8BF0 mov esi, eax ; EAX 这句代码后 ESI 的值就变了,这个时候我们就知道 是EAX 把值传给了ESI 当然这里注意一下 ESI 的值是否和下面的一样. 我们来找找 EAX 的值, 这里我们发现EAX 在一个 CALL 的下面,我们知道 EAX 是 CALL 的返回值的存放寄存器. 我们来看看 这个 CALL 是否变化了 EAX 的值 我们发现 运行完 CALL 后 EAX ...