wodeao 发表于 2015-2-13 22:49:52

子程序逆向详细说明 分析

昨天晚上用了一个晚上的时间对一个子程序进行逆向 对每一条汇编指定都进行了详细说明,希望大家可以顶一下,看过后,如果存在什么问题,可以留言指出来。谢谢大家

------------------------------------------------------------------------------------------------
                  ---------------逆向分析训练练习说明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寄


完整资料下载:

xinxi 发表于 2015-2-14 07:30:45

看了不错 谢谢楼主 楼主

a3799218151 发表于 2015-7-10 16:47:37

太W美了 楼主我不忍直视了 呵呵
页: [1]
查看完整版本: 子程序逆向详细说明 分析