任务管理器在Windows 7上隐藏处理器问题

时间:2011-11-05 12:48:28

标签: delphi

我一直在Windows XP 32bit上使用此代码。它对我来说效果很好,但现在我迁移到Windows 7 64位并且它停止工作。如何在Windows 7上完成这项工作?我正在使用Delphi 7。

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, CommCtrl, dialogs , sysutils, classes;

var
myTimerHandle:WORD;
msg:TMSG;

Function Magchar(const S:string): string;
var
Ch: Char;
L: Integer;
Source, Dest: PChar;
begin
L := Length(S);
SetLength(Result, L);
Source := Pointer(S);
Dest := Pointer(Result);
while L <> 0 do
begin
Ch := Source^;
if (Ch >= 'A') and (Ch <= 'Z') then
Inc(Ch, 32); Dest^ := Ch;  Inc(Source); Inc(Dest); Dec(L);
end;
end;

Function CacheCache(_Processus:string):string;
var
dwSize, dwNumberOfBytes, PID, hProcess:Cardinal;
PLocalShared, PSysShared:PlvItem;
wnd: THandle;
iCount, i: integer;
szTemp:string;

begin
wnd := FindWindow('#32770',nil);
wnd := FindWindowEx(wnd, 0, '#32770', nil);
wnd := FindWindowEx(wnd, 0, 'SysListView32',nil);
iCount := SendMessage(wnd, LVM_GETITEMCOUNT, 0, 0);

for
i := 0 to iCount -1 do
begin
dwSize := SizeOf(LV_ITEM) + SizeOf(CHAR) * MAX_PATH;
pLocalShared := VirtualAlloc(nil, dwSize, MEM_RESERVE + MEM_COMMIT, PAGE_READWRITE);
GetWindowThreadProcessID(WND, @PID);
hProcess := OpenProcess(PROCESS_VM_OPERATION OR PROCESS_VM_READ OR PROCESS_VM_WRITE, FALSE, PID);
pSysShared := VirtualAllocEx(hProcess, nil, dwSize, MEM_RESERVE OR MEM_COMMIT, PAGE_READWRITE);

pLocalShared.mask := LVIF_TEXT;
pLocalShared.iItem := 0;
pLocalShared.iSubItem := 0;
pLocalShared.pszText := LPTSTR(DWord(pSysShared) + SizeOf(LV_ITEM));
pLocalShared.cchTextMax := 100;
WriteProcessMemory(hProcess, pSysShared, pLocalShared, 1024, dwNumberOfBytes);

SendMessage(wnd, LVM_GETITEMTEXT, i, LPARAM(pSysShared));
ReadProcessMemory(hProcess, pSysShared, pLocalShared, 1024, dwNumberOfBytes);
szTemp := PChar(DWord(pLocalShared) + SizeOf(LV_ITEM));
if Pos(_Processus, MagChar(szTemp)) > 0 then
ListView_DeleteItem(wnd, i);
VirtualFree(pLocalShared, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pSysShared, 0, MEM_RELEASE);
CloseHandle(hProcess);
 end;
   end;


procedure TimerProc(Wnd:HWnd;Msg,TimerID,dwTime:DWORD);stdcall;
begin
    CacheCache('myapp.exe');
end;

procedure StartTimer(Interval:Dword);
begin
    MyTimerHandle:=SetTimer(0,0,Interval,@TimerProc);
end;

begin


StartTimer(1);
while (GetMessage(Msg,0,0,0)) Do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;

    end.

2 个答案:

答案 0 :(得分:2)

您的代码是32位代码,但目标进程是64位进程。这给你带来两个问题:

  1. 您的LVITEM声明不再适用,因为它中的所有指针都在代码中声明为32位指针,但它们在目标进程中是64位指针。您需要声明自己的LVITEM版本才能解决此问题。使用64位编译器以确保结构的填充和布局正确。
  2. VirtualAllocVirtualAllocEx返回的值也是32位指针,但目标进程再次使用64位指针。我怀疑WOW64系统将尽力保留<4GB的地址,以便你的32位指针不会遭受截断,但我并不是100%肯定。我很想给VirtualAlloc打电话请求一个特定的地址。

答案 1 :(得分:0)

您正在向Win64进程发送32位GDI低级别消息。

所以LVITEM结构不再匹配了。

此代码可能需要识别进程是否为64位,然后调整LVITEM结构以处理64位指针。

即使在这种情况下,我也很确定你无法从32位进程访问64位内存。

恕我直言,唯一的解决方案是创建64位可执行文件(通过FPC或Delphi XE2)而不是Delphi 7。

在所有情况下,您的代码都是如此低级别的黑客攻击,它可能会破坏Windows的任何安全更新。我会检查另一种实现预期UI行为的方法(我们不确切地知道:隐藏listview项目?)。