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 就是我们要找的