C++反编译-虚函数的识别

;17 :        NVirtual nv; - - - - - - main栈开始 - - - - - -
0x401366    lea    -0x10(%ebp),%eax //获取栈ebp-0x10处地址起为对象nv的首地址
0x401369    mov    %eax,%ecx 
0x40136b    call   0x4385b4 <NVirtual::NVirtual()> //调用默认构造函数
;18 :        nv.setA(3);
0x401370    lea    -0x10(%ebp),%eax //获取对象nv地址
0x401373    movl   $0x3,(%esp) //传入参数一
0x40137a    mov    %eax,%ecx
0x40137c    call   0x43859c <NVirtual::setA(int)> //调用setA函数
0x401381    sub    $0x4,%esp
;19 :        cout << nv.getA() << endl;
0x401384    lea    -0x10(%ebp),%eax //获取对象nv地址
0x401387    mov    %eax,%ecx
0x401389    call   0x438588 <NVirtual::getA()> //调用getA函数
0x40138e    mov    %eax,(%esp) //传入参数一
0x401391    mov    $0x4c6860,%ecx //传入调用地址
0x401396    call   0x47e100 <std::ostream::operator<<(int)> //调用标准输出流
0x40139b    sub    $0x4,%esp //平衡栈
0x40139e    movl   $0x4b0de0,(%esp) //传入调用地址
0x4013a5    mov    %eax,%ecx
0x4013a7    call   0x47de50 <std::ostream::operator<<(std::ostream& (*)(std::ostream&))> //调用endl
0x4013ac    sub    $0x4,%esp //平衡栈
;5  :    class NVirtual { - - - - - - 构造函数栈开始 - - - - - -
0x4385b4    push   %ebp 
0x4385b5    mov    %esp,%ebp
0x4385b7    sub    $0x4,%esp 
0x4385ba    mov    %ecx,-0x4(%ebp) //传入对象首地址即this指针
0x4385bd    mov    $0x4c1450,%edx //传入虚表首地址,它的值即为函数地址!!!
0x4385c2    mov    -0x4(%ebp),%eax 
0x4385c5    mov    %edx,(%eax) //this指针的值即为虚表首地址
0x4385c7    nop
0x4385c8    leave
0x4385c9    ret
;10 :        virtual void setA(int a) { - - - - - - setA函数栈开始 - - - - - -
0x43859c    push   %ebp
0x43859d    mov    %esp,%ebp
0x43859f    sub    $0x4,%esp
0x4385a2    mov    %ecx,-0x4(%ebp)
;11 :            this->a = a;
0x4385a5    mov    -0x4(%ebp),%eax //传入对象首地址
0x4385a8    mov    0x8(%ebp),%edx //传入形参一数值
0x4385ab    mov    %edx,0x4(%eax) //传到对象第二个位置(每个位置4字节)
;12 :        }
0x4385ae    nop
0x4385af    leave
0x4385b0    ret    $0x4
;7  :        virtual int getA() { - - - - - - getA函数栈开始 - - - - - -
0x438588    push   %ebp
0x438589    mov    %esp,%ebp
0x43858b    sub    $0x4,%esp
0x43858e    mov    %ecx,-0x4(%ebp)
;8  :            return a;
0x438591    mov    -0x4(%ebp),%eax //传入对象首地址
0x438594    mov    0x4(%eax),%eax //取出对象第二个位置值
;9  :        }
0x438597    leave
0x438598    ret

 

猜你喜欢

转载自www.cnblogs.com/reverse201/p/10359564.html