【问题标题】:Task Manager Hide Processor Issue on windows 7 [closed]Windows 7上的任务管理器隐藏处理器问题[关闭]
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    所以 LVITEM 结构不再匹配了。

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

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

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

    在所有情况下,您的代码都是非常低级的 hack,它可能会因 Windows 的任何安全更新而中断。我会检查实现预期 UI 行为的另一种方式(我们并不确切知道:隐藏列表视图项?)。

    【讨论】:

    • 次要:这里没有 GDI,这是 comctl32 列表视图消息。你基本上不同意我的回答。但是,为什么您认为在 wow64 模拟进程和本机进程之间无法访问另一个进程中的内存?我没有看到支持这一点的技术原因和文档。
    • 这意味着我需要先安装 DELPHI XE2,你们有什么解决方案同时适用于 64 位和 32 位吗?
    • @user 我个人看不出有任何理由说明您尝试的操作在 32 位进程中不可行
    • @DavidHeffernan 正如您所说,Wow64 系统可能成为此类低级黑客攻击的障碍。例如,尝试在 Win64 上的 32 位进程中制作 shell 扩展...
    • 嗯,这完全不同。这是进程中的。
    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多