29 12
发新话题
打印

[原创]阻止删除文件(文件占坑)+nevergone逆向代码一份

本主题由 风泽 于 2008-7-7 12:59 提升

[原创]阻止删除文件(文件占坑)+nevergone逆向代码一份

信息来源:邪恶八进制信息安全团队(www.eviloctal.com

逆向作者:nevergone

作者:Written by 风泽(EvilHsu)[E.S.T] 真正的技术作者是DebugMan上《ring3文件占坑大法》的作者。



介绍:
dhfile是参考《ring3文件占坑大法》一文制造出的一款利用DuplicateHandle函数防止文件被删除、改名等操作的软件,同时也提供卸载、查找、搜索打开的文件句柄。当程序运行后,再使用这款工具将程序句柄复制到其他进程中,达到防删除目的,不影响正在运行程序的正常运行。至于这款软件想怎么去利用,就要看你们的想象力了。

注:
感谢《ring3文件占坑大法》的作者。

用法:
dhfile.exe [ /p | /f | /c | /l ] [PID] [FileName]

例子:
1. dhfile.exe /l 868
   搜索PID为868的进程打开的所有文件
2. dhfile.exe /f text.exe
   搜索打开text.exe句柄的进程
3. dhfile.exe /c 868 text.exe
   卸载进程ID为868中text.exe文件句柄
4. dhfile.exe /p 868 c:\text.exe
   将text.exe句柄复制到PID为868的进程中,达到防止删除text.exe文件的目的。

关键代码
复制内容到剪贴板
代码:
BOOL DupFile( LPCTSTR lpFileName , int pid )
{
    BOOL    bRedup;
    HANDLE  hFile,hProcess;
    HANDLE  hTargetHandle;
   
    EnablePrivilege(SE_DEBUG_NAME,TRUE);

    if(ProcessList(pid)) printf("Process Name: %s\n",szProcessName);

    hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, pid);

    if ( hProcess == NULL )
       {
           printf("PROCESS_DUP_HANDLE Error\n");     
           return FALSE;
       }

    hFile = CreateFile( lpFileName,
                      GENERIC_READ,
                      0,
                      NULL,
                      OPEN_ALWAYS,
                      FILE_ATTRIBUTE_NORMAL,
                      NULL);

    if ( hFile == INVALID_HANDLE_VALUE )
    {
        printf("CreateFile Error\n");
        CloseHandle( hProcess );
        return FALSE;
    }

    bRedup = DuplicateHandle( GetCurrentProcess(),
                              hFile,
                              hProcess,
                              &hTargetHandle,
                              0,
                              FALSE,
                              DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);

    CloseHandle( hProcess );

    return bRedup;
}
dhfile.rar (2.94 KB) 程序如有BUG请提示,如果有空偶会修改滴!


以下是nevergone逆向代码,其中软件存在的BUG已经提示并做了修改。(特别感谢nevergone能给予指正)
复制内容到剪贴板
代码:
/********************************************************************
        filename:         e:\C++\VS2008\dhfile_MY\dhfile_MY\dhfile.cpp
        file path:        e:\C++\VS2008\dhfile_MY\dhfile_MY
        file base:        dhfile
        file ext:        cpp
        completed:        7.7 0:15
        author:                nevergone
               
        purpose:        practice for reverseing
                                original author : 风泽
*********************************************************************/

#include <windows.h>
#include <TlHelp32.h>
#include <tchar.h>
#include <cstdio>
#include "ntdll/ntdll.h"
#pragma comment(lib, "ntdll.lib")

#pragma warning(disable : 4996)

using namespace std;

#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)

char g_szProcessName[MAX_PATH];
HANDLE g_hProcessHeap;

struct HANDLE_NAME
{
        HANDLE hFile;
        FILE_NAME_INFORMATION file_info;
};

//
// this function come from KILL_KIS8
//
PVOID GetSystemInformation(SYSTEM_INFORMATION_CLASS iSystemInformationClass)
{
        ULONG                ulSize = 0x8000;
        ULONG                ulRequired;
        LPVOID                pvBuffer;
        NTSTATUS        Status;

        do {
                pvBuffer = HeapAlloc(GetProcessHeap(), 0, ulSize);

                if (!pvBuffer)
                        return NULL;

                Status = NtQuerySystemInformation(iSystemInformationClass,
                                                                                        pvBuffer,
                                                                                        ulSize,
                                                                                        &ulRequired);

                if (Status == STATUS_INFO_LENGTH_MISMATCH)
                {
                        HeapFree(GetProcessHeap(), 0, pvBuffer);
                        ulSize *= 2;
                }
        } while(Status == STATUS_INFO_LENGTH_MISMATCH);

        if (NT_SUCCESS(Status))
                return pvBuffer;

        HeapFree(GetProcessHeap(), 0, pvBuffer);
        return NULL;
}

DWORD WINAPI GetFileNameThreadProc(LPVOID pvParam)
{
        IO_STATUS_BLOCK io_status;

        HANDLE hFile = *(LPHANDLE)pvParam;
        PVOID pvBuffer = (PVOID)((DWORD)pvParam + sizeof(HANDLE));

        NtQueryInformationFile(hFile,
                                                        &io_status,
                                                        pvBuffer,
                                                        528,
                                                        FileNameInformation);
        return 0;
}


INT GetFileNameByHandle(HANDLE hFile, LPSTR lpMultiByteStr)
{
        PVOID pvBuffer = HeapAlloc(g_hProcessHeap, HEAP_ZERO_MEMORY, 532);

        *((LPDWORD)pvBuffer) = (DWORD)hFile;

        HANDLE hThread = CreateThread(NULL,
                                                                        0,
                                                                        GetFileNameThreadProc,
                                                                        pvBuffer,
                                                                        0,
                                                                        NULL);

        //
        // 100 may be too short for some slow machine~
        //
        DWORD dwRet = WaitForSingleObject(hThread, 100);

        if (dwRet == WAIT_TIMEOUT)
                TerminateThread(hThread, 0);

        CloseHandle(hThread);

        PFILE_NAME_INFORMATION pFileNameInfo = (PFILE_NAME_INFORMATION)((DWORD)pvBuffer + sizeof(HANDLE));
       
        WideCharToMultiByte(CP_ACP,
                                                0,
                                                pFileNameInfo->FileName,
                                                pFileNameInfo->FileNameLength / 2,
                                                lpMultiByteStr,
                                                MAX_PATH,
                                                NULL,
                                                NULL);

        HeapFree(g_hProcessHeap, 0, pvBuffer);
        return 0;
}


UCHAR GetFileObjectTypeNumber()
{
        UCHAR uchar_ObjectTypeNumber = 0;

        HANDLE hFile = CreateFileA("NUL",
                                                                GENERIC_READ,
                                                                0,
                                                                NULL,
                                                                OPEN_EXISTING,
                                                                0,
                                                                0);

        if (hFile == INVALID_HANDLE_VALUE)
                return 0;
       
        LPVOID pvBuffer = GetSystemInformation(SystemHandleInformation);
        if (pvBuffer == NULL)
        {
                CloseHandle(hFile);
                return 0;
        }

        DWORD dwCount = ((PSYSTEM_HANDLE_INFORMATION_EX)pvBuffer)->NumberOfHandles;

        if (!dwCount)
        {
                HeapFree(g_hProcessHeap, 0, pvBuffer);
                CloseHandle(hFile);
                return 0;
        }

        PSYSTEM_HANDLE_INFORMATION pHandleInfo = ((PSYSTEM_HANDLE_INFORMATION_EX)pvBuffer)->Information;

        for (DWORD i = 0; i < dwCount; ++i)
        {
                if (pHandleInfo[i].Handle == (USHORT)hFile &&
                        pHandleInfo[i].ProcessId == GetCurrentProcessId())
                {
                        uchar_ObjectTypeNumber = pHandleInfo[i].ObjectTypeNumber;
                        HeapFree(g_hProcessHeap, 0, pvBuffer);
                        CloseHandle(hFile);
                        return uchar_ObjectTypeNumber;
                }
        }

        return 0;
}

BOOL EnableDebugPrivilge(LPCSTR lpName, BOOL fEnable)
{
        HANDLE                                hObject;
        LUID                                Luid;
        TOKEN_PRIVILEGES        NewStatus;

        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hObject))
                return FALSE;

        if (LookupPrivilegeValue(NULL, lpName, &Luid))
        {
                NewStatus.Privileges[0].Luid = Luid;
                NewStatus.PrivilegeCount = 1;
                NewStatus.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;

                AdjustTokenPrivileges(hObject, FALSE, &NewStatus, 0, 0, 0);
               
                CloseHandle(hObject);
                return TRUE;
        }
       
        return FALSE;
}

BOOL GetProcessNameById(DWORD dwProcessId)
{
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,
                                                                                                0);
        //
        // add by nevergone
        //
        if (hSnapshot == INVALID_HANDLE_VALUE)
        {
           printf("CreateToolhelp32Snapshot error\n");
           return 0;
        }
       
        PROCESSENTRY32 pe;
        PCHAR pProcessName = NULL;

        //
        // add by nevergone. Process32First may be failed if without setting the size
        //
        pe.dwSize = sizeof(pe);
       
        if (!Process32First(hSnapshot, &pe))
        {
                CloseHandle(hSnapshot);
                return FALSE;
        }

        do {
                pProcessName = strrchr(pe.szExeFile, '\\');

                if (pProcessName)
                        pProcessName++;
                else
                        pProcessName = pe.szExeFile;

                if (pe.th32ProcessID == dwProcessId)
                {
                        ZeroMemory(g_szProcessName, sizeof(g_szProcessName));
                        strncpy(g_szProcessName, pProcessName, lstrlen(pProcessName));

                        //
                        //add by nevergone
                        //
                        CloseHandle(hSnapshot);
                        return TRUE;
                }
        } while(Process32Next(hSnapshot, &pe));

        CloseHandle(hSnapshot);
        return FALSE;
}

BOOL ProtectFile(LPCSTR lpFileName, DWORD dwProcessId)
{
        HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId);

        if (!hProcess)
        {
                printf("PROCESS_DUP_HANDLE Error\n");
                return FALSE;
        }

        HANDLE hFile = CreateFile(lpFileName,
                                                                GENERIC_READ,
                                                                0,
                                                                NULL,
                                                                /*OPEN_ALWAYS*/OPEN_EXISTING,                // OPEN_EXISTING may be better [nevergone]
                                                                FILE_ATTRIBUTE_NORMAL,
                                                                NULL
                                                                );

        if (hFile == INVALID_HANDLE_VALUE)
        {
                printf("CreateFile Error\n");
                CloseHandle(hFile);
                return FALSE;
        }

        BOOL fOk = DuplicateHandle(GetCurrentProcess(),
                                                                hFile,
                                                                hProcess,
                                                                NULL,
                                                                0,
                                                                FALSE,
                                                                DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);

        CloseHandle(hProcess);

        return fOk;
}

int Process(int iUnknown, char *pString1, char *pString2)
{
        UCHAR uchar_FileTypeNumber;
        PVOID pvoid_HandleInfo;
        DWORD dwHandleCount;
        PSYSTEM_HANDLE_INFORMATION pHandleInfo;
        HANDLE hProcess;
        HANDLE hTarget;
        PCHAR pszPath;
        DWORD dwCount = 0;
        CHAR szFilePath[MAX_PATH] = { 0 };
       
        g_hProcessHeap = GetProcessHeap();
        uchar_FileTypeNumber = GetFileObjectTypeNumber();
        pvoid_HandleInfo = GetSystemInformation(SystemHandleInformation);
       
        if (pvoid_HandleInfo == NULL)
                return 0;
       

        dwHandleCount = *(LPDWORD)pvoid_HandleInfo;
        pHandleInfo = (PSYSTEM_HANDLE_INFORMATION)((DWORD)pvoid_HandleInfo + sizeof(HANDLE));

        if (!dwHandleCount)
        {
                HeapFree(g_hProcessHeap, 0, pvoid_HandleInfo);
                printf("Not found File %s \n", pString1);
                return 0;
        }

        for (DWORD i = 0; i < dwHandleCount; ++i)
        {
                if (pHandleInfo[i].ObjectTypeNumber != uchar_FileTypeNumber)
                        continue;

                if (iUnknown == pHandleInfo[i].ProcessId ||
                        _strnicmp(pString2, "/f", 2) == 0)
                {
                        // ToDo:
                        hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, pHandleInfo[i].ProcessId);

                        if (hProcess == NULL)
                                continue;

                        BOOL fOk = DuplicateHandle(hProcess,
                                                                                (HANDLE)pHandleInfo[i].Handle,
                                                                                GetCurrentProcess(),
                                                                                &hTarget,
                                                                                0,
                                                                                FALSE,
                                                                                DUPLICATE_SAME_ACCESS);
                        if (!fOk)
                        {
                                CloseHandle(hProcess);
                                continue;
                        }
                       
                        //
                        // add by nevergone, this is important. if GetFileNameThreadProc failed to
                        // get the file path, then WideCharToMultiByte do nothing with
                        // lpMultiByteStr parameter[see Test Project for detail],
                        // but lpMultiBytePtr is set by the previous GetFileNameByHandle. so must zero szFilePath.
                        //
                        ZeroMemory(szFilePath, sizeof(szFilePath));

                        GetFileNameByHandle(hTarget, szFilePath);

                        pszPath = szFilePath;

                        if (pszPath = strrchr(szFilePath, '\\'))
                                pszPath++;
                        else
                                pszPath = szFilePath;

                        if (_strnicmp(pString2, "/l", 2) == 0)
                        {
                                ++dwCount;
                                printf("Handle: %d .... FileName: %s\n", pHandleInfo[i].Handle, szFilePath);
                                CloseHandle(hTarget);
                                CloseHandle(hProcess);
                                continue;
                        }

                        if (_strnicmp(pString1, pszPath, lstrlen(pString1)) == 0)
                        {
                                ++dwCount;
                                printf("Process:%d Handle: %d .... FileName: %s\n",  pHandleInfo[i].ProcessId, pHandleInfo[i].Handle, szFilePath);

                                if (_strnicmp(pString2, "/c", 2) == 0)
                                {
                                        BOOL fOk = DuplicateHandle(hProcess,
                                                                                                (HANDLE)pHandleInfo[i].Handle,
                                                                                                GetCurrentProcess(),
                                                                                                NULL,
                                                                                                0,
                                                                                                FALSE,
                                                                                                DUPLICATE_CLOSE_SOURCE);

                                        if (fOk)
                                                printf("Close Files Handle....Success\n");
                                        else
                                                printf("Close Files Handle....Failure\n");
                                }
                        }

                        CloseHandle(hTarget);
                        CloseHandle(hProcess);
                }
        }
       
        HeapFree(g_hProcessHeap, 0, pvoid_HandleInfo);

        if (dwCount == 0)
        {
                printf("Not found File: %s \n", pString1);
        }

        return 0;
}

int main(int argc, char *argv[])
{
        if (argc < 2 ||
                lstrcmpi(argv[1], "/?") == 0 ||
                lstrcmpi(argv[1], "-?") == 0 ||
                lstrcmpi(argv[1], "-h") == 0 ||
                lstrcmpi(argv[1], "/help") == 0 ||
                lstrcmpi(argv[1], "-help") == 0)
        {
                //ShowHelp(argv[0]);
                exit(0);
        }

        EnableDebugPrivilge("SeDebugPrivilege", TRUE);

        if (argc < 3)
        {
                printf("参数不正确!\n");
                //ShowHelp(argv[0]);
                exit(0);
        }

        if (lstrcmpi(argv[1], "/f") == 0)
        {
                Process(-1, argv[2], argv[1]);
                return 0;
        }
       
        //
        // if argv[3] is absolute path, operation will failed.
        // but i don't want to solve this problem.
        // 风泽 take responsibility for this bug,
        // HA HA HA....
        //
        if (lstrcmpi(argv[1], "/c") == 0)
        {
                int dwProcessId = atoi(argv[2]);
                if (dwProcessId > 0xFFFF ||
                        dwProcessId < 4)
                {
                        printf("参数不正确!\n");
                        //ShowHelp(argv[0]);
                        exit(0);
                }

                if (!GetProcessNameById(dwProcessId))
                {
                        printf("Not found process : %d\n\n", dwProcessId);
                        exit(0);
                }

                printf("Process Name: %s \n\n", g_szProcessName);

                Process(dwProcessId, argv[3], argv[1]);
                return 0;
        }

        if (lstrcmpi(argv[1], "/l") == 0)
        {
                int dwProcessId = atoi(argv[2]);

                if (dwProcessId > 0xFFFF ||
                        argc > 3)
                {
                        printf("参数不正确!\n");
                        //ShowHelp(argv[0]);
                        exit(0);
                }

                if (!GetProcessNameById(dwProcessId))
                {
                        printf("Not found process : %d\n\n", dwProcessId);
                        exit(0);
                }

                printf("process name: %s \n\n", g_szProcessName);

                Process(dwProcessId, NULL, argv[1]);
                return 0;
        }

        if (lstrcmpi(argv[1], "/p") == 0)
        {
                int dwProcessId = atoi(argv[2]);
                if (dwProcessId > 0xFFFF ||
                        argc < 3)
                {
                        printf("参数不正确!\n");
                        //ShowHelp(argv[0]);
                        exit(0);
                }

                if (!GetProcessNameById(dwProcessId))
                {
                        printf("Not found process : %d\n\n", dwProcessId);
                        exit(0);
                }

                printf("Process Name: %s \n\n", g_szProcessName);

                if (ProtectFile(argv[3], dwProcessId))
                {
                        printf("\n...Success!\n");
                }

                return 0;
        }
}
[ 本帖最后由 风泽 于 2008-7-7 13:11 编辑 ]

附件

dhfile_MY.rar (122.91 KB)

2008-7-7 12:56, 下载次数: 32

nevergone提供的完整逆向

本帖最近评分记录
  • 认真的雪 威望 +10 这代码短小精悍哟...... 2008-4-5 10:29
  • l4bm0s 威望 +10 膜拜一下风泽大牛~~~ 2008-4-4 10:19
  • sudami 威望 +10 膜拜一下风泽大牛~~~ 2008-4-3 22:45

TOP

汗一个. yiyikingking牛估计要说 风泽大牛你偷代码了

代码很X很XXX,不错不错~~~~~

[ 本帖最后由 sudami 于 2008-4-3 22:48 编辑 ]
WINDOWS内核疯狂爱好者

TOP

这个也不算偷吧?说明技术作者是他撒。。我只是一个书写者。。。把一系列的功能实现了。。。
修正了他DuplicateHandle中的一个参数。。。不改会造成文件损坏,也许是他故意的哈?呵呵~~好技术大家学习。。。
DuplicateHandle这个函数也被用烂了。。只是yiyikingking大牛的思路比较独特。
整个软件的代码yiyikingking的代码只占10%。。。。

再次感谢yiyikingking大牛~包括那个俄罗斯的。。。哈哈

[ 本帖最后由 风泽 于 2008-4-4 08:15 编辑 ]

TOP

yiyikingking大牛的代码的确淫荡~~哈哈~
不然偶也不会把这个工具给完善起来。
各位具体了解一下工具的使用方法,看这个工具到底能用在哪些地方,产生其他效果。
有思路及时跟帖,好东西大家分享撒~~

TOP

好象原作者说过:一个程序开机启动,删除xxxxx软件的某个重要文件,然后生成同名的占坑,短时间内无敌!
忘了在哪儿看到的这句话^&
本帖最近评分记录
  • 风泽 威望 +10 感谢您参加论坛讨论并做出认真回复 ... 2008-4-5 23:52

TOP

引用:
原帖由 doking 于 2008-4-5 20:18 发表
好象原作者说过:一个程序开机启动,删除xxxxx软件的某个重要文件,然后生成同名的占坑,短时间内无敌!
忘了在哪儿看到的这句话^&
这样做目的在于什么?阻止XXXXX软件自我恢复那个重要文件?那就是破坏XXXXX软件的完整性了?
不错的思路!

TOP

虽然可以做到自己不能被菜鸟删除,但是有个问题,就是如果做成U盘病毒的话,例如已经打开U盘中了病毒,现在程序已经启动了,如果再把U盘关闭的话,再打开U盘,程序不能再运行第二次,此时U盘就无法被打开,其他盘也是同样的原理
本帖最近评分记录
  • 风泽 威望 +5 感谢您参加论坛讨论并做出认真回复 ... 2008-4-6 20:55
love hack

TOP

说下,在U盘病毒中加了双击U盘,能打开U盘的代码,第一次打开U盘是病毒先启动,然后病毒把U盘打开的,第二次再打开U盘,病毒程序将无法再运行第二次,U盘也就打不开了
love hack

TOP

引用:
原帖由 dayang1718 于 2008-4-6 16:17 发表
说下,在U盘病毒中加了双击U盘,能打开U盘的代码,第一次打开U盘是病毒先启动,然后病毒把U盘打开的,第二次再打开U盘,病毒程序将无法再运行第二次,U盘也就打不开了 ...
首先感谢您对这个问题的阐述,但不知道你有没有写代码测试过,当U盘拔出来后,你复制到别的进程的句柄就自动关闭了,所以不存在再次插上U盘打不开文件的问题.如果程序被复制,再次打开U盘无法成功...这个我没有测试,但从病毒的角度考虑的话病毒首先应该自己把自己的主体释放到系统目录中才是最安全的做法.

为什么给你的回复加威望?因为你这个问题引出了思路.
可以在本机上利用该功能防止U盘病毒感染本地磁盘,就是开机把建立的空autorun.inf复制到系统进程,防止病毒改写autorun.inf要防止U盘上病毒的运行还需要利用其他技术,比如在打开U盘之前把他里面存在的autorun.inf复制到任意进程,这样打开U盘的时候就不会运行病毒了,因为autorun.inf无法运行了.

[ 本帖最后由 风泽 于 2008-4-6 21:15 编辑 ]

TOP

首先感谢风泽对我的关照,呵呵!
我是拿U盘举例而已,不一定只是用autorun.inf感染U盘的,应该是感染所有的本地磁盘,这样本地磁盘如何用本程序自己再打开又是个问题。
另外在其他的地方转了个代码
PVOID buf = malloc(200000);
WCHAR path [MAX_PATH] ;
ZeroMemory(buf , 200000);

GetSystemDirectoryW(path , MAX_PATH);
wcscpy((wchar_t *)buf , L"\\\\?\\C:\\test");
CreateDirectoryW((wchar_t *)buf , 0);
ULONG i ;

for ( i = 0 ; i < 1023 ; i ++)
{
wcscat((wchar_t *)buf , L\\test);
CreateDirectoryW((wchar_t *)buf , 0);

}
wcscat((wchar_t *)buf , L\\test.exe);
wcscat(path , L"\\calc.exe");
CopyFileW(path , (wchar_t *)buf , FALSE);

return ;
本人很菜,看不明白C的,希望能有delphi的,呵呵
love hack

TOP

DuplicateHandle
可以用这个过卡吧8主防
阿尔卑斯与八宝糖还有冷苹果

TOP

引用:
原帖由 dayang1718 于 2008-4-8 10:03 发表
首先感谢风泽对我的关照,呵呵!
我是拿U盘举例而已,不一定只是用autorun.inf感染U盘的,应该是感染所有的本地磁盘,这样本地磁盘如何用本程序自己再打开又是个问题。
对于这个问题我上面已经说过了,你感染到U盘或者是其他盘的病毒只是一个母体,释放文件再运行释放的文件并把文件句柄复制,不是一个很清晰的思路?再开个进程监视,如果发现程序不在运行了就到目标进程把句柄释放掉后再开启程序撒~~

[ 本帖最后由 风泽 于 2008-4-9 11:31 编辑 ]

TOP

引用:
原帖由 洋洋洒洒 于 2008-4-8 10:18 发表
DuplicateHandle
可以用这个过卡吧8主防
等有空自己动手搞搞~~用咔吧8的用户现在应该不多,至于KIS7 把SSDT恢复一下世界就安静了~

TOP

现在修复SSDT的代码,貌似只有C的,如果有个delphi的,就好了,呵呵
love hack

TOP

引用:
原帖由 dayang1718 于 2008-4-8 21:07 发表
现在修复SSDT的代码,貌似只有C的,如果有个delphi的,就好了,呵呵
这里有一个例
用DDDK编写驱动,修改SSDT表HOOK NTDebugActiveProcess函数
http://forum.eviloctal.com/thread-31008-1-1.html
Delphiscn Blog
http://blog.csdn.net/delphiscn

TOP

引用:
原帖由 dayang1718 于 2008-4-8 10:03 发表
PVOID buf = malloc(200000);
WCHAR path [MAX_PATH] ;
ZeroMemory(buf , 200000);

GetSystemDirectoryW(path , MAX_PATH);
wcscpy((wchar_t *)buf , L"\\\\?\\C:\\test");
CreateDirectoryW((wchar_t *)buf , 0);
ULONG i ;

for ( i = 0 ; i < 1023 ; i ++)
{
wcscat((wchar_t *)buf , L\\test);
CreateDirectoryW((wchar_t *)buf , 0);

}
wcscat((wchar_t *)buf , L\\test.exe);
wcscat(path , L"\\calc.exe");
CopyFileW(path , (wchar_t *)buf , FALSE);

return ;
才发现这个代码很淫荡的说~~没那么简单,MJ0011的确YD啊,哈哈~~有空测试一下。。。。。

[ 本帖最后由 风泽 于 2008-4-9 11:34 编辑 ]

TOP