摘自:http://www.delphibbs.com/delphibbs/dispq.asp?lid=569786 问题:攻克一个难题:在WinNT/2000下进程隐身(采用进程注入方式) ( 积分:0, 回复:20, 阅读:1442 ) 分类:系统相关 ( 版主:luyear, zyy04 ) | |
来自:Kingron, 时间:2001-6-12 14:16:00, ID:563632 | [显示:小字体 | 大字体] |
详细贴子: http://www.csdn.net/expert/Topic/156/156011.shtm 源代码和测试程序下载: http://njhhack.freehomepages.com/source/hideproc.zip 来自:yh, 时间:2001-6-12 14:24:00, ID:563645 高,实在是高。佩服啊。 我怎么用IE下不来呢? 来自:maming, 时间:2001-6-13 9:39:00, ID:564554 thanks 来自:creation-zy, 时间:2001-6-13 10:02:00, ID:564595 高! 不过由我我的机器慢,在打游戏的时候经常把explorer.exe关掉,只留下一个taskman——系统资源99%可用! 这招很难让我上当。 ^_^ to Kingron: 请教一个问题:如何将一个模块(dll)强行从一个正在运行的进程中删除? (分数另外给) 来自:fu_xiang_yu, 时间:2001-6-13 10:15:00, ID:564614 下不了踢一脚 来自:mikedeakins, 时间:2001-6-13 10:18:00, ID:564620 >>请教一个问题:如何将一个模块(dll)强行从一个正在运行的进程中删除? (分数另外给) 不好意思,我来答吧。FreeLibrary 就可以。 down 不下来,哪位大侠说说原理? 来自:creation-zy, 时间:2001-6-13 11:24:00, ID:564740 to mikedeakins: 哈哈!我提的问题都被您答完了。 :) LID=564734 有50分肯定是您的。 来自:教父, 时间:2001-6-13 12:00:00, ID:564805 高人啊 可惜那玩意儿下不下来。 来自:tinytao, 时间:2001-6-13 12:40:00, ID:564863 我下了,看看再说。 来自:zjlcc, 时间:2001-6-13 13:56:00, ID:565005 我昨晚看了,为什么这么喜欢用hook呀? :)我总觉得hook太显眼,太嚣张了,呵呵 而且,每运行一个程序getkey.dll就会粘上来,不舒服,很容易发现 借Kingron的宝地 请mikedeakins及大伙帮我看看这个问题: http://www.delphibbs.com/delphibbs/dispq.asp?lid=561506 :)别嫌分少,可以再加!这是我问问题的一种方法,好像分不能回收的:( 来自:Kingron, 时间:2001-6-13 14:26:00, ID:565054 要说明的是: 原理在那个CSDN的贴子上面有!很详细的. 另外,这个例子不是我写的!我正在做这个,不过不想用DLL.:) 来自:yh, 时间:2001-6-16 19:36:00, ID:569465 来自:yh, 时间:2001-6-16 19:54:00, ID:569478 我下到了。不用了。 来自:sunstone, 时间:2001-6-16 23:47:00, ID:569728 g 来自:Jedei, 时间:2001-6-17 18:04:00, ID:569786 我也来凑凑热闹,应fu_xiang_yu的要求,我把注释写得尽量详细些 AttachToProcess('Explorer.Exe', 'MyDll.Dll' ); //查找指定的进程,然后返回进程ID procedure FindAProcess(const AFilename:string; const PathMatch:Boolean; var ProcessID: DWORD); //AFilename为要查找(进程ID)的文件名(可以包行路径) //PathMatch为查找的时候是否匹配路径 var lppe:TProcessEntry32; SsHandle:Thandle; FoundAProc, FoundOK:boolean; begin SsHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0); FoundAProc := Process32First(Sshandle,lppe); //枚举Process,然后判断是否是所要查找的Process while FoundAProc do begin //根据PathMatch的值来决定匹配的方式 if PathMatch then FoundOK:=AnsiStricomp(lppe.szExefile,PChar(AFilename))=0 else FoundOK:=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; //激活或者停止指定的权限 function EnabledDebugPrivilege(const bEnabled: Boolean):Boolean; var hToken: THandle; tp: TOKEN_PRIVILEGES; a: DWORD; const SE_DEBUG_NAME = 'SeDebugPrivilege'; begin Result:=False; //打开当前Process的令牌(我一直叫Token为令牌) if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken)) then begin //调整令牌的权限,也就是加上或者取消调试权限(SE_DEBUG_NAME) 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; //在指定的进程中插入一个DLL文件 function AttachToProcess(const HostFile, GuestFile : string;const PID:DWORD=0):DWORD; //HostFile为要绑定的宿主文件(Exe文件),GuestFile为要嵌入的客户文件(Dll文件) //如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; //激活当前Process的SE_DEBUG_NAME权限,如果不激活的话,一些服务进程将无法 //打开 EnabledDebugPrivilege(True); //给pszLibAFilename分配内存,为什么是Length(GuestFile)*2+1呢,因为咱们 //等一会儿,要调用函数LoadLibraryW,而LoadLibraryW函数需要的参数是WideChar型 Getmem(pszLibAFilename,Length(GuestFile)*2+1); StringToWideChar(GuestFile,pszLibAFilename,Length(GuestFile)*2+1); if PID>0 then dwRemoteProcessID:=PID else FindAProcess(HostFile,False,dwRemoteProcessID); //由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请 //足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。 //然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL,LoadLibraryW //函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL //文件的绝对路径名pszLibAFilename,(也就是DLL的全路径文件名),但是由于 //DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空 //间:(否则远程线程是无法读到这个参数的) hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD + //允许远程创建线程 PROCESS_VM_OPERATION+ //允许远程VM操作 PROCESS_VM_WRITE,//允许远程VM写 FALSE, dwRemoteProcessId); //计算DLL路径名需要的内存空间 cb := (1 + lstrlenW(pszLibAFilename)) * sizeof(WCHAR); //使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区 pszLibFileRemote := PWIDESTRING( VirtualAllocEx( hRemoteProcess, nil, cb, MEM_COMMIT, PAGE_READWRITE)); //使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间 TempVar:=0; iReturnCode := WriteProcessMemory(hRemoteProcess,pszLibFileRemote, pszLibAFilename, cb, TempVar); if iReturnCode then begin //计算LoadLibraryW的入口地址 pfnStartAddr := GetProcAddress(GetModuleHandle('Kernel32'), 'LoadLibraryW'); //OK,万事俱备,我们通过建立远程线程时的地址pfnStartAddr(实际上就是LoadLibraryW //的入口地址)和传递的参数 pszLibFileRemote(实际上是我们复制过去的DLL的全路 //径文件名)在远程进程内启动我们的DLL: //启动远程线程LoadLibraryW,通过远程线程调用用户的DLL文件 TempVar:=0; Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, TempVar); end; Freemem(pszLibAFilename); end; to fu_xiang_yu: 还满意吗? 不要告诉我你还不满意,我肚里的墨水都倒出来了,再倒的话就是苦水了! :) 来自:fu_xiang_yu, 时间:2001-6-17 17:37:00, ID:570339 Jedei不错,谢谢 但再强烈建议多写点注释(当然你已经写了不少了) 象这种比较高级的系统相关几乎任何书上都没有 好多begginer一定和我一样对这些相当陌生,我刚看时那是连门都摸不到 所以 强烈建议多写注释! 强烈建议多写注释!! 强烈建议多写注释!!! 来自:Jedei, 时间:2001-6-17 17:51:00, ID:570352 过奖,其实我也是参考了shotgun的例子 http://www.patching.net/shotgun/trojan4.htm 来自:fu_xiang_yu, 时间:2001-6-17 18:25:00, ID:570372 感谢Jedei 好像已经很详细了^_^ 我再看看 ooo 来自:fu_xiang_yu, 时间:2001-6-19 17:28:00, ID:573302 oooo~~~~~~ 来自:Kingron, 时间:2001-6-20 19:42:00, ID:574996 接受答案了. 来自:cqbaobao, 时间:2002-12-11 13:58:00, ID:1500793 高! 但是我运行后看不到效果,哪位老兄可指点一二? 我找不到 CSDN 上的原贴子了,而我的 TEST 里已经写入了要附加的程序的全路径了。 |
2010年11月5日星期五
攻克一个难题:在WinNT/2000下进程隐身(采用进程注入方式)(转)
订阅:
博文评论 (Atom)
没有评论:
发表评论