'vb模块代码:
Public Function add(a As Long) As Long
       add = 5
       MsgBox "运行在函数:add"
End FunctionPublic Function bdd(a As Long) As Long
       bdd = 88
       MsgBox "运行在函数:bdd"
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'窗口代码:
Private Sub Form_Load()
       CopyMemory AddressOf add, AddressOf bdd, 5
       '以上这句代码为什么没有更改add函数的地址?而程序又运行正常?
       add 20
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
我想更改函数add的地址为函数bdd的地址,如何可以达到目的?
也就是当我的代码调用函数add的时候,就间接的调用了函数bdd?

解决方案 »

  1.   

    用API HOOK
    函数编译后地址是固定的
      

  2.   

    操作系统将代码段添加了写保护,CopyMemory 可能不能执行,可以试试 WriteProcessMemeory 。
      

  3.   

    这样做是不能被操作系统允许的
    CopyMemory AddressOf add, AddressOf bdd, 5 不会出错,因为,申明:Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)这样不会出错!因为根本就没更改函数地址!
    改成这样:Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDest As Long, ByVal pSrc As Long, ByVal ByteLen As Long)
    就会出错!用API HOOK是正道
      

  4.   

    函数地址是固定的。方法上面都说了,有点像和截获消息类似,不过你要截获的是函数的地址,难度要大得多,并改变这个地址。网上C++的API HOOK,VB的都有。
      

  5.   


    http://topic.csdn.net/u/20080920/21/9b5078b0-0c3c-4fb0-a1b6-1044c949bc93.html?seed=1397303189楼主让我在这里回复一下,由于原贴是C/C++版的,所以也只有C代码了.下面的程序和实现的相关性很大,请楼主注意.#include <stdlib.h> 
    #include <stdio.h>
    #include <windows.h>
    //////////////////////////////////////////////////////////////////////////// 
    void fun1() 

        printf("运行在函数:fun1\n"); 

    //////////////////////////////////////////////////////////////////////////// 
    void fun2() 

        printf("运行在函数:fun2\n"); 

     
    //////////////////////////////////////////////////////////////////////////////////////// 
    int main() 

        int to_be_written = *(int*)((int)fun2+1) + (int)fun2 - (int)fun1;    WriteProcessMemory(GetCurrentProcess(), (char*)fun1+1, &to_be_written, 4, NULL);
        fun1();
        system("pause");