查看: 3393|回复: 8
收起左侧

[已解决] 我想知道wsyscheck和icesword是怎么编的

 关闭 [复制链接]
hzx19 该用户已被删除
发表于 2008-8-15 11:16:11 | 显示全部楼层 |阅读模式
我想知道wsyscheck和icesword是怎么编的
是汇编还是用c语言
哪个更底层

他们的源代码有公开吗

sreng也是中国人编的吧,中国在这方面这么强啊

哪个知道帮我好好讲讲 好吗

还有啊,icesword用来老要改名,我发现一招,改后缀够了,把.exe改成.com  或.bat  .com都可以用啊,病毒没法了,不知大家认为呢,有道理吗
JY-YZX714
发表于 2008-8-15 11:20:04 | 显示全部楼层
sreng好像不是中国的
leileizhu
发表于 2008-8-15 12:00:50 | 显示全部楼层
汇编更底层。也许是通过中断获得更高权限。怎么编嘛就要看使用的语言了 一般都有函数可以调用。冰刃不是在运行时会触发卡巴的主动防御。可以通过这个了解一下
hzx19 该用户已被删除
 楼主| 发表于 2008-8-15 14:22:25 | 显示全部楼层
我又发现一个,icesword可以kill wsyscheck,而wsyscheck不能结束icesword
hzx19 该用户已被删除
 楼主| 发表于 2008-8-15 14:25:56 | 显示全部楼层
三两行代码实现进程防杀,免驱动,IceSword,WSysCheck等无效.2008-05-27 15:38其实这个已经是一个很老的技巧了,今天挖出来写到blog上。windows在强制结束进程的时候会先结束掉所有的线程,而结束线程调用的是:PspTerminateThreadByPointer,这个函数很有意思。看看就知道了。

它判断ETHREAD里面的CrossThreadFlags;的值,如果这个值等于PS_CROSS_THREAD_FLAGS_SYSTEM ,即是一个系统线程,那么直接返回拒绝访问,那么进程就无法结束了。所以我们把程序的线程改成系统线程,那么就可以达到防杀的目的。当然要杀还是很快的,把值修改回去或者投递一个ExitThread的APC就OK了。当然,觉得不够刺激可以改成PS_CROSS_THREAD_FLAGS_BREAK_ON_TERMINATION,那么结束线程的时候,系统会中断下来,一般是因为没有调试器附加而产生一个bugcheck,即蓝屏。


NTSTATUS
PspTerminateThreadByPointer(
     IN PETHREAD Thread,
     IN NTSTATUS ExitStatus,
     IN BOOLEAN DirectTerminate
     )
现在我们要修改CrossThreadFlags,那么首先要找到线程对应的ETHREAD,如果是驱动来做的话,几行代码就OK了。但是在ring3也是几行代码。我们先用OpenThread打开自己,这时会产生一个handle,然后我们把这个handle遍历出来,以查找到对应的Object的地址,也就是ETHREAD的地址。查找handle可以使用ZwQuerySystemInformation去获得。这时就剩下修改内存了,因为ETHREAD是在内核内存的,不能直接访问,我们可以通过NtSystemDebugControl去修改内核内存。下面是核心代码:


   
http://blog.csdn.net/KeSummer/archive/2008/05/18/2455379.aspx




如何清理这个类型的Rootkit呢?以最容易操作的Wsyscheck为例,首先运行Wsyscheck(你会发现一个有趣现象:IceSword无法检测到Wsyscheck的Hook,因为它用的技术是Inline Hook和FSD Hook),点击进入“内核检查”,选中“FSD检查”,留意“代码异常”项里是否有标注为“Yes”的项,如果有,请在界面里右键点击,并选择“恢复所有函数”。Wsyscheck的进程列表并非使用IceSword一类的逻辑,所以如果你看到存在红色的列表也不要太过于紧张,它只是表示这个程序是没有系统签名验证、且类型特殊(如服务、加载驱动等)的应用程序而已,并非是IceSword这样的“坏人标识”。
hzx19 该用户已被删除
 楼主| 发表于 2008-8-15 14:41:51 | 显示全部楼层
恩, 不知道下面那个方法行得通吗,我试试,不成功啊



[分享]《打造IceSword也杀不掉的进程》代码还原
黑防六期有《打造IceSword也杀不掉的进程》,作者写出了关键代码,但光盘没有提供原始代码.今天兴起,认真阅读文章后把代码基本还原,供大家分享(已通过VC++6.0编译和DDK编译OK!);
在此特别感谢本文作者fOx为大家提供的另类且牛逼手段,不过先声名几点:
1、本文不属于原创,版权归原作者
2、或许怪我写的不好,进程虽然不会被冰刃、任务管理器等截杀,但有时自己也没法结束自己
3、如果出现无法结束自己的情况,使用冰刃进程功能中的线程信息,对线程选强制杀死就行了

驱动代码:

//RING0        START
#include "ntddk.h"
#define NT_DEVICE_NAME                    L"\\Device\\PP"
#define DOS_DEVICE_NAME          L"\\DosDevices\\PP"
#define IOCTL_PROTECT_CONTROL CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define PS_CROSS_THREAD_FLAGS_SYSTEM 0x00000010UL
UNICODE_STRING         DeviceNameString;
UNICODE_STRING         LinkDeviceNameString;
ULONG GetCrossThreadFlagsOffset();

NTSTATUS
PsLookupThreadByThreadId(
        IN         HANDLE          hThreadId,
        OUT PETHREAD *pEthread
);

NTKERNELAPI
BOOLEAN
PsIsSystemThread(IN PETHREAD Thread);

VOID UnloadDriver(IN PDRIVER_OBJECT DriverObject)
{
        PDEVICE_OBJECT deviceObject;
    deviceObject= DriverObject->DeviceObject;
    IoDeleteSymbolicLink(&LinkDeviceNameString);
    ASSERT(!deviceObject->AttachedDevice);
    if ( deviceObject != NULL )
    {
        IoDeleteDevice( deviceObject );
    }
}

NTSTATUS DispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
                 NTSTATUS                nStatus                 = STATUS_SUCCESS;
                        ULONG                IoControlCode         = 0;
PIO_STACK_LOCATION                IrpStack                 = NULL;
                        PETHREAD         Thread;
                        HANDLE                 ThreadId;
                        PULONG                Flags;
                        
                        

        Irp->IoStatus.Status                = STATUS_SUCCESS;
        Irp->IoStatus.Information        = 0;
        IrpStack        =        IoGetCurrentIrpStackLocation(Irp);

        switch(IrpStack->MajorFunction)
        {
                case IRP_MJ_CREATE:
                        break;
         
                case IRP_MJ_CLOSE :
                        break;

                case IRP_MJ_DEVICE_CONTROL:
                IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
                switch(IoControlCode)
                {
                case IOCTL_PROTECT_CONTROL:
                _try
                {
                        if( IrpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(HANDLE) )
                        return STATUS_BUFFER_TOO_SMALL;
                        ThreadId = *(PHANDLE)Irp->AssociatedIrp.SystemBuffer;
                        nStatus = PsLookupThreadByThreadId(ThreadId,&Thread);
                        if( NT_SUCCESS(nStatus) )
                        {
                                Flags = (PULONG)( (PUCHAR)Thread + GetCrossThreadFlagsOffset() );
                                *Flags |= PS_CROSS_THREAD_FLAGS_SYSTEM;
                        }
                        else
                        {
                                DbgPrint("Find Ethread Error == 0x%0.8X",nStatus);
                        }
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                        DbgPrint("Exception On Modify Thread Cross Flags");
                }
                break;

                default:
                break;                 
                }
                        break;
                        
                default:                 
                break;
        }                 
        nStatus = Irp->IoStatus.Status;
        IoCompleteRequest(Irp,IO_NO_INCREMENT);
        return nStatus;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT theDriverObject, PUNICODE_STRING pRegistryString)
{
        NTSTATUS                         status;
        PDEVICE_OBJECT           deviceObject;
         
    RtlInitUnicodeString( &DeviceNameString,    NT_DEVICE_NAME );
    RtlInitUnicodeString( &LinkDeviceNameString,DOS_DEVICE_NAME );
     
    status = IoCreateDevice(
                                theDriverObject,
                                0,                       
                                &DeviceNameString,
                                FILE_DEVICE_DISK_FILE_SYSTEM,
                                FILE_DEVICE_SECURE_OPEN,
                                FALSE,
                                &deviceObject );
                                 
        if (!NT_SUCCESS( status ))
    {
        KdPrint(("DriverEntry: Error creating control device object, status=%08x\n", status));
        return status;
    }
     
    theDriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchDeviceControl;
        theDriverObject->MajorFunction[IRP_MJ_CLOSE]  = DispatchDeviceControl;
        theDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;         
        theDriverObject->DriverUnload = UnloadDriver;
   
    status = IoCreateSymbolicLink(
                                (PUNICODE_STRING) &LinkDeviceNameString,
                (PUNICODE_STRING) &DeviceNameString
                                                                 );
        if (!NT_SUCCESS(status))
        {
                IoDeleteDevice(deviceObject);
                return status;
        }
        return STATUS_SUCCESS;
}

ULONG GetCrossThreadFlagsOffset()
{
        static ULONG Offset = 0;
        PUCHAR pProc;
        if(Offset == 0)
                pProc = (PUCHAR)PsIsSystemThread;
        while( *pProc!=0x8B || *(pProc+1)!=0x80 )
                pProc++;
        DbgPrint("Instruction found in address == 0x%0.8X",pProc);
        Offset = *(PULONG)(pProc+2);
        DbgPrint("Offset == 0x%0.8X",Offset);
        return Offset;
}
//RING0        END

用户程序代码( 注意:(1)被保护进程是自己,(2)加载驱动使用专门工具 )
//RING3 START
// PP.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <string.h>
#include <winioctl.h>
#include <conio.h>
#include "psapi.h"        //这个头文件编进程相关程序的人都有吧。。。

#pragma comment( lib, "psapi" )

#define IOCTL_PROTECT_CONTROL CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)

int main(int argc, char* argv[])
{
        HANDLE        hDevice;
        char OpenName[MAX_PATH] = "\\\\.\\PP";
        hDevice = CreateFileA(OpenName,
                        GENERIC_READ|GENERIC_WRITE,
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                        NULL, OPEN_EXISTING,
                        0, NULL );
        if(hDevice==INVALID_HANDLE_VALUE)
        {
                printf("Error GetLastError() is %d",GetLastError());
                return 0;
        }
        DWORD dwProcessId = GetCurrentProcessId();
        HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
        THREADENTRY32        te32;
        hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
        if(hThreadSnap==INVALID_HANDLE_VALUE)
                return 0;
        te32.dwSize = sizeof(THREADENTRY32);
        if(!Thread32First(hThreadSnap,&te32))
        {
                printf("Error Thread32First");
                CloseHandle(hThreadSnap);
                return 0;
        }
        do
        {
                if( te32.th32OwnerProcessID == dwProcessId )
                {
                printf("THREAD ID = 0x%08X\n",te32.th32ThreadID);
                PVOID pBuffer = &(te32.th32ThreadID);
                DWORD dwReturned;
                BOOL bSuc = DeviceIoControl(hDevice,
                        IOCTL_PROTECT_CONTROL,pBuffer,sizeof(te32.th32ThreadID),
                        NULL,NULL,
                        &dwReturned,NULL);
                if(!bSuc)
                        printf("Error Code is %d",GetLastError());
                }
        }while(Thread32Next(hThreadSnap,&te32));
        CloseHandle(hThreadSnap);
        CloseHandle(hDevice);
        getch();//不能不写,否则程序加载后就退出了
        return 0;
}
//RING3 END
hzx19 该用户已被删除
 楼主| 发表于 2008-8-24 19:32:24 | 显示全部楼层
嘿嘿,大家也没兴趣搞了吧

http://www.downbank.cn/soft/4/109/2008/2008080411783.htm
这个还用vb编的呢,一样强大

http://bbs.kafan.cn/viewthread.p ... p;extra=&page=1
有兴趣来这里讨论
伊の星
发表于 2008-8-24 19:43:10 | 显示全部楼层
我来了。。。
sreng不是中国的。
qcqyt
发表于 2008-8-24 21:03:58 | 显示全部楼层
sreng作者smallfrogs的blog,自己看吧
http://hi.baidu.com/smallfrogs
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2026-10-21 16:49 , Processed in 0.089324 second(s), 9 queries , Redis On.

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表