|

楼主 |
发表于 2008-5-8 14:13:03
|
显示全部楼层
原帖由 icesboy 于 2008-5-8 13:48 发表
刚看到 VirtualProtect 这个函数。。。
呵呵,VirtualProtect我注释掉了,WriteProcessMemory是无视代码段的,而且写外挂整天就和WriteProcessMemory打交道,用惯了
其实感觉是CopyMemory效率比WriteProcessMemory要高。
最快的方法就是自己在模块里面添加一个function mov(a as long,b as long)
然后用WriteProcessMemory覆盖掉,把mov a,b写进去,以后直接调用mov就快了。。。。
但是vb里面是不能直接使用a=Addressof b的,必须在函数中调用。那么我们就走个弯路:
a=Clng("&H" & Hex(Addressof b))
这个弯路太弯了。。。可以定义 f(x)=x 来解决。。
我是个懒人,习惯用一行代码解决问题。因为得到myFunc的地址只需要执行一次,后来不再需要,所以就用这个办法了,也没有效率问题。
至于你说的兼容性问题,不会有任何问题的。
原理类似于api hook
api hook是修改了api的前5个字节,跳到自己的function,而我的动态调用就是修改自己function的前5个字节,跳到了api
调用的时候,原来是这样的:
vb压栈
call myFunc
myFunc:
xor eax,eax
ret
修改以后变成:
vb压栈
call myFunc
myFunc:
jmp api
api:
xxxxxxx
ret
相当于执行api之前多了个jmp。
没有兼容性问题,而且这样call api的速度非常快,比vb的常规call法要快很多,
动态call api的时间=vb call你的普通函数的时间+执行jmp的时间
这样调用api就相当于调用一个自己的函数,不用再在msvbvm60.dll里面跳来跳去了 |
|