找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3748|回复: 0

输出所有进程NtCreateFile行为

[复制链接]
发表于 2015-7-19 00:47:42 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
群里说共享进程空间使用Mutex会误写,然而我没有发现这一情况,下面的代码大部分是这位兄弟的
用于输出
  1. // showntcreatefile.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include <windows.h>
  5. #include<Tlhelp32.h>
  6. #include <Shlwapi.h>
  7. #pragma comment(lib,"shlwapi.lib")

  8. struct LOG
  9. {
  10.         int dwCount;
  11.         int NextFreeOffset;
  12.         char Buffer[65536];
  13. };

  14. int _tmain(int argc, _TCHAR* argv[])
  15. {
  16.         HANDLE ghDataLock=CreateMutexA(0,FALSE,"hookntcreatefile");
  17.         HMODULE hmod= LoadLibraryA("E:\\Projects\\testntcreatefile\\Debug\\testntcreatefile.dll");
  18.         LOG* gpData=(LOG*)GetProcAddress(hmod,"gSharedData");
  19.        
  20.         HANDLE hProcessSnap;
  21.         PROCESSENTRY32 pe32;
  22.         hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  23.         if (hProcessSnap != INVALID_HANDLE_VALUE)
  24.         {
  25.                 pe32.dwSize = sizeof(pe32);
  26.                 if (Process32First(hProcessSnap, &pe32))
  27.                 {
  28.                         do
  29.                         {
  30. //                                if (StrStrI(pe32.szExeFile, _T("notepad")))
  31.                                 {
  32.                                         char str[] = "E:\\Projects\\testntcreatefile\\Debug\\testntcreatefile.dll";
  33.                                         HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
  34.                                         LPVOID dllname = VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE);
  35.                                         WriteProcessMemory(hProcess, dllname, str, sizeof(str), NULL);
  36.                                         HANDLE hthread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, dllname, 0, NULL);
  37.                                         WaitForSingleObject(hthread, INFINITE);
  38.                                         CloseHandle(hthread);
  39.                                         CloseHandle(hProcess);
  40.                                 }
  41.                         } while (Process32Next(hProcessSnap, &pe32));
  42.                 }
  43.                 CloseHandle(hProcessSnap);
  44.         }

  45.         while(true)
  46.         {
  47.                 char* pBuffer,*pSlot;
  48.                 DWORD dwWaitResult = WaitForSingleObject( ghDataLock, INFINITE ),dwSize;
  49.                 if( dwWaitResult == WAIT_OBJECT_0 )
  50.                 {
  51.                         pBuffer = gpData->Buffer;
  52.                         while( gpData->NextFreeOffset  )
  53.                         {
  54.                                 printf("%s\n", pBuffer);
  55.                                 pSlot = pBuffer;
  56.                                 dwSize = strlen(pBuffer) + 2;
  57.                                 pBuffer = (LPSTR) (pBuffer + dwSize);
  58.                                 ZeroMemory( pSlot, dwSize);
  59.                                 gpData->NextFreeOffset -= dwSize;
  60.                                 gpData->dwCount--;
  61.                         }
  62.                 }
  63.                 ReleaseMutex( ghDataLock );
  64.         }
  65.         return 0;
  66. }

复制代码


注入dll:
  1. // dllmain.cpp : 定义 DLL 应用程序的入口点。
  2. #include "stdafx.h"

  3. #include <windows.h>
  4. #include <stdio.h>
  5. #include "detours.h"
  6. #pragma comment(lib,"detours.lib")

  7. struct LOG
  8. {
  9.         int dwCount;
  10.         int NextFreeOffset;
  11.         char Buffer[65536];
  12. };

  13. #pragma data_seg("Shared")
  14. extern "C"
  15. {
  16.         __declspec(allocate("Shared"), dllexport) LOG gSharedData;
  17.         __declspec(allocate("Shared"), dllexport) DWORD g_nCount;
  18. };
  19. #pragma data_seg()
  20. #pragma comment(linker,"/SECTION:Shared,RWS")

  21. typedef ULONG NTSTATUS;

  22. typedef struct _UNICODE_STRING
  23. {
  24.         USHORT Length;
  25.         USHORT MaximumLength;
  26.         PWSTR  Buffer;
  27. } UNICODE_STRING,*PUNICODE_STRING;

  28. typedef struct _OBJECT_ATTRIBUTES
  29. {
  30.         ULONG Length;
  31.         HANDLE RootDirectory;
  32.         PUNICODE_STRING ObjName;
  33.         ULONG Attributes;
  34.         PVOID SecurityDescriptor;        // Points to type SECURITY_DESCRIPTOR
  35.         PVOID SecurityQualityOfService;  // Points to type SECURITY_QUALITY_OF_SERVICE
  36. } OBJECT_ATTRIBUTES,*POBJECT_ATTRIBUTES;

  37. typedef struct _IO_STATUS_BLOCK
  38. {
  39.         union
  40.         {
  41.                 NTSTATUS Status;
  42.                 PVOID Pointer;
  43.         };
  44.         ULONG_PTR Information;
  45. } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

  46. FARPROC OLD_NtCreateFile=GetProcAddress(GetModuleHandleA("ntdll.dll"),"NtCreateFile");
  47. HANDLE hDataLock=NULL;

  48. LONG  WINAPI Chunk(PHANDLE ph, ULONG AccessMask, POBJECT_ATTRIBUTES obj, PIO_STATUS_BLOCK ioblk, PLARGE_INTEGER AllocSize,
  49.         ULONG FileAttr, ULONG ShareAccess, ULONG Disposition, ULONG Options, PVOID EaBuffer, ULONG EaLength)
  50. {
  51. #define MAX_BUF_LEN 512
  52. #define FILE_DIRECTORY_FILE                     0x00000001
  53. #define FILE_OPEN                       0x00000001
  54.         CHAR szBuffer[MAX_BUF_LEN];
  55.         CHAR szFile[MAX_PATH] = { 0 };
  56.         CHAR szExeName[MAX_PATH];
  57.         CHAR szTimeFormat[100];
  58.         SYSTEMTIME sysTime;
  59.         LONG status ;
  60.         LPSTR psz;
  61.         int length = 0;
  62.         DWORD dwSize, dwWaitResult;

  63.         GetLocalTime( &sysTime );
  64.         sprintf( szTimeFormat, "%02d.%02d.%02d.%04d", sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds );
  65.         status = ((LONG (WINAPI*)(PHANDLE,ULONG,POBJECT_ATTRIBUTES,PIO_STATUS_BLOCK,PLARGE_INTEGER,ULONG,ULONG,ULONG,ULONG,PVOID,ULONG))OLD_NtCreateFile)
  66.                 ( ph, AccessMask, obj, ioblk, AllocSize,FileAttr, ShareAccess, Disposition, Options, EaBuffer, EaLength );
  67.         InterlockedIncrement( &g_nCount );
  68.         if( 0 == status  && obj && obj->ObjName && obj->ObjName->Buffer)
  69.         {
  70.                 GetModuleFileNameA( NULL, szExeName, MAX_PATH);
  71.                 OutputDebugStringW(obj->ObjName->Buffer);
  72.                 psz = strrchr( szExeName, '\\' );
  73.                 length = WideCharToMultiByte( CP_ACP, 0, obj->ObjName->Buffer, obj->ObjName->Length / sizeof(WCHAR),szFile, sizeof(szFile), NULL, NULL );
  74.                 sprintf( szBuffer, "%s %s %s %s : %s", szTimeFormat, psz+1, Disposition & FILE_OPEN ? "Open" : "Create",
  75.                         Options & FILE_DIRECTORY_FILE ? "Directory" : "File",szFile );

  76.                 dwWaitResult = WaitForSingleObject( hDataLock, INFINITE );
  77.                 if( dwWaitResult == WAIT_OBJECT_0 )
  78.                 {
  79.                         psz = gSharedData.Buffer;
  80.                         dwSize = gSharedData.NextFreeOffset;
  81.                         psz += dwSize;
  82.                         dwSize = strlen(szBuffer) + 2;
  83.                         memcpy( psz, szBuffer, dwSize - 1);
  84.                         gSharedData.NextFreeOffset += dwSize;
  85.                         gSharedData.dwCount++;
  86.                 }
  87.                 ReleaseMutex( hDataLock );       
  88.         }
  89.         return status;
  90. }


  91. BOOL APIENTRY DllMain( HMODULE hModule,
  92.                        DWORD  ul_reason_for_call,
  93.                        LPVOID lpReserved
  94.                                          )
  95. {
  96.         switch (ul_reason_for_call)
  97.         {
  98.         case DLL_PROCESS_ATTACH:
  99.                 if(g_nCount)
  100.                 {
  101.                         DetourRestoreAfterWith();
  102.                         DetourTransactionBegin();
  103.                         DetourUpdateThread(GetCurrentThread());
  104.                         DetourAttach(&(PVOID&)OLD_NtCreateFile, Chunk);
  105.                         DetourTransactionCommit();       
  106.                 }
  107.                 hDataLock=OpenMutexA(SYNCHRONIZE|MUTEX_MODIFY_STATE,FALSE,"hookntcreatefile");
  108.                 InterlockedIncrement(&g_nCount);
  109.                 break;
  110.         case DLL_THREAD_ATTACH:
  111.         case DLL_THREAD_DETACH:
  112.         case DLL_PROCESS_DETACH:
  113.                 break;
  114.         }
  115.         return TRUE;
  116. }

复制代码
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 14:04 , Processed in 0.032502 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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