首页
社区
课程
招聘
[求助]VC如何保证自身程序名不被修改 [暂时解决]
发表于: 2007-10-15 16:42 7943

[求助]VC如何保证自身程序名不被修改 [暂时解决]

2007-10-15 16:42
7943
正在看 Rootkits: Subverting the Windows Kernel 一书.

其中讲到HOOK ZwQuerySystemInformation 实现隐藏进程,
在进程链表中抹掉要隐藏的程序,但就是简单的判断程序名称是否相等, 若程序名被改掉了就隐藏不了,很低级啊~
-------------------------------------------------------------------

网上大致搜了下,没有类似的问题. 可能问的太菜了吧
懒得写驱动隐藏文件, 那是不是得写一驱动防止程序被改名啊? (就小题大做了)

如果不写驱动来保护程序, 如何保证程序名不被改变呢?

//
// 主程序A运行 -- 生成新进程B, B判断A是否被改名,
// 若被改-- A退出,B修正A程序名称,B退出,启动主程序A
// 若没有被改, B退出
//

这个思路可以吗? 5555555~

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
2
奥,国外作者一般都以讲原理性的东西为主(对于防止非法使用有很大的好处。哈)。实战中我还没有看见通过进程名称来比较的
既然是EPROCESS 可以比较的东西很多。 努力发挥想象力。

当然真的是要为了隐藏,其实最好的办法还是注入ShellCode。隐藏进程其实意义并不太大,一来会出一些稳定性问题,二来用内核工具的话。看到你的进程那就太容易了。三来驱动编写也不是一个省油的灯当然还是占用一部分体积。当然如果不是为了写Trajon 倒是不用考虑。
说点题外话而已。

2007-10-15 18:25
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
3
哦,呵呵,谢谢啊~
偶得好好查阅下EPROCESS 相关的资料了~
2007-10-15 20:42
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
4
顺便问下大叔:

加载驱动的方法很多, 偶用ZwLoadDriver , 出现问题

-----------------------------------------------------------------------------------
程序运行后释放sudami.sys 到 C:\WINDOWS\system32\drivers 目录下
然后加载驱动,
加载驱动的代码如下:

/******************************************************************************
*  FileName        :   LoadDriver.h
*  Author          :   sudami
*  Time            :   2007/10/15
*  
*  Comment         :   加载驱动
******************************************************************************/

//HANDLE OpenDriver()     打开驱动建立的符号链接的句柄
//void UninstallDriver()  卸载驱动,要把OpenDriver打开的句柄关闭才可以成功卸载

#include "stdafx.h"
#include <windows.h>

////////////////////////////////////////////////////////////////////////////////

#define DRV_NAME         "sudami"        //驱动名
#define DRV_FILENAME     "sudami.sys"    //驱动文件

#define STATUS_SUCCESS     ((NTSTATUS)0x00000000L)

////////////////////////////////////////////////////////////////////////////////

typedef LONG NTSTATUS;

typedef struct _STRING {
        USHORT  Length;
        USHORT  MaximumLength;
        PCHAR  Buffer;
} ANSI_STRING, *PANSI_STRING;

typedef struct _UNICODE_STRING {
        USHORT  Length;
        USHORT  MaximumLength;
        PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

/***************************************************************************
*                                                                          *
*                          封状类 CLoadDriver                              *
*                                                                          *
***************************************************************************/
class CLoadDriver
{
public:
        BOOL     GetLoadDriverPriv();
        BOOL     SetupRegistry();
        HANDLE   OpenDriver();
        BOOL         UnloadDriver();
        BOOL         LoadDriver();
       
        void     CleanupDriver();
        void     UninstallDriver();
};

//////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------
//  函数名:    GetLoadDriverPriv
//
//  参数:      NULL
//  
//  返回值:    TRUE | FALSE
//         
//  函数功能:  Assign loaddriver priviledge to our process,
//             so we can load our support driver.
//--------------------------------------------------------------------------------   
BOOL CLoadDriver::GetLoadDriverPriv()
{
        HANDLE hToken;
       
        if(OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
        {
                LUID huid;
                if(LookupPrivilegeValue(NULL, "SeLoadDriverPrivilege", &huid))
                {
                        LUID_AND_ATTRIBUTES priv;
                        priv.Attributes = SE_PRIVILEGE_ENABLED;
                        priv.Luid = huid;
                       
                        TOKEN_PRIVILEGES tp;
                        tp.PrivilegeCount = 1;
                        tp.Privileges[0] = priv;
                       
                        if(AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL))
                        {
                                return TRUE;
                        }
                }
        }
        return FALSE;
}

//////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------
//  函数名:    SetupRegistry
//
//  参数:      NULL
//  
//  返回值:    TRUE | FALSE
//         
//  函数功能:  Sets up the necessary registry settings to load the support driver
//--------------------------------------------------------------------------------
BOOL CLoadDriver::SetupRegistry()
{
        // 创建子键
        HKEY hkey;
        if(RegCreateKey(
                HKEY_LOCAL_MACHINE,
                "System\\CurrentControlSet\\Services\\"DRV_NAME,
                &hkey)
                != ERROR_SUCCESS)
                return FALSE;
       
        ///////////////////////////////////////////////////////////////////////////////////
        DWORD val;
        val = 1;
        if(RegSetValueEx(hkey, "Type", 0, REG_DWORD, (PBYTE)&val, sizeof(val)) != ERROR_SUCCESS)
                return FALSE;
       
        if(RegSetValueEx(hkey, "ErrorControl", 0, REG_DWORD, (PBYTE)&val, sizeof(val)) != ERROR_SUCCESS)
                return FALSE;
       
        val = 3;
        if(RegSetValueEx(hkey, "Start", 0, REG_DWORD, (PBYTE)&val, sizeof(val)) != ERROR_SUCCESS)
                return FALSE;
       
        ///////////////////////////////////////////////////////////////////////////////////
        char *imgName = "system32\\DRIVERS\\"DRV_FILENAME;
       
        if(RegSetValueEx(hkey, "ImagePath", 0, REG_EXPAND_SZ, (PBYTE)imgName, strlen(imgName)) != ERROR_SUCCESS)
                return FALSE;
       
        return TRUE;
}

//////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------
//  函数名:    LoadDriver
//
//  参数:      NULL
//  
//  返回值:    TRUE | FALSE
//         
//  函数功能:  load our driver into memory
//--------------------------------------------------------------------------------
BOOL CLoadDriver::LoadDriver()
{
        // call ntdll APIs
        HMODULE hntdll;
       
        NTSTATUS (WINAPI *_RtlAnsiStringToUnicodeString)(PUNICODE_STRING  DestinationString,IN PANSI_STRING  SourceString,IN
               
                BOOLEAN);
       
        VOID (WINAPI *_RtlInitAnsiString)
                (IN OUT PANSI_STRING  DestinationString,
                IN PCHAR  SourceString);
       
        NTSTATUS (WINAPI * _ZwLoadDriver)
                (IN PUNICODE_STRING DriverServiceName);
       
        NTSTATUS (WINAPI * _ZwUnloadDriver)
                (IN PUNICODE_STRING DriverServiceName);
       
        VOID (WINAPI * _RtlFreeUnicodeString)
                (IN PUNICODE_STRING  UnicodeString);
       
       
        hntdll = GetModuleHandle("ntdll.dll");
       
        // 得到这些API的实际地址
        *(FARPROC *)&_ZwLoadDriver = GetProcAddress(hntdll, "NtLoadDriver");
       
        *(FARPROC *)&_ZwUnloadDriver = GetProcAddress(hntdll, "NtUnloadDriver");
   
        *(FARPROC *)&_RtlAnsiStringToUnicodeString =
                GetProcAddress(hntdll, "RtlAnsiStringToUnicodeString");
       
        *(FARPROC *)&_RtlInitAnsiString =
                GetProcAddress(hntdll, "RtlInitAnsiString");
       
        *(FARPROC *)&_RtlFreeUnicodeString =
                GetProcAddress(hntdll, "RtlFreeUnicodeString");
       
        /////////////////////////////////////////////////////////////////////////
        if(_ZwLoadDriver && _ZwUnloadDriver && _RtlAnsiStringToUnicodeString &&
                _RtlInitAnsiString && _RtlFreeUnicodeString)
        {
                ANSI_STRING aStr;
               
                _RtlInitAnsiString(&aStr,
                        "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"DRV_NAME);
               
                UNICODE_STRING uStr;
               
                if(_RtlAnsiStringToUnicodeString(&uStr, &aStr, TRUE) != STATUS_SUCCESS)
                {
                        return FALSE;
                        AfxMessageBox("_RtlAnsiStringToUnicodeString failed");
                }
                else
                {
                        if(_ZwLoadDriver(&uStr) == STATUS_SUCCESS)
                        {
                                _RtlFreeUnicodeString(&uStr);
                                return TRUE;
                        }
                        else
                        {
                                _RtlFreeUnicodeString(&uStr);
                                AfxMessageBox("_ZwLoadDriver(&uStr) failed");
                        }
                }
        }
       
        return FALSE;
}

//////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------
//  函数名:    UnloadDriver
//
//  参数:      NULL
//  
//  返回值:    TRUE | FALSE
//         
//  函数功能:  remove our driver from memory
//--------------------------------------------------------------------------------
BOOL CLoadDriver::UnloadDriver()
{
        // call ntdll APIs
        HMODULE hntdll;
        NTSTATUS (WINAPI * _RtlAnsiStringToUnicodeString)
                (PUNICODE_STRING  DestinationString,
                IN PANSI_STRING  SourceString,
                IN BOOLEAN);
       
        VOID (WINAPI *_RtlInitAnsiString)
                (IN OUT PANSI_STRING  DestinationString,
                IN PCHAR  SourceString);
       
        NTSTATUS (WINAPI * _ZwLoadDriver)
                (IN PUNICODE_STRING DriverServiceName);
       
        NTSTATUS (WINAPI * _ZwUnloadDriver)
                (IN PUNICODE_STRING DriverServiceName);
       
        VOID (WINAPI * _RtlFreeUnicodeString)
                (IN PUNICODE_STRING  UnicodeString);
       
       
        hntdll = GetModuleHandle("ntdll.dll");
       
        *(FARPROC *)&_ZwLoadDriver = GetProcAddress(hntdll, "NtLoadDriver");
       
        *(FARPROC *)&_ZwUnloadDriver = GetProcAddress(hntdll, "NtUnloadDriver");
   
        *(FARPROC *)&_RtlAnsiStringToUnicodeString =
                GetProcAddress(hntdll, "RtlAnsiStringToUnicodeString");
       
        *(FARPROC *)&_RtlInitAnsiString =
                GetProcAddress(hntdll, "RtlInitAnsiString");
       
        *(FARPROC *)&_RtlFreeUnicodeString =
                GetProcAddress(hntdll, "RtlFreeUnicodeString");
       
        /////////////////////////////////////////////////////////////////////////////
        if(_ZwLoadDriver && _ZwUnloadDriver && _RtlAnsiStringToUnicodeString &&
                _RtlInitAnsiString && _RtlFreeUnicodeString)
        {
                ANSI_STRING aStr;
               
                _RtlInitAnsiString(&aStr,
                        "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"DRV_NAME);
               
                UNICODE_STRING uStr;
               
                if(_RtlAnsiStringToUnicodeString(&uStr, &aStr, TRUE) != STATUS_SUCCESS)
                        return FALSE;
                else
                {
                        if(_ZwUnloadDriver(&uStr) == STATUS_SUCCESS)
                        {
                                _RtlFreeUnicodeString(&uStr);
                                return TRUE;
                        }
                        _RtlFreeUnicodeString(&uStr);
                }
        }
       
        return FALSE;
}

//////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------
//  函数名:    CleanupDriver
//
//  参数:      NULL
//  
//  返回值:    TRUE | FALSE
//         
//  函数功能:  Removes our driver file and registry settings
//--------------------------------------------------------------------------------
void CLoadDriver::CleanupDriver()
{
        char sysDir[MAX_PATH + 1];
        GetSystemDirectory(sysDir, MAX_PATH);
        strncat(sysDir, "\\drivers\\"DRV_FILENAME, MAX_PATH);
       
        DeleteFile(sysDir);
       
        RegDeleteKey(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\"DRV_NAME"\\Enum");
        RegDeleteKey(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\"DRV_NAME);
}

//////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------
//  函数名:    OpenDriver
//
//  参数:      NULL
//  
//  返回值:    HANDLE
//         
//  函数功能:  Attempts to get a handle to our kernel driver.  
//             If fails, try to install the driver.
//--------------------------------------------------------------------------------
HANDLE CLoadDriver::OpenDriver()
{
        HANDLE hDevice;
       
        if(!GetLoadDriverPriv())
        {
                AfxMessageBox("Error getting load driver privilege! ");
        }
        else
        {
                if(!SetupRegistry())
                {
                        AfxMessageBox("Error setting driver registry keys! Make sure you are running this as Administrator. ");
                }
                else
                {
                        if (LoadDriver())
                        {
                                hDevice = CreateFile(
                                        "\\\\.\\"DRV_NAME,
                                        GENERIC_WRITE | GENERIC_READ,
                                        FILE_SHARE_READ | FILE_SHARE_WRITE,
                                        NULL,
                                        OPEN_EXISTING,
                                        FILE_ATTRIBUTE_NORMAL,
                                        NULL);
                               
                                if(hDevice == INVALID_HANDLE_VALUE)
                                {
                                AfxMessageBox("Error loading kernel support driver! Make sure you are\
                                        running this as Administrator. ");
                                }
                                else
                                {
                                        AfxMessageBox("loading kernel support driver success");
                                }
                        }
                        else
                        {
                                AfxMessageBox("LoadDriver() failed");
                        }
                }
        }
       
        return hDevice;
}

//////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------
//  函数名:    UninstallDriver
//
//  参数:      NULL
//  
//  返回值:    NULL
//         
//  函数功能:  Remove our kernel driver from memory
//--------------------------------------------------------------------------------
void CLoadDriver::UninstallDriver()
{
/****************************************************************************8
char drvFullPath[MAX_PATH+1];
char *filePart;

  ZeroMemory(drvFullPath, MAX_PATH);  
  GetFullPathName(DRV_FILENAME, MAX_PATH, drvFullPath, &filePart);
  
        HANDLE hFile = CreateFile(drvFullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, 0);
       
          if(hFile == INVALID_HANDLE_VALUE)
          {
          AfxMessageBox("Cannot find required driver file ");
          return;
          }
          else
          {
          CloseHandle(hFile);
          
                char sysDir[MAX_PATH + 1];
                GetSystemDirectory(sysDir, MAX_PATH);
                strncat(sysDir, "\\drivers\\"DRV_FILENAME, MAX_PATH);
                CopyFile(drvFullPath, sysDir, TRUE);
               
                  *****************************************************************/
        if(!GetLoadDriverPriv())
        {
                AfxMessageBox("Error getting load driver privilege! ");
        }
        else
        {
                if(!SetupRegistry())
                {
                       
                        AfxMessageBox("Error setting driver registry keys! Make sure you are running this as Administrator. ");
                }
                else
                {
                        if(UnloadDriver())
                                AfxMessageBox("Support driver successfully unloaded. ");
                        else
                                AfxMessageBox("Unload support driver failed.  It is probably not loaded. ");
                }
        }
       
        CleanupDriver();
}

--------------------------------------------------------------------------------

蓝颜色部分就是出错的地方.
sudami.sys已经释放出来了, 可是到

if(_ZwLoadDriver(&uStr) == STATUS_SUCCESS)

显示加载不成功.
这是什么原因造成的啊?
2007-10-15 21:03
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
5
嗯,问题已经自己解决了.释放并加载驱动成功;
不利用进程名进行判断是非常必要的.

嘿嘿,结帖~
2007-10-16 13:10
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
6
楼主代码风格不错,呵呵
2007-10-16 14:47
0
雪    币: 210
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不懂,学习ing.....
2007-11-21 11:56
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习!!!!!
2007-11-21 12:56
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
封状类 CLoadDriver
2007-11-21 15:38
0
雪    币: 220
活跃值: (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
喜欢楼主的编 码风格
2007-11-21 16:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
新手上路,多多关照!!
2007-11-22 18:45
0
游客
登录 | 注册 方可回帖
返回
//