子程序逆向详细说明 分析
昨天晚上用了一个晚上的时间对一个子程序进行逆向 对每一条汇编指定都进行了详细说明,希望大家可以顶一下,看过后,如果存在什么问题,可以留言指出来。谢谢大家------------------------------------------------------------------------------------------------
---------------逆向分析训练练习说明2010.02.28-----------------
------------------------------------------------------------------------------------------------
00402030/> \55 PUSH EBP //保存当前堆栈指针 相当于{ //此时在栈顶指向的是保存上一个函 数CALL后的下一个地址,PUSH EBP 后,此时 就是这个函数的 返回地址。就是常说的保存堆栈环境。
00402031|.8BEC MOV EBP,ESP //把当前栈顶的值放EBP里 相当于把当前函数的EBP设当前栈顶的值, MOV EBP,ESP 后,二个寄存器的值相等,都是同时指向栈顶。这时的
就是程序的返回地址 也就是返回地址
上面的功能是保护上一个调用的EBP堆栈基址和把这一个函数的EBP的 值为ESP的值 就是把这个函数的EBP地址移到ESP上,现在栈底和栈顶 是处于同一个地址上的,函数开始后,寄存器或是参数压入堆栈后, ----------------------------------------------------------------EBP指向的就是栈底,ESP指向的就是栈顶。
00402033|.6A FF PUSH -1 //定义一个指针变量 压入堆栈 这个变量的值是FFFFFFFF 我在这里 就是这个临时变量的地址,也就是保存构造函数和析构函数的 指针。
00402035|.68 5B3B4000 PUSH ReverseM.00403B5B //SEH 处理程序安装//异常处理链安装程序 这里的PUSH 00403B5B 实际上是把异常处理的入口地址压入堆栈 就是调用这个异常 处理程序的系统回调函数,当发生错误的时候调用这个系统回 调函数来处理异常,处理的顺序是根据链表层的顺序来进行处理的。 如果处理成功,程序可以继续执行代码,如果处理失败就是弹出系统 错误信息,程序结束。
0040203A|.64:A1 0000000>MOV EAX,DWORD PTR FS: //把FS: 当前线程的结构化异常处理结构(SEH)的地址放到EAX里 FS:实际上就是指向原来的的异常处理链地址。
00402040|.50 PUSH EAX //压入EAX 保存 表示把原来的异常处理链地址进行保存起来
----------------------------------------------------------------把原先的异常处理结构体的指针保护起来
00402041|.64:8925 00000>MOV DWORD PTR FS:,ESP //把当前异常处理链的地址指向ESP指针 现在的异常入口指向栈顶
----------------------------------------------------------------
00402048|.83EC 50 SUB ESP,50 //把ESP指针向上移动20个地址 1个地址是4个字节 相当于现在的ESP= 原来的ESP+50
0040204B|.53 PUSH EBX //保存原来EBX基地址寄存器
0040204C|.56 PUSH ESI //保存原来ESI源变址寄存器
0040204D|.57 PUSH EDI //保存原来EDI目的变址寄存器
0040204E|.51 PUSH ECX //保存原来ECX寄存器
到这里后算是把堆栈环境保护好 等程序结束里弹出保存信息,恢复 ----------------------------------------------------------------堆栈,继续程序运行,已达到程序的完整性。
0040204F|.8D7D A4 LEA EDI,DWORD PTR SS: //把EDI的指针指向 相当于 0C=12个字节 是 前面压入三个堆栈的地址数 EDI的指针到了这个位置 实际 上就是到了压入EBX后EBX的值的指向地址。
00402052|.B9 14000000 MOV ECX,14 //把ECX寄
完整资料下载:
看了不错 谢谢楼主 楼主 太W美了 楼主我不忍直视了 呵呵
页:
[1]