首页
社区
课程
招聘
[原创]C++内嵌入汇编, 直接调用Beep函数
发表于: 2008-11-28 13:52 10986

[原创]C++内嵌入汇编, 直接调用Beep函数

2008-11-28 13:52
10986
int _tmain(int argc, _TCHAR* argv[])
{
  __asm
  {  
    //1 汇编调用Kernel32.dll Beep函数
    PUSH 500; //Duration of the sound, in milliseconds. 
    PUSH 0xFFF; //Frequency of the sound, in hertz.                     MOV EAX, 0X7C837A77; //kernel32 + beep
    CALL EAX  //EAX 保存返回值
 }
}


实践:
1 在VC下面,建立一个win32 cosole工程, 粘贴上面代码即可
2 F5运行,打开音响,可以听到。。。。声音  

原理:
BOOL Beep(
  DWORD dwFreq,
  DWORD dwDuration
);

1 __asm 是在C++里面嵌入汇编的语法
2 PUSH 500 是参数dwDuration 入栈
3 PUSH 0xFFF 是参数 dwFreq入栈
4 MOV EAX, 0X7C837A77 移动0X7C837A77 到 寄存器上
5 CALL EAX  执行“Beep”函数

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
0X7C837A77 的计算办法
kernel32.dll是 window标准的dll, 所以他的基址已经确定了
kernel32 address: 0x7c800000
Beep      address: 0x00037a77

0X7C837A77  = 0x7c800000 + 0x00037a77

图片:
上传的附件:
2008-11-28 14:09
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
呵呵,这是基本的使用方法……
2008-11-28 15:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
VC for Win64不支持内嵌汇编了。
2008-11-28 16:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可是不同系统的kernel32.dll的基地址不一样呀
对不???
2008-11-28 16:52
0
雪    币: 315
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不通用,容易出错
2008-11-28 17:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
什么意思?

在windows xp sp2下面, 难道kernel32.dll的基址大家都不一样???
2008-11-28 17:04
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
汗,只有windows xp sp2一个操作系统么?
2008-11-28 17:09
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
我记得ICC可以.
2008-11-28 17:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
呵呵, 学习了。

做程序时间长了,怎么是死脑筋了。
多谢了!!!
2008-11-28 17:14
0
雪    币: 962
活跃值: (1686)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
在 win xp sp2 下 kernel32.dll的基址也不一定相同
2008-11-30 13:14
0
雪    币: 251
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
12
在Vista下几个系统DLL的地址是不固定的,在Vista下这个程序就失效了
2008-11-30 20:09
0
雪    币: 359
活跃值: (430)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
13
DWORD dwBeep=GetProcAddress(GetModuleHandle("kernel32.dll"),"Beep"));

_asm mov eax,dwBeep
2008-11-30 21:27
0
雪    币: 327
活跃值: (30)
能力值: ( 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;
}
2008-11-30 23:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感谢楼上2位, 确实不错!

这样的确可以解决Beep的偏移地址问题了。

谁有vista的系统, 测试楼上代码能用吗?
2008-12-1 09:14
0
游客
登录 | 注册 方可回帖
返回
//