Exetools

Exetools (https://forum.exetools.com/index.php)
-   Source Code (https://forum.exetools.com/forumdisplay.php?f=46)
-   -   [C/C++/Delphi] Custom MessageBox (https://forum.exetools.com/showthread.php?t=17325)

Sn!per X 01-11-2016 20:25

[C/C++/Delphi] Custom MessageBox
 
2 Attachment(s)
http://i.imgur.com/OaCRhu2.gif
MessageBox from Carberp source code leak
c++ code token by naquadria from the leaked code:
Code:

#include <windows.h>
#include <richedit.h>

HHOOK hMsgBoxHook;
HCURSOR hArrow,hIbeam;

INT_PTR CALLBACK EditDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    WNDPROC lpWndProc = (WNDPROC)GetWindowLongPtr(hWnd, GWLP_USERDATA);
    switch (uMsg) {
    case WM_SETFOCUS: {
        return 1;
    }
    case WM_MOUSEWHEEL: {
        return NULL;
    }
    }
    if (GetCursor() == hIbeam)
        SetCursor(hArrow);

    return CallWindowProc(lpWndProc, hWnd, uMsg, wParam, lParam);
}

INT_PTR CALLBACK StaticDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    bool bCursor = false;
    WNDPROC lpWndProc = (WNDPROC)GetWindowLongPtr(hWnd, GWLP_USERDATA);
    switch (uMsg) {
    case WM_NOTIFY: {
        switch (((LPNMHDR)lParam)->code) {
        case EN_LINK: {
            ENLINK *lpLink = (ENLINK*)lParam;
            if (lpLink->msg == WM_LBUTTONUP) {
                SendMessage(lpLink->nmhdr.hwndFrom,
                            EM_EXSETSEL,
                            0,
                            (LPARAM)&lpLink->chrg);

                TCHAR szBuf[260];
                SendMessage(lpLink->nmhdr.hwndFrom,
                            EM_GETSELTEXT,
                            0,
                            (LPARAM)szBuf);

                ShellExecute(NULL,
                            TEXT("open"),
                            szBuf,
                            NULL,
                            NULL,
                            SW_SHOWNORMAL);
            }
            bCursor = true;
            break;
        }
        }
        break;
    }
    }
    return CallWindowProc(lpWndProc, hWnd, uMsg, wParam, lParam);
}

LRESULT CALLBACK MsgProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION) {
        CWPSTRUCT *lpMsg = (CWPSTRUCT*)lParam;
        switch (LOWORD(lpMsg->message)) {
        case WM_INITDIALOG: {
            HWND hStatic = GetDlgItem(lpMsg->hwnd,0xFFFF);

            RECT rcStatic;
            GetClientRect(hStatic, &rcStatic);
            TCHAR szBuf[260];

            GetWindowText(hStatic, szBuf, 260);
            HGDIOBJ hFont = (HGDIOBJ)SendMessage(hStatic,
                                                WM_GETFONT,
                                                NULL,
                                                NULL);

            HWND hRich = CreateWindowEx(WS_EX_NOPARENTNOTIFY,
                                        RICHEDIT_CLASS,
                                        NULL,
                                        WS_CHILD + ES_READONLY + WS_VISIBLE + ES_MULTILINE,
                                        0,
                                        0,
                                        rcStatic.right - rcStatic.left + 2,
                                        rcStatic.bottom - rcStatic.top,
                                        hStatic,
                                        NULL,
                                        NULL,
                                        NULL);

            SendMessage(hRich,WM_SETFONT,(WPARAM)hFont, 0);
            SendMessage(hRich,EM_SETBKGNDCOLOR, 0, 0x00FFFFFF);
            SendMessage(hRich,EM_SETEVENTMASK, 0, ENM_LINK);
            SendMessage(hRich,EM_AUTOURLDETECT, TRUE, 0);

            SetWindowText(hRich,szBuf);

            POINT pt = {rcStatic.left,rcStatic.top};
            ScreenToClient(lpMsg->hwnd, &pt);
            SetWindowLongPtr(hStatic,
                            GWLP_USERDATA,
                            SetWindowLongPtr(hStatic,
                                              GWLP_WNDPROC,
                                              (LONG_PTR)StaticDlgProc)
                            );

            SetWindowLongPtr(hRich,
                            GWLP_USERDATA,
                            SetWindowLongPtr(hRich,
                                              GWLP_WNDPROC,
                                              (LONG_PTR)EditDlgProc)
                            );

            break;
        }
        }
    }
    return CallNextHookEx(hMsgBoxHook, nCode, wParam, lParam);
}

int WINAPI ShowHypeMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) {
    int dwResult = 0;
    hMsgBoxHook = SetWindowsHookEx(WH_CALLWNDPROC,
                                  MsgProc,
                                  NULL,
                                  GetCurrentThreadId()
                                  );

    dwResult = MessageBox(hWnd, lpText, lpCaption, uType);
    UnhookWindowsHookEx(hMsgBoxHook);
    return dwResult;
}

int iWinMain() {
    hIbeam = LoadCursor(0, IDC_IBEAM);
    hArrow = LoadCursor(0, IDC_ARROW);
    LoadLibrary(TEXT("riched20"));
    ShowHypeMessageBox(0,
                      TEXT("website: http://www.at4re.com/f\nemail: mailto:[email protected]\nftp: ftp://at4re.com\n\nCode snippet from carberp leak package."),
                      TEXT("carberp leak"),
                      MB_ICONASTERISK);
    return 0;
}

----------------------------------------------------------------------
Same code ported to delphi by Agmcz (ex ghost-dz):

Code:

unit uCustomMessageBox;

interface

uses
  Windows, Messages, RichEdit, ShellAPI;

function ShowHypeMessageBox(hWnd: HWND; lpText: PChar; lpCaption: PChar; uType: UINT ): Integer;

var
  hMsgBoxHook: HHOOK;
  hArrow, hIbeam: HCURSOR;

implementation

var
  lpWndProc: Pointer;

function EditDlgProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM):
  Integer; stdcall;
begin
  Result := 0;
  lpWndProc := Pointer(GetWindowLong(hWnd, GWL_USERDATA));
  case uMsg of
    WM_SETFOCUS: Result := 1;
    WM_MOUSEWHEEL: Result := 0;
  end;
  if GetCursor = hIbeam then
    SetCursor(hArrow);
  Result := CallWindowProc(lpWndProc, hWnd, uMsg, wParam, lParam);
end;

function StaticDlgProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM):
  Integer; stdcall;
type
  PENLINK = ^ENLINK;
var
  bCursor: Boolean;
  lpLink: PENLINK;
  szBuf: array[0..260-1] of Char;
begin
  Result := 0;
  bCursor := False;
  lpWndProc := Pointer(GetWindowLong(hWnd, GWL_USERDATA));
  case uMsg of
    WM_NOTIFY:
      begin
        case PNMHdr(lParam)^.code of
          EN_LINK:
            begin
              lpLink := PENLINK(lParam);
              if (lpLink^.msg = WM_LBUTTONUP) then
              begin
                SendMessage(lpLink^.nmhdr.hwndFrom,
                  EM_EXSETSEL,
                  0,
                  Integer(@lpLink^.chrg));

                SendMessage(lpLink^.nmhdr.hwndFrom,
                  EM_GETSELTEXT,
                  0,
                  Integer(@szBuf));

                ShellExecute(0,
                  'open',
                  szBuf,
                  nil,
                  nil,
                  SW_SHOWNORMAL);
              end;
              bCursor := true;
              Exit;
            end;
        end;
      end;
  end;
  Result := CallWindowProc(lpWndProc, hWnd, uMsg, wParam, lParam);
end;

function MsgProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
  stdcall;
var
  lpMsg: PCWPStruct;
  hStatic: HWND;
  rcStatic: TRect;
  hFont: HGDIOBJ;
  hRich: HWND;
  szBuf: array[0..260-1] of Char;
  pt: TPoint;
begin
  Result := 0;
  if (nCode = HC_ACTION) then
    lpMsg := PCWPStruct(lParam);
  case LOWORD(lpMsg^.message) of
    WM_INITDIALOG:
      begin
        hStatic := GetDlgItem(lpMsg^.hwnd, $FFFF);
        GetClientRect(hStatic, rcStatic);
        GetWindowText(hStatic, szBuf, 260);
        hFont := SendMessage(hStatic,
          WM_GETFONT,
          0,
          0);

        hRich := CreateWindowEx(WS_EX_NOPARENTNOTIFY,
          RICHEDIT_CLASS,
          nil,
          WS_CHILD + ES_READONLY + WS_VISIBLE + ES_MULTILINE,
          0,
          0,
          rcStatic.right - rcStatic.left + 2,
          rcStatic.bottom - rcStatic.top,
          hStatic,
          0,
          0,
          nil);

        SendMessage(hRich, WM_SETFONT, hFont, 0);
        SendMessage(hRich, EM_SETBKGNDCOLOR, 0, $00FFFFFF);
        SendMessage(hRich, EM_SETEVENTMASK, 0, ENM_LINK);
        SendMessage(hRich, EM_AUTOURLDETECT, 1, 0);

        SetWindowText(hRich, szBuf);

        ScreenToClient(lpMsg^.hwnd, pt);
        SetWindowLong(hStatic,
          GWL_USERDATA,
          SetWindowLong(hStatic,
          GWL_WNDPROC,
          LONG_PTR(@StaticDlgProc))
          );

        SetWindowLong(hRich,
          GWL_USERDATA,
          SetWindowLong(hRich,
          GWL_WNDPROC,
          LONG_PTR(@EditDlgProc))
          );

        Exit;
      end;
  end;
  Result := CallNextHookEx(hMsgBoxHook, nCode, wParam, lParam);
end;

function ShowHypeMessageBox(hWnd: HWND; lpText: PChar; lpCaption: PChar; uType: UINT ): Integer;
var
  dwResult: Integer;
begin
  dwResult := 0;
  hMsgBoxHook := SetWindowsHookEx(WH_CALLWNDPROC,
    MsgProc,
    0,
    GetCurrentThreadId()
    );
  dwResult := MessageBox(hWnd, lpText, lpCaption, uType);
  UnhookWindowsHookEx(hMsgBoxHook);
  Result := dwResult;
end;

end.

Example Test:
Code:

program msgbox;

uses
  Windows,
  uCustomMessageBox;

begin
  hIbeam := LoadCursor(0, IDC_IBEAM);
  hArrow := LoadCursor(0, IDC_ARROW);
  LoadLibrary('riched32.dll');
  ShowHypeMessageBox(0,
    'website: http://www.at4re.com/f' + #13#10 +
    'email: mailto:[email protected]' + #13#10 +
    'ftp: ftp://at4re.com' + #13#10 +  #13#10 +
    'Code snippet from carberp leak package.',
    'carberp leak',
    MB_ICONASTERISK);
end.

Refferences:
Code:

http://www.at4re.com/f/showthread.php?11697-Custom-MessageBox
http://www.at4re.com/f/showthread.php?11746-Custom-MessageBox



All times are GMT +8. The time now is 23:52.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2026, vBulletin Solutions, Inc.
Always Your Best Friend: Aaron, JMI, ahmadmansoor, ZeNiX