如何使自己的程序隐藏?(高分送) 各位大侠: 我想把自己编的delphi6.0程序在windows2000professional下实现隐藏。希望能给出简单的实例程序。谢了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在项目文件“PROJECT.DPR”中设置ShowMainForm为假,如下: Application.Initialize; Application.CreateForm(TForm1, Form1); application.ShowMainForm:=false; Application.Run; 在项目文件“PROJECT.DPR”中设置ShowMainForm为假,试试 Application.Initialize; Application.CreateForm(TForm1, Form1); application.ShowMainForm:=false; Application.Run; 上面那句application.ShowMainForm:=false;只是使窗体隐藏了,如果要在进程中隐藏,麻烦一点可以参阅一篇叫做“NT系统下木马进程的隐藏与检测”的文章~不过就如一楼说的那样,隐藏的再好也能被别人找出来hoho 看看这里,是DFW的讨论。http://www.delphibbs.com/delphibbs/dispq.asp?lid=1624331 我这有点资料AttachToProcess('Explorer.Exe', 'MyDll.Dll' );file://查找指定的进程,然后返回进程IDprocedure 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(ExtractFilename(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;constPID: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 elseFindAProcess(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; 用OpenProcess()实现过NT下的进程隐身 借鉴一下吧:**********************************************远程线程技术 远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过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还是使用远程线程,都是让木马的核心代码运行于别的进程的内存空间,这样不仅能很好地隐藏自己,也能更好的保护自己。 把 OpenProcess Hook掉,那谁也杀不了你的程序了. 坐标问题 请教大家一个有关Dllhost进程的问题(400分)!!!!!!!!!!!!!!!! 用adotable或adoquery更新记录问题! ***********************高手们出手啦,需要你们一个建议********************** 判断焦点在EDIT1的语句如何写???(在线等) 如何控制TListView中的内容的变化!!! 请帮我参考一下 工作室的名字!!! (散分) 如何读写注册表? 如何定义Rect的组合? 关于数据库的操作 导出Excel的问题 FLASH控件问题,各位研究研究!!!!!!
Application.Initialize;
Application.CreateForm(TForm1, Form1);
application.ShowMainForm:=false;
Application.Run;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
application.ShowMainForm:=false;
Application.Run;
application.ShowMainForm:=false;
只是使窗体隐藏了,如果要在进程中隐藏,麻烦一点
可以参阅一篇叫做“NT系统下木马进程的隐藏与检测”的文章~
不过就如一楼说的那样,隐藏的再好也能被别人找出来
hoho
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1624331
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;
远程线程技术
远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过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还是使用远程线程,都是让木马的核心代码运行于别的进程的内存空间,这样不仅能很好地隐藏自己,也能更好的保护自己。