发新话题
打印

下面是一个c++和汇编混合编程的的代码,提示“Undefined label ‘SPMessageB

下面是一个c++和汇编混合编程的的代码,提示“Undefined label ‘SPMessageB

  typedef   void   (WINAPI   *SPMESSAGEBOXA)   (HWND,   LPCTSTR,   LPCTSTR,   UINT);     
  SPMESSAGEBOXA   SPMessageBoxA;     
  void   OtherMessageBox(HWND,   LPCTSTR,   LPCTSTR,   UINT);     
   
  _TCHAR   lpBuf[40];     
  _TCHAR   lpBufA[40];     
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)   
  {   
            int   Icon   =   MB_ICONINFORMATION;     
          const   PSTR   szCaption   =   "This   never   break   even   break-point   was   set   !   ";     
          const   PSTR   szText   =   lpBuf;     
          const   PSTR   szTargetAPI   =   "MessageBoxA";     
          HMODULE   hUser32   =   GetModuleHandle("user32");     
          SPMessageBoxA   =   (SPMESSAGEBOXA)GetProcAddress(hUser32,   szTargetAPI);     
   
          wsprintf(lpBufA,   "%s",   "This   can   Break   !");     
          sprintf(lpBuf,   "Code   byte   was   %8X",   *(PULONG)SPMessageBoxA);     
          SPMessageBoxA(0,   lpBuf,lpBufA,   MB_ICONINFORMATION);     
          if   (*(PUCHAR)SPMessageBoxA   ==   0xcc)     
                  wsprintf(lpBuf,   "%s",   "Break   point   was   set   !");     
          else     
                  wsprintf(lpBuf,   "%s",   "No   Break   point   set   !");     
          OtherMessageBox(0,   szText,   szCaption,   Icon);   
   
   
   
  }   
  //---------------------------------------------------------------------------   
      void   OtherMessageBox(HWND   hWnd,   LPCTSTR   lpText,   LPCTSTR   lpCaption,   UINT   uType   )   
  {   
          __asm   
          {   
                  inc   SPMessageBoxA   
                  push   dword   ptr   uType   
                  push   dword   ptr   lpCaption   
                  push   dword   ptr   lpText   
                  push   0   
                  call         MsgJmpBox   
                  jmp         end   
  MsgJmpBox:   
                  push         ebp   
                  jmp       SPMessageBoxA   
   
   
  end:                                 
          }     
              
  }

TOP

  有点看不清,你

jmp       SPMessageBoxA改为:   
   
  mov   ebx,offset   SPMessageBoxA   
  call   ebx   
   
  试试
Top

不行就用这个测试程序。   
   
  VC6+Win   XP下编译通过   
   
   
  HMODULE   hModule;   
  hModule=:oadLibrary("user32.dll");   
  typedef   int   (*   MYMESSAGEBOX)(HWND,LPCTSTR,LPCTSTR,UINT);   
  MYMESSAGEBOX   pMessageBox=NULL;   
  pMessageBox=(MYMESSAGEBOX)::GetProcAddress(hModule,"MessageBoxA");   
  char   *szTitle="Title";   
  char   *szContent="This   is   a   test!";   
   
  if(pMessageBox)   
  {   
  __asm   
  {   
  xor   ebx,ebx   
  mov   ebx,MB_OK   
  push   ebx   
  mov   ebx,szTitle   
  push   ebx   
  mov   ebx,szContent   
  push   ebx   
  push   0   
   
  mov   ebx,pMessageBox   
  call   ebx   
  }   
   
  ::FreeLibrary(hModule);   
  }   
  
Top

TOP

发新话题