回 帖 发 新 帖 刷新版面

主题:CALL指令的疑问

对汇编接触比较少:
关于CALL指令,
如果我想通过CALL来调用WIN32 API.(如:LoadLiraryW)用GetProcAddress得到LoadLiraryW的地址.为什么使用CALL调用的时候不能直接使用这个地址呢(第一个参数已经压入栈了).而是要通过一点点计算.
相关代码链接为:http://www.codeproject.com/w2k/regsvrex.asp
m_pushEAX = 0x50; //               push        eax  
        m_pushECX = 0x51; //               push        ecx  
        m_pushEDX = 0x52; //               push        edx  
        m_push = 0x68;
        m_dwAddrLibPath = dwRemoteAddrOfThis;
        m_call = 0xE8;      //               call
        DWORD dwAddrLoadLibraryW = PtrToUlong(GetProcAddress(GetModuleHandle(_T("kernel32.dll")), "LoadLibraryW"));
        m_dwRelAddrLoadLibraryW = dwAddrLoadLibraryW - (dwRemoteAddrOfThis + ((BYTE*)&m_dwRelAddrLoadLibraryW - (BYTE*)this) + sizeof(DWORD));//这里为什么这样计算,我始终没弄明白.

        m_popEDX = 0x5A;  //               pop         edx  
        m_popECX = 0x59;  //               pop         ecx  
        m_popEAX = 0x58;  //               pop         eax  
        m_jmp = 0xE9;     //               jmp
        m_dwRelAddr = dwAddrToJump - (dwRemoteAddrOfThis + sizeof(LoadLibraryCode)) ;

回复列表 (共1个回复)

沙发

建议去www.aogosoft.com提问。

我来回复

您尚未登录,请登录后再回复。点此登录或注册