Получить текст окна, где этого не может WM GETTEXT
Материал из DRKB
Получить текст окна, где этого не может WM_GETTEXT[править | править код]
Она может брать текст, где этого не может делать GetWindowText(), вот собственно и все! Должна работать и в win98, но небыло возможности проверить.... =) Так что кому надо... Отдельное спасибо .alex'у
program pGrabber;
uses
Windows,
myfuncs in 'myfuncs.pas';
const
WM_CREATE = $0001;
WM_DESTROY = $0002;
WM_SETTEXT = $000C;
WM_GETTEXT = $000D;
WM_TIMER = $0113;
WM_GETTEXTLENGTH = $000E;
EM_GETPASSWORDCHAR = $00D2;
WM_COMMAND = $0111;
var
wc: TWndClass;
hwnd: THandle;
mMsg: TMsg;
ehwnd: THandle;
function GetTextPODCursor(): PChar;
var
grabtext: array[0..125] of Char;
lpPoint: TPoint;
hwnd: THandle;
begin
GetCursorPos(lpPoint);
hwnd := WindowFromPoint(lpPoint);
if (SendMessage(hwnd, EM_GETPASSWORDCHAR, 0, 0) <> 0) then
begin
SendMessage(hwnd, WM_GETTEXT, 20, integer(PChar(@grabtext)));
Result := PChar(@grabtext);
end
else
Result := PChar('');
SendMessage(ehwnd, WM_SETTEXT, 0, Integer(Result));
end;
//////////////////////
// Main Window Proc //
//////////////////////
function WndProc(hwnd: Thandle; lMsg, wParam, lParam: LongInt): LongInt; stdcall;
begin
case lMsg of
WM_CREATE:
begin
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE);
SetTimer(hwnd, 55555, 2 * 1000, nil);
end;
WM_TIMER:
begin
if (not IsNT) then
GetTextPODCursor()
else
SpawnThreadNT('EXPLORER.EXE', GetModuleHandle(nil));
end;
WM_DESTROY:
begin
KillTimer(hwnd, 55555);
halt(0);
end;
end;
Result := DefWindowProc(hWnd, lMsg, wParam, lParam);
end;
//////////////////////
// Main Entry Point //
//////////////////////
begin
with wc do
begin
style := CS_HREDRAW or CS_VREDRAW;
lpfnWndProc := @WndProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := hInstance;
hIcon := 65539;
hCursor := 65553;
hbrBackground := 26214418;
lpszMenuName := nil;
lpszClassName := 'pGClass';
end;
RegisterClass(wc);
hwnd := CreateWindow('pGClass', ' pGrabber [win98/Xp v2.0] by xZero',
WS_OVERLAPPEDWINDOW and WS_DLGFRAME, 400, 300, 260, 65, 0, 0, hInstance, nil);
ehwnd := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '',
WS_CHILD or WS_VISIBLE or ES_READONLY, 5, 5, 245, 20, hwnd, 0, hInstance, nil);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
while GetMessage(mMsg, hwnd, 0, 0) do
begin
TranslateMessage(mMsg);
DispatchMessage(mMsg);
end;
Halt(mMsg.wParam);
end.
unit myfuncs;
interface
uses Windows, tlhelp32;
function IsNT: boolean;
function OPTHDROFFSET(ptr: LongInt): DWORD;
function SpawnThreadNT(pszProcess: PChar; g_hModule: HMODULE): Boolean;
procedure EntryPoint;
implementation
const
EM_GETPASSWORDCHAR = $00D2;
WM_SETTEXT = $000C;
WM_GETTEXT = $000D;
function IsNT: Boolean;
var
osvi: OSVERSIONINFO;
begin
osvi.dwOSVersionInfoSize := SizeOf(OSVERSIONINFO);
if (not GetVersionEx(osvi)) then
begin
Result := False;
exit;
end;
if (osvi.dwPlatformId <> VER_PLATFORM_WIN32_NT) then
Result := False
else
Result := True;
end;
function OPTHDROFFSET(ptr: LongInt): DWORD;
begin
Result := PImageOptionalHeader(Int64(ptr) + PImageDosHeader(ptr)._lfanew +
SizeOf(DWORD) + SizeOf(IMAGE_FILE_HEADER)).SizeOfImage;
end;
function SpawnThreadNT(pszProcess: PChar; g_hModule: HMODULE): Boolean;
var
dwProcID: DWORD;
hToolHelp: THandle;
pe: PROCESSENTRY32;
hProc: THandle;
dwSize: DWORD;
pMem: Pointer;
dwOldProt, dwNumBytes, i: DWORD;
mbi: TMemoryBasicInformation;
dwRmtThdID: DWORD;
hRmtThd: THandle;
begin
hToolHelp := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe.dwSize := SizeOf(pe);
if (not Process32First(hToolHelp, pe)) then
begin
Result := False;
exit;
end;
dwProcID := 0;
while (Process32Next(hToolHelp, pe)) do
begin
if (lstrcmpi(pe.szExeFile, pszProcess) = 0) then
begin
dwProcID := pe.th32ProcessID;
break;
end;
end;
if (dwProcID = 0) then
begin
Result := False;
exit;
end;
if (GetCurrentProcessId() = dwProcID) then
begin
Result := False;
exit;
end;
hProc := OpenProcess(PROCESS_ALL_ACCESS, False, dwProcID);
if (hProc = 0) then
begin
Result := False;
exit;
end;
VirtualFreeEx(hProc, ptr(g_hModule), 0, MEM_RELEASE);
dwSize := OPTHDROFFSET(g_hModule);
pMem := VirtualAllocEx(hProc, ptr(g_hModule), dwSize,
MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (pMem = nil) then
begin
Result := False;
exit;
end;
VirtualQueryEx(hProc, pMem, mbi, SizeOf(MEMORY_BASIC_INFORMATION));
while ((mbi.Protect <> PAGE_NOACCESS) and (mbi.RegionSize <> 0)) do
begin
if ((mbi.Protect and PAGE_GUARD) = 0) then
begin
i := 0;
while (i < mbi.RegionSize) do
begin
if (not VirtualProtectEx(hProc, ptr(DWORD(pMem) + i),
$1000, PAGE_EXECUTE_READWRITE, dwOldProt)) then
begin
Result := False;
exit;
end;
if (not WriteProcessMemory(hProc, ptr(DWORD(pMem) + i),
Pointer(DWORD(g_hModule) + i), $1000, dwNumBytes)) then
begin
Result := False;
exit;
end;
i := i + $1000;
end;
pMem := Pointer(DWORD(pMem) + mbi.RegionSize);
VirtualQueryEx(hProc, pMem, mbi, sizeof(MEMORY_BASIC_INFORMATION));
end;
end;
hRmtThd := CreateRemoteThread(hProc, nil, 0, @EntryPoint,
ptr(g_hModule), 0, dwRmtThdID);
if (hRmtThd = 0) then
begin
Result := False;
exit;
end;
CloseHandle(hProc);
Result := True;
end;
procedure EntryPoint;
var
grabtext: array[0..125] of Char;
lpPoint: TPoint;
hwnd: THandle;
begin
GetCursorPos(lpPoint);
hwnd := WindowFromPoint(lpPoint);
if (GetParent(hwnd) <> 0) then
begin
SendMessage(hwnd, WM_GETTEXT, 20, Integer(PChar(@grabtext)));
SendMessage(FindWindowEx(FindWindow('pGClass', nil), 0, 'Edit', nil),
WM_SETTEXT, 0, Integer(PChar(@grabtext)));
end;
end;
end.
Author: x2er0
Source: Взято из http://forum.sources.ru
ID: 02119