在98下往.exe文件中,写入
......
gamestart:
  call vstart
vstart:
  pop ebp
  sub ebp, offset vstart
  mov dMessageBox[ebp], 0bff541bah ;MessageBox地址的硬编码。
 ...........
  ....
ret
sMess db "String", 0
dMessageBox dd 0
vend:
....
可以弹出对话框。
但在2000下,把MessageBox地址的硬编码进行相应的替换,
写入文件,为什么不能运行????????
2000下的MessageBox 的硬编码为77e175d5h。此帖子在ASM板块有两个,此处解决者,可到ASM板块领分。

解决方案 »

  1.   

    没作过win32 的asm ,帮你up!
      

  2.   

    我只知道你错了,俺也碰到过,到现在也没解决,
    帮你UP
    帮你UP
    帮你UP
    帮你UP
    帮你UP
      

  3.   

    2000下的API的Dll和所属进程在同一地址空间,这点和Win9x/me存在所有进程存在共享的地址空间不同。
    MessageBox地址的不能用98的方法寻址。
      

  4.   

    在GOOGLE.COM下搜索:Win2K下的Api函数的拦截 
    有详细解释。
      

  5.   

    多谢。
    我问的问题不是出在这。
    vstart:
      call next
    next: 
      pop ebp
      sub ebp, offset next
      mov eax, old_base[ebp]
      add eax, old_addr[ebp]
      push eax
      ret
    ...
    old_base dd 0
    old_addr dd 0
    vend:
    为什么这段代码加到.exe文件中可以执行(98环境下)
    2000下为什么会报错。
    可以不涉及刚才我所说的API函数地址的硬编码,只是一条跳转指令。
    之所以采用硬编码,只是为了测试用。
    希望多多指教。
      

  6.   

    多谢。
    我问的问题不是出在这。
    vstart:
      call next
    next: 
      pop ebp
      sub ebp, offset next
      mov eax, old_base[ebp]
      add eax, old_addr[ebp]
      push eax
      ret
    ...
    old_base dd 0
    old_addr dd 0
    vend:
    为什么这段代码加到.exe文件中可以执行(98环境下)
    2000下为什么会报错。
    可以不涉及刚才我所说的API函数地址的硬编码,只是一条跳转指令。
    之所以采用硬编码,只是为了测试用。
    希望多多指教。
      

  7.   

    mov eax, old_base[ebp]
    add eax, old_addr[ebp]
    这两行中的基址好象有问题吧,以0为基址在2000下是必定要发生内存错误的。因为好象系统底部的内存是操作系统专用的,应用程序不能访问。
    你这两行的效果与EBP*2有什么区别?
      

  8.   

    2000下可能CWnd没有所以没有弹出Messagebox
      

  9.   

    你可以用GetProcProcess得到MessageBoxA,MessageBoxW的地址
      

  10.   

    2000下的MessageBox 的硬编码为77e175d5h。好像不对。
    我机器上User32.dll的base是77df0000,MessageBoxA的Entry是2776c
      

  11.   

    2000下的MessageBox 的硬编码为77e175d5h。好像不对。
    我机器上User32.dll的base是77df0000,MessageBoxA的Entry是2776c
      

  12.   

    2000下的MessageBox 的硬编码为77e175d5h。好像不对。
    我机器上User32.dll的base是77df0000,MessageBoxA的Entry是2776c
      

  13.   

    up,但还想说原因是2000内核与 98 不同 ,2000更安全,可能会对随便在.exe文件中加代码有限制
      

  14.   

    w2k的内核指令很复杂!在最新的MSDN中查找一下
      

  15.   

    你的全部代码用ASM写成??最好贴出主要代码
      

  16.   

    2000的是32位的寻址空间啊,98是16位的,两者的区别是很大的,建议用api试试
      

  17.   

    首先感谢大家的关注。
    本人用VC曾经做过一个测试(2000下),把一段可执行的二进制代码写入exe文件,并添加一个相应的Section Header可以成功。(也是弹出一个对话框)
    现在这个过程和那个非常的类似。
    只不过是一段未编译的汇编代码,而此段代码,可以在98下成功,而2000下就
    不可以,到底是怎么回事?
    还望大家多多帮忙。
      

  18.   

    将你的98下可运行的exe贴上来
      

  19.   

    将你的98下可运行的exe贴上来
      

  20.   

    你要在第一行加入初始化涵数InitCommonControls,其实这个调用就一个RET