'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?
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?
函数编译后地址是固定的
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是正道
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");
}