各位大侠:
   我想把自己编的delphi6.0程序在windows2000professional下实现隐藏。希望能给出简单的实例程序。谢了。

解决方案 »

  1.   

    在项目文件“PROJECT.DPR”中设置ShowMainForm为假,如下:
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      application.ShowMainForm:=false;
      Application.Run;
      

  2.   

    在项目文件“PROJECT.DPR”中设置ShowMainForm为假,试试
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      application.ShowMainForm:=false;
      Application.Run;
      

  3.   

    上面那句
    application.ShowMainForm:=false;
    只是使窗体隐藏了,如果要在进程中隐藏,麻烦一点
    可以参阅一篇叫做“NT系统下木马进程的隐藏与检测”的文章~
    不过就如一楼说的那样,隐藏的再好也能被别人找出来
    hoho
      

  4.   

    看看这里,是DFW的讨论。
    http://www.delphibbs.com/delphibbs/dispq.asp?lid=1624331
      

  5.   

    我这有点资料
    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
        elseFoundOK:=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:\TESTDLL.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;
      

  6.   

    用OpenProcess()实现过NT下的进程隐身
      

  7.   

    借鉴一下吧:**********************************************
    远程线程技术 
      远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程耶!)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。例如在远程进程内部启动一个DLL木马(与进入进程内部相比,启动一个DLL木马是小意思,实际上我们可以随意篡改那个远程进程的数据)。   首先,我们通过OpenProcess 来打开我们试图嵌入的进程(如果远程进程不允许打开,那么嵌入就无法进行了,这往往是由于权限不足引起的,解决方法是通过种种途径提升本地进程的权限)  hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | file://允许远程创建线程 
                    PROCESS_VM_OPERATION | file://允许远程VM操作 
                    PROCESS_VM_WRITE,//允许远程VM写 
                    FALSE, dwRemoteProcessId )   由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。   然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL木马,LoadLibraryW函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL文件的绝对路径名pszLibFileName,(也就是木马DLL的全路径文件名),但是由于木马DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空间:(否则远程线程是无法读到这个参数的)  file://计算DLL路径名需要的内存空间 
     int cb = (1 + lstrlenW(pszLibFileName)) * sizeof(WCHAR); 
     file://使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区 
     pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, NULL, cb, 
                MEM_COMMIT, PAGE_READWRITE); 
     file://使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间 
     iReturnCode = WriteProcessMemory(hRemoteProcess, 
                pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL); 
     file://计算LoadLibraryW的入口地址 
     PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE) 
         GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");   OK,万事俱备,我们通过建立远程线程时的地址pfnStartAddr(实际上就是LoadLibraryW的入口地址)和传递的参数pszLibFileRemote(实际上是我们复制过去的木马DLL的全路径文件名)在远程进程内启动我们的木马DLL:  file://启动远程线程LoadLibraryW,通过远程线程调用用户的DLL文件 
     hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0, 
                     pfnStartAddr, pszLibFileRemote, 0, NULL);   至此,远程嵌入顺利完成,为了试验我们的DLL是不是已经正常的在远程线程运行,我编写了以下的测试DLL:  BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved) 
       { 
        char szProcessId[64] ; 
        switch ( reason ) 
         { 
          case DLL_PROCESS_ATTACH: 
           { 
             file://获取当前进程ID 
             _itoa ( GetCurrentProcessId(), szProcessId, 10 ); 
             MessageBox ( NULL, szProcessId, "RemoteDLL", MB_OK ); 
           } 
          default: 
          return TRUE; 
         } 
       }   当我使用RmtDll.exe程序将这个TestDLL.dll嵌入Explorer.exe进程后(PID=1208),该测试DLL弹出了1208字样的确认框,同时使用PS工具也能看到    Process ID: 1208 
       C:\WINNT\Explorer.exe (0x00400000) 
       …… 
       C:\TestDLL.dll (0x100000000) 
       ……   这证明TestDLL.dll已经在Explorer.exe进程内正确地运行了。   无论是使用特洛伊DLL还是使用远程线程,都是让木马的核心代码运行于别的进程的内存空间,这样不仅能很好地隐藏自己,也能更好的保护自己。
      

  8.   

    把 OpenProcess Hook掉,那谁也杀不了你的程序了.