【发布时间】:2011-11-05 12:48:28
【问题描述】:
我一直将此代码用于我在 Windows XP 32 位上的应用程序。它对我来说效果很好,但现在我迁移到 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.
【问题讨论】:
-
这段代码应该做什么?我们所知道的是它不起作用,并且它曾经在 Windows XP 32bit 上工作。请编辑答案,告诉我们代码应该做什么,并请正确格式化。
-
当您说它不起作用时,您是什么意思?你有错误吗?
-
@Cosmin 这是一个恶意软件,旨在隐藏 Windows 任务管理器中的应用程序。
-
@DavidHeffernan 你确定它是恶意软件吗?它可能是其他一些项目,例如创建“网吧”受限用户模式。但我想它应该用更少的低级黑客来实现,但使用更高级别的 API 和 Windows 安全设置。在所有情况下,这段代码在我看来写得非常糟糕(听起来像是对某些 C 代码的直接翻译——这个 Magchar 函数是标准大写字母的复制)。
-
@user1023395 ScriptKiddie 停止剪切和粘贴您不懂的代码! -1 来自我
标签: delphi