如何在WINDOWSXP,2000,2003的任务管理器中隐藏程序

wjhh 2003-09-02 11:30:10
我想做一个后台监控程序,但不想让用户在任务管理器中关掉我的程序,请教各位大侠,如何隐藏掉我的程序。
...全文
107 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
IOLIR 2003-10-27
  • 打赏
  • 举报
回复
比较简单一点的方法是做个Dll把所有能列举系统进程的API函数Hook掉,比如,EnumProcess等。

比较复杂一点的是可以用远程进程注入的方式来把自己的线程插入系统程序比如Explorer.exe中,这样就不可能被发现。

或者用3级跳,做2个Dll,一个用来Hook,然后用Hook的那个DLL调用另外一个真正执行线程的DLL来创建一个线程就可以了。

但是我想过一种实现起来比较简单的方法,但是没有做过,就是用消息钩子来勾住所有的程序,然后挑几个系统程序,然后在钩子DLL初始化的代码里面创建个线程就可以了,不知行不行?

如果需要的话我们可以探讨一下,我前段时间就在研究这个问题。
micher_yan 2003-10-27
  • 打赏
  • 举报
回复
二楼的,你的方法虽然在任务栏和任务管理器/应用程序中看不到,但是在任务管理器的进程中还是能看到的,一点结束进程就over了
bottom 2003-10-27
  • 打赏
  • 举报
回复
谁有J++BUILDER 9.0的破解包?
我用买来的光盘上的破解包 解了一下午也没搞定!
快帮助我?!谢谢!
leapmars 2003-09-15
  • 打赏
  • 举报
回复
听课
yurenjf 2003-09-15
  • 打赏
  • 举报
回复
用下面的可以实现任务管理器中隐藏程序
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.Title := ''; //*****
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
而且在窗体的create事件用
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
还可以使之在状态栏上消失....
Eastunfail 2003-09-02
  • 打赏
  • 举报
回复
我有例子。留下Email。
renzy205的方法在XP,2000,2003中无效。
renzy205 2003-09-02
  • 打赏
  • 举报
回复
function RegisterServicesProcess(dwProcessID,dwType: DWORD): DWORD; stdcall; external 'USER32.DLL';
renzy205 2003-09-02
  • 打赏
  • 举报
回复
RegisterServiceProcess(GetCurrentProcessId,0);
xxl820 2003-09-02
  • 打赏
  • 举报
回复
你可以用API函数,获得在任务管理器中的句柄,你查以下,我的源码没有了
Drate 2003-09-02
  • 打赏
  • 举报
回复
NT/200下进程隐身
Jedei 在 2001-6-17 2:09:08 提供了如下回答, 请您查阅和评估:
--------------------------------------------------------------------------

---

我也来凑凑热闹:

AttachToProcess('Explorer.Exe', 'MyDll.Dll' );

file://查找指定的进程,然后返回进程ID

procedure FindAProcess(const AFilename:string; const PathMatch:Boolean;

var ProcessID: DWORD);

file://AFilename为要查找(进程ID)的文件名(可以包行路径)

file://PathMatch为查找的时候是否匹配路径

var

lppe:TProcessEntry32;

SsHandle:Thandle;

FoundAProc, FoundOK:boolean;

begin

SsHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);

FoundAProc := Process32First(Sshandle,lppe);

while FoundAProc do

begin

if PathMatch then

FoundOK:=AnsiStricomp(lppe.szExefile,PChar(AFilename))=0

else

FoundOK:=AnsiStricomp(PChar(ExtractFilename(lppe.szExefile)),PChar(Extract

Filename(AFilename)))=0;

if FoundOK then

begin

ProcessID:=lppe.th32ProcessID;

break;

end;

FoundAProc :=Process32Next(SsHandle,lppe);

end;

// if not FoundAProc then showmessage(SysErrorMessage(GetLastError));

CloseHandle(SsHandle);

end;

file://激活或者停止指定的权限

function EnabledDebugPrivilege(const bEnabled: Boolean):Boolean;

var

hToken: THandle;

tp: TOKEN_PRIVILEGES;

a: DWORD;

const

SE_DEBUG_NAME = 'SeDebugPrivilege';

begin

Result:=False;

if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,

hToken)) then

begin

tp.PrivilegeCount :=1;

LookupPrivilegeValue(nil,SE_DEBUG_NAME ,tp.Privileges[0].Luid);

if bEnabled then

tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED

else

tp.Privileges[0].Attributes := 0;

a:=0;

AdjustTokenPrivileges(hToken,False,tp,SizeOf(tp),nil,a);

Result:= GetLastError = ERROR_SUCCESS;

CloseHandle(hToken);

end;

end;

file://在指定的进程中插入一个DLL文件

function AttachToProcess(const HostFile, GuestFile : string;const

PID:DWORD=0):DWORD;

file://HostFile为要绑定的宿主文件(Exe文件),GuestFile为要嵌入的客户文件(Dll文

件)

file://如AttachToProcess('D:.DLL','Notepad.exe') ;

var

hRemoteProcess: THandle;

dwRemoteProcessId:DWORD;

cb:DWORD;

pszLibFileRemote: Pointer;

iReturnCode:Boolean;

TempVar:DWORD;

pfnStartAddr:TFNThreadStartRoutine;

pszLibAFilename: PwideChar;

begin

Result:=0;

EnabledDebugPrivilege(True);

Getmem(pszLibAFilename,Length(GuestFile)*2+1);

StringToWideChar(GuestFile,pszLibAFilename,Length(GuestFile)*2+1);

if PID>0 then dwRemoteProcessID:=PID else

FindAProcess(HostFile,False,dwRemoteProcessID);

file://由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请

file://足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。

file://然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL,

LoadLibraryW

file://函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL

file://文件的绝对路径名pszLibAFilename,(也就是DLL的全路径文件名),但是由于

file://DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址



file://间:(否则远程线程是无法读到这个参数的)

hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD + file://允许远程创建线程

PROCESS_VM_OPERATION+ file://允许远程VM操作

PROCESS_VM_WRITE,//允许远程VM写

FALSE, dwRemoteProcessId);

file://计算DLL路径名需要的内存空间

cb := (1 + lstrlenW(pszLibAFilename)) * sizeof(WCHAR);

file://使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区

pszLibFileRemote := PWIDESTRING( VirtualAllocEx( hRemoteProcess, nil,

cb, MEM_COMMIT, PAGE_READWRITE));

file://使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间

TempVar:=0;

iReturnCode := WriteProcessMemory(hRemoteProcess,pszLibFileRemote,

pszLibAFilename, cb, TempVar);

if iReturnCode then

begin

file://计算LoadLibraryW的入口地址

pfnStartAddr := GetProcAddress(GetModuleHandle('Kernel32'),

'LoadLibraryW');

file://OK,万事俱备,我们通过建立远程线程时的地址pfnStartAddr(实际上就是

LoadLibraryW

file://的入口地址)和传递的参数 pszLibFileRemote(实际上是我们复制过去的

DLL的全路

file://径文件名)在远程进程内启动我们的DLL:

file://启动远程线程LoadLibraryW,通过远程线程调用用户的DLL文件

TempVar:=0;

Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr,

pszLibFileRemote, 0, TempVar);

end;

Freemem(pszLibAFilename);

end;



dfancy 2003-09-02
  • 打赏
  • 举报
回复
用HOOK的话程序必须做成DLL?
RamjetZhang 2003-09-02
  • 打赏
  • 举报
回复
你还不如取个名字叫svchost.exe之类的蒙人
Skylights 2003-09-02
  • 打赏
  • 举报
回复
to Eastunfail:我也要,ysqfei@sina.com 谢谢 ^o^
蓝色光芒 2003-09-02
  • 打赏
  • 举报
回复
直接写成服务程序就关不掉了
蓝色光芒 2003-09-02
  • 打赏
  • 举报
回复
直接写成服务程序就关不掉了
Eastunfail 2003-09-02
  • 打赏
  • 举报
回复
发了。请查收
pankun 2003-09-02
  • 打赏
  • 举报
回复
二\三楼的只有在9X下有用,2000以上可以用HOOK机制进行DLL注入来实现进程隐藏.
jerrymousenet2 2003-09-02
  • 打赏
  • 举报
回复
请给我也发一份,好吗?thanks.
oyxz@21cn.net

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧