能力值:
( LV2,RANK:10 )
2 楼
0X7C837A77 的计算办法
kernel32.dll是 window标准的dll, 所以他的基址已经确定了
kernel32 address: 0x7c800000
Beep address: 0x00037a77
0X7C837A77 = 0x7c800000 + 0x00037a77
图片:
上传的附件:
能力值:
( LV2,RANK:10 )
3 楼
呵呵,这是基本的使用方法……
能力值:
( LV2,RANK:10 )
4 楼
VC for Win64不支持内嵌汇编了。
能力值:
( LV2,RANK:10 )
5 楼
可是不同系统的kernel32.dll的基地址不一样呀
对不???
能力值:
( LV2,RANK:10 )
6 楼
不通用,容易出错
能力值:
( LV2,RANK:10 )
7 楼
什么意思?
在windows xp sp2下面, 难道kernel32.dll的基址大家都不一样???
能力值:
( LV5,RANK:70 )
8 楼
汗,只有windows xp sp2一个操作系统么?
能力值:
( LV5,RANK:70 )
9 楼
我记得ICC可以.
能力值:
( LV2,RANK:10 )
10 楼
呵呵, 学习了。
做程序时间长了,怎么是死脑筋了。
多谢了!!!
能力值:
( LV2,RANK:10 )
11 楼
在 win xp sp2 下 kernel32.dll的基址也不一定相同
能力值:
( LV9,RANK:290 )
12 楼
在Vista下几个系统DLL的地址是不固定的,在Vista下这个程序就失效了
能力值:
( LV9,RANK:150 )
13 楼
DWORD dwBeep=GetProcAddress(GetModuleHandle("kernel32.dll"),"Beep"));
_asm mov eax,dwBeep
能力值:
( LV4,RANK:50 )
14 楼
我也试试
int main(int argc, char* argv[])
{
PROC dwBeep=GetProcAddress(GetModuleHandle("kernel32.dll"),"Beep");
printf("内核模块kernel32.dll的函数Beep地址是:0X%x\n", dwBeep);
__asm
{
//1 汇编调用Kernel32.dll Beep函数
PUSH 500; //Duration of the sound, in milliseconds.
PUSH 0xFFF; //Frequency of the sound, in hertz.
mov eax,dwBeep; //送入函数Beep地址
// MOV EAX, 0X7C8379FF; //kernel32 + beep //这是硬编码
CALL EAX //EAX 保存返回值
}
return 0;
}
能力值:
( LV2,RANK:10 )
15 楼
感谢楼上2位, 确实不错!
这样的确可以解决Beep的偏移地址问题了。
谁有vista的系统, 测试楼上代码能用吗?