2011-11-05 2 views
-5

Windows XP 32 비트에서이 코드를 내 응용 프로그램에 사용했습니다. 그것은 나를 위해 꽤 잘 작동하지만 지금은 윈도우 7 64 비트로 마이그레이션하고 작동을 멈 춥니 다. Windows 7에서이 작업을 수행하려면 어떻게해야합니까? 델파이 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 32 비트에서 작동하는 것입니다. 대답을 편집하고 코드가 무엇을해야하는지 알려주고 올바르게 형식을 지정하십시오. –

+0

그것이 작동하지 않는다고 말씀 하셨다면 당신은 무엇을 의미합니까? 오류가 있습니까? – bryanmac

+5

@Cosmin Windows 작업 관리자에서 응용 프로그램을 숨기도록 설계된 멀웨어입니다. –

답변

2

코드는 32 비트 코드이지만 대상 프로세스는 64 비트 프로세스입니다. 이렇게하면 두 가지 문제가 있습니다 : 그것은 모든 포인터는 코드에서 32 비트 포인터로 선언되기 때문에

  1. LVITEM 귀하의 선언이 더 이상 적용을하지만, 그들은 대상 프로세스에서 64 개 비트 포인터입니다. 이 문제를 해결하려면 자신의 버전 인 LVITEM을 선언해야합니다. 64 비트 컴파일러를 사용하여 올바른 구조체의 패딩 및 레이아웃을 얻으십시오.
  2. VirtualAllocVirtualAllocEx에서 반환 된 값도 32 비트 포인터이지만 대상 프로세스는 64 비트 포인터를 사용합니다. 나는 WOW64 시스템이 < 4GB의 주소를 예약하려고 노력하기 때문에 32 비트 포인터가 잘리지 않는다고 생각하지만 나는 100 % 확신하지 못한다. 나는 VirtualAlloc으로 전화하여 특정 주소를 요청하려고합니다.
0

32 비트 GDI 하위 수준 메시지를 Win64 프로세스로 보냅니다.

그래서 LVITEM 구조가 더 이상 일치하지 않습니다.

이 코드는 프로세스가 64 비트인지 식별하고 64 비트 포인터를 처리하도록 LVITEM 구조를 조정해야 할 수 있습니다.

그리고이 경우에도 32 비트 프로세스에서 64 비트 메모리에 액세스 할 수 없다고 확신합니다.

이럴 유일한 해결책은 당신의 코드가 너무 낮은 수준의 그것을 깰 수 있음을 해킹하고, 대신 모든 경우에

델파이 7의 (FPC 또는 델파이 XE2를 통해) 64 비트 실행 파일을 만드는 것입니다 Windows의 모든 보안 업데이트가 포함되어 있습니다. 예상 된 UI 동작을 구현하는 또 다른 방법을 확인할 것입니다 (정확히 어떤 것을 모르는 : 목록보기 항목 숨기기?).

+0

사소한 포인트 : 여기 GDI 없음, 이것은 comctl32 목록보기 메시지입니다. 너는 내 대답에 크게 협조하고있다.그러나 왜 wow64 에뮬레이션과 네이티브 프로세스 간에는 다른 프로세스에서 메모리에 액세스하는 것이 불가능하다고 생각하십니까? 나는 기술적 인 이유나 그것을 뒷받침하는 문서를 보지 못했다. –

+0

그것은 델파이 XE2를 설치해야한다는 것을 의미합니다. 녀석은 64 비트와 32 비트 모두에서 작동하는 솔루션을 가지고 있습니까? – user1023395

+0

@user 시도하고있는 것이 32 비트 프로세스에서 가능하지 않은 이유가 개인적으로 보이지 않습니다. –