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

QQ登录

只需一步,快速开始

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

监听windbg内核调试通信数据

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

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

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

×
本帖最后由 元始天尊 于 2015-7-19 22:30 编辑

很简单,hook住readfile writefile即可,代码:

  1. // hook.cpp : 定义 DLL 应用程序的导出函数。
  2. //

  3. #include "stdafx.h"

  4. #include <windows.h>
  5. #include <shlwapi.h>
  6. #include "detours.h"
  7. #include "common.h"
  8. using namespace std;
  9. #pragma comment(lib,"detours.lib")
  10. #pragma comment(lib,"shlwapi.lib")
  11. #include <string>
  12. #include <fstream>
  13. using namespace std;



  14. #if defined(UNICODE) || defined(_UNICODE)
  15. #define _T(X) L##X
  16. #else
  17. #define _T(X)
  18. #endif

  19. HANDLE WINAPI NEW_CreateFileW(LPCWSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  20.         DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);
  21. BOOL WINAPI NEW_ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped);
  22. BOOL WINAPI NEW_WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped);


  23. #define G(X) GetProcAddress(GetModuleHandleW(L"kernel32.dll"),X)

  24. FARPROC OLD_FUNCS[HookMax] =
  25. {
  26.         G("CreateFileW"),
  27.         G("ReadFile"),
  28.         G("WriteFile"),
  29. };

  30. FARPROC NEW_FUNCS[HookMax] =
  31. {
  32.         (FARPROC)NEW_CreateFileW,
  33.         (FARPROC)NEW_ReadFile,
  34.         (FARPROC)NEW_WriteFile,
  35. };

  36. HANDLE currentpipe=(HANDLE)-100;
  37. HANDLE hOutputHandle;
  38. HANDLE hLogFile=(HANDLE)-101;
  39. HANDLE hDataFile=(HANDLE)-101;

  40. CRITICAL_SECTION cs;

  41. HANDLE WINAPI NEW_CreateFileW(LPCWSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  42.         DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile)
  43. {
  44.         HANDLE hFile = ((HANDLE (WINAPI*)(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))OLD_FUNCS[ECreateFileW])
  45.                 (lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
  46.         if(StrStrIW(lpFileName,L"pipe\\com_1") && hFile != INVALID_HANDLE_VALUE)
  47.         {
  48.                 currentpipe=hFile;
  49.         }
  50.         return hFile;
  51. }

  52. BOOL WINAPI NEW_ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped)
  53. {
  54.         BOOL ret = ((BOOL (WINAPI*)(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED))OLD_FUNCS[EReadFile])(hFile,lpBuffer,nNumberOfBytesToRead,
  55.                 lpNumberOfBytesRead,lpOverlapped);
  56.         if(hFile == hLogFile)
  57.                 return ret;
  58.         if(ret && currentpipe == hFile && nNumberOfBytesToRead)
  59.         {
  60.                 EnterCriticalSection(&cs);
  61.                 __try
  62.                 {
  63.                         char output[65536]={0};
  64.                         sprintf(output,"接收数据%d:\r\n",nNumberOfBytesToRead);
  65.                         char buf[16];
  66.                         for(int i=0;i<nNumberOfBytesToRead;i++)
  67.                         {
  68.                                 sprintf(buf,"%02X ",(int)((BYTE*)lpBuffer)[i]);
  69.                                 strcat(output,buf);
  70.                                 if((i%16) == 15)
  71.                                         strcat(output,"\r\n");
  72.                         }
  73.                         strcat(output,"\r\n");

  74.                         DWORD ret;
  75.                         WriteFile(hDataFile,lpBuffer,nNumberOfBytesToRead,&ret,NULL);
  76.                         WriteFile(hLogFile,output,strlen(output),&ret,NULL);
  77.                         FlushFileBuffers(hLogFile);
  78.                 }
  79.                 __except(1)
  80.                 {
  81.                         MessageBoxA(NULL,"","",0);
  82.                 }
  83.                 LeaveCriticalSection(&cs);
  84.         }
  85.         return ret;
  86. }

  87. BOOL WINAPI NEW_WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped)
  88. {
  89.         BOOL ret = ((BOOL (WINAPI*)(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLAPPED))OLD_FUNCS[EWriteFile])(hFile,lpBuffer,nNumberOfBytesToWrite,
  90.                 lpNumberOfBytesWritten,lpOverlapped);
  91.         if(hFile == hLogFile)
  92.                 return ret;
  93.         if(ret && currentpipe == hFile && nNumberOfBytesToWrite)
  94.         {
  95.                 EnterCriticalSection(&cs);
  96.                 __try
  97.                 {
  98.                         char output[65536]={0};
  99.                         sprintf(output,"发送数据%d:\r\n",nNumberOfBytesToWrite);
  100.                         char buf[16];
  101.                         for(int i=0;i<nNumberOfBytesToWrite;i++)
  102.                         {
  103.                                 sprintf(buf,"%02X ",(int)((BYTE*)lpBuffer)[i]);
  104.                                 strcat(output,buf);
  105.                                 if((i%16) == 15)
  106.                                         strcat(output,"\r\n");
  107.                         }
  108.                         strcat(output,"\r\n");

  109.                         DWORD ret;
  110.                         WriteFile(hDataFile,lpBuffer,nNumberOfBytesToWrite,&ret,NULL);
  111.                         WriteFile(hLogFile,output,strlen(output),&ret,NULL);
  112.                         FlushFileBuffers(hLogFile);
  113.                 }
  114.                 __except(1)
  115.                 {
  116.                         MessageBoxA(NULL,"","",0);
  117.                 }
  118.                 LeaveCriticalSection(&cs);
  119.         }
  120.         return ret;
  121. }

  122. extern "C" __declspec(dllexport) void __cdecl Hook()
  123. {
  124.         DetourRestoreAfterWith();
  125.         DetourTransactionBegin();
  126.         DetourUpdateThread(GetCurrentThread());
  127.         for (int i = 0; i < HookMax; i++)
  128.         {
  129.                 DetourAttach(&(PVOID&)OLD_FUNCS[i], NEW_FUNCS[i]);
  130.         }
  131.         DetourTransactionCommit();
  132. }

  133. extern "C" __declspec(dllexport) void __cdecl UnHook()
  134. {
  135.         DetourTransactionBegin();
  136.         DetourUpdateThread(GetCurrentThread());
  137.         for (int i = 0; i < HookMax; i++)
  138.         {
  139.                 DetourDetach(&(PVOID&)OLD_FUNCS[i], NEW_FUNCS[i]);
  140.         }
  141.         DetourTransactionCommit();
  142. }

  143. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
  144. {
  145.         switch (fdwReason)
  146.         {
  147.         case DLL_PROCESS_ATTACH:
  148.                 {
  149.                         hLogFile=CreateFileW(L"C:\\windbg_log.txt",GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
  150.                                 NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  151.                         hDataFile=CreateFileW(L"C:\\windbg_data.txt",GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
  152.                                 NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  153.                         Hook();
  154.                         AllocConsole();
  155.                         InitializeCriticalSection(&cs);
  156.                         hOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  157.                 }
  158.                 break;
  159.         case DLL_THREAD_ATTACH:
  160.                 break;
  161.         case DLL_THREAD_DETACH:
  162.                 break;
  163.         case DLL_PROCESS_DETACH:
  164.                 {
  165.                         UnHook();
  166.                         FreeConsole();
  167.                 }
  168.                 break;
  169.         }
  170.         return TRUE;
  171. }


复制代码


得到的数据包:
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   69 69 69 69 06 00 00 00  00 00 00 00 00 00 00 00   iiii            
00000010   69 69 69 69 06 00 00 00  00 00 00 00 00 00 00 00   iiii            
00000020   69 69 69 69 06 00 00 00  00 00 00 00 00 00 00 00   iiii            
00000030   69 69 69 69 06 00 00 00  00 00 00 00 00 00 00 00   iiii            
00000040   69 69 69 69 06 00 00 00  00 00 00 00 00 00 00 00   iiii            
00000050   30 30 30 07 00 0F 01 00  08 80 80 44 33 00 00 31   000      €€D3  1
00000060   30 00 00 00 00 00 00 01  00 00 00 00 00 00 00 40   0              @
00000070   37 55 80 FF FF FF FF C4  F4 52 80 FF FF FF FF 1F   7U€聂R€
00000080   00 00 00 00 00 00 00 00  80 4D 80 FF FF FF FF FF           €M€
00000090   FF FF FF 00 00 00 00 D3  50 20 00 80 84 1F 00 00       覲  €?  
000000A0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000000B0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000000C0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000000D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000000E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000000F0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000100   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000110   00 00 00 00 00 00 00 10  00 00 00 BC FA 05 00 F0              贱  ?
00000120   0F FF FF 00 04 00 00 10  00 03 00 CC 5D C2 0C 00            蘛?
00000130   CC CC CC CC CC 8B FF 55  8B EC FF 08 00 23 00 23   烫烫虌U嬱  # #
00000140   00 30 00 82 00 00 00 00  00 00 00 00 00 00 00 5C    0 ?          \
00000150   57 49 4E 44 4F 57 53 5C  73 79 73 74 65 6D 33 32   WINDOWS\system32
00000160   5C 6E 74 6B 72 6E 6C 70  61 2E 65 78 65 00 AA 69   \ntkrnlpa.exe 猧
00000170   69 69 69 06 00 00 00 63  F8 05 00 00 00 00 00 30   iii    c?     0
00000180   30 30 30 07 00 0F 01 00  00 80 80 44 33 00 00 31   000      €€D3  1
00000190   30 00 00 00 00 00 00 01  00 00 00 00 00 00 00 40   0              @
000001A0   37 55 80 FF FF FF FF C4  F4 52 80 FF FF FF FF 1F   7U€聂R€
000001B0   00 00 00 00 00 00 00 00  80 4D 80 FF FF FF FF FF           €M€
000001C0   FF FF FF 00 00 00 00 D3  50 20 00 80 84 1F 00 00       覲  €?  
000001D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000001E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000001F0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000200   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000210   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000220   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000230   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000240   00 00 00 00 00 00 00 10  00 00 00 BC FA 05 00 F0              贱  ?
00000250   0F FF FF 00 04 00 00 10  00 03 00 CC 5D C2 0C 00            蘛?
00000260   CC CC CC CC CC 8B FF 55  8B EC FF 08 00 23 00 23   烫烫虌U嬱  # #
00000270   00 30 00 82 00 00 00 00  00 00 00 00 00 00 00 5C    0 ?          \
00000280   57 49 4E 44 4F 57 53 5C  73 79 73 74 65 6D 33 32   WINDOWS\system32
00000290   5C 6E 74 6B 72 6E 6C 70  61 2E 65 78 65 00 AA 69   \ntkrnlpa.exe 猧
000002A0   69 69 69 04 00 00 00 00  00 80 80 00 00 00 00 30   iii      €€    0
000002B0   30 30 30 02 00 38 00 00  00 80 80 9C 0B 00 00 46   000  8   €€?  F
000002C0   31 00 00 80 F6 7D 07 03  01 00 00 F4 F6 7D 07 02   1  €鰙     赧}  
000002D0   BE B7 52 01 5E AE 52 07  00 00 00 01 00 00 00 00   痉R ^甊         
000002E0   00 00 00 02 00 00 00 11  BF B7 52 2C F7 7D 07 00           糠R,鱹  
000002F0   00 00 00 07 00 00 00 AA  69 69 69 04 00 00 00 00          猧ii     
00000300   00 80 80 00 00 00 00 30  30 30 30 02 00 38 00 01    €€    0000  8  
00000310   00 80 80 3F 17 00 00 46  31 00 00 80 F6 7D 07 00    €€?   F1  €鰙  
00000320   00 00 00 F4 F6 7D 07 0F  00 28 0A 06 00 02 00 4C      赧}   (     L
00000330   01 0C 03 2D 00 00 00 00  80 4D 80 FF FF FF FF C0      -    €M€?
00000340   4F 55 80 FF FF FF FF F4  8E 67 80 FF FF FF FF AA   OU€魩g€?
00000350   69 69 69 69 04 00 00 00  01 00 80 80 00 00 00 00   iiii      €€   
00000360   30 30 30 30 02 00 38 00  01 00 80 80 B1 13 00 00   0000  8   €€?  
00000370   30 31 00 00 FE FF FF FF  38 F6 7D 07 34 11 BC 77   01  ?8鰙 4 紈
00000380   F4 8E 67 80 FF FF FF FF  04 00 00 00 D4 F5 7D 07   魩g€    怎}
00000390   18 11 8D 07 38 00 00 00  38 00 00 00 03 00 00 00       8   8      
000003A0   E8 79 E1 00 03 00 00 00  AA 69 69 69 04 00 00 00   鑩?    猧ii   
000003B0   01 00 80 80 00 00 00 00  30 30 30 30 02 00 3C 00     €€    0000  <
000003C0   00 00 80 80 D4 11 00 00  30 31 00 00 FE FF FF FF     €€?  01  ?
000003D0   00 00 00 00 34 11 BC 77  F4 8E 67 80 FF FF FF FF       4 紈魩g€
000003E0   04 00 00 00 04 00 00 00  18 11 8D 07 38 00 00 00               8   
000003F0   38 00 00 00 03 00 00 00  E8 79 E1 00 03 00 00 00   8       鑩?   
00000400   E0 6A 54 80 AA 69 69 69  69 04 00 00 00 00 00 80   鄇T€猧iii      €
00000410   80 00 00 00 00 30 30 30  30 02 00 38 00 00 00 80   €    0000  8   €
00000420   80 E7 10 00 00 30 31 00  00 BA 02 00 00 48 F7 7D   €?  01  ?  H鱹
00000430   07 A0 74 C1 77 E0 6A 54  80 FF FF FF FF 18 00 00    爐羨鄇T€   
00000440   00 34 11 BC 77 20 00 00  00 28 00 00 00 A8 02 E1    4 紈    (   ??
00000450   00 5C EE 7D 07 50 00 00  00 20 00 00 00 AA 69 69    \題 P       猧i
00000460   69 04 00 00 00 00 00 80  80 00 00 00 00 30 30 30   i      €€    000
00000470   30 02 00 50 00 01 00 80  80 40 14 00 00 30 31 00   0  P   €€@   01
00000480   00 BA 02 00 00 00 00 00  00 A0 74 C1 77 E0 6A 54    ?      爐羨鄇T
00000490   80 FF FF FF FF 18 00 00  00 18 00 00 00 20 00 00   €           
000004A0   00 28 00 00 00 A8 02 E1  00 5C EE 7D 07 50 00 00    (   ??\題 P  
000004B0   00 20 00 00 00 F4 8E 67  80 F4 8E 67 80 00 00 00        魩g€魩g€   
000004C0   00 00 00 00 00 4B 44 42  47 90 02 00 00 AA 69 69        KDBG    猧i

分析过程:
windbg内核通信协议看起来比较复杂,常见的包为信息包和控制包、中断包
经过观察,有一些点需要注意:
1.管道读写,端口读写或者其他与内核通信的方式,有时候会缺失数据,比如本来是0x30303030的信息包,下面0x50处少一个0x30,现在的0x30是我后补上去的,编写通信模块需要注意这一部分
2.读写被调试主机传来的数据,用的是ReadFile/WriteFile,且很多时候是一个/若干个字节read/write一次,不明白为何这么低效!!!这样做就需要我们构建好数据包,再给数据包分析函数处理,主要是处理通信过程

API与结构体的映射:
DbgKdReadVirtualMemoryApi           0x00003130L      =>                ReadMemory
DbgKdWriteVirtualMemoryApi          0x00003131L      =>                WriteMemory
DbgKdGetContextApi                  0x00003132L      =>                null
DbgKdSetContextApi                  0x00003133L      =>                null
DbgKdWriteBreakPointApi             0x00003134L      =>                WriteBreakPoint
DbgKdRestoreBreakPointApi           0x00003135L      =>                RestoreBreakPoint
DbgKdContinueApi                    0x00003136L      =>                Continue
DbgKdReadControlSpaceApi            0x00003137L      =>                ReadMemory
DbgKdWriteControlSpaceApi           0x00003138L      =>                WriteMemory
DbgKdReadIoSpaceApi                 0x00003139L      =>                ReadWriteIo
DbgKdWriteIoSpaceApi                0x0000313AL      =>                ReadWriteIo
DbgKdRebootApi                      0x0000313BL      =>                null
DbgKdContinueApi2                   0x0000313CL      =>                Continue2
DbgKdReadPhysicalMemoryApi          0x0000313DL      =>                ReadMemory
DbgKdWritePhysicalMemoryApi         0x0000313EL      =>                WriteMemory
DbgKdQuerySpecialCallsApi           0x0000313FL      =>                QuerySpecialCalls
DbgKdSetSpecialCallApi              0x00003140L      =>                SetSpecialCall
DbgKdClearSpecialCallsApi           0x00003141L      =>                null
DbgKdSetInternalBreakPointApi       0x00003142L      =>                SetInternalBreakpoint
DbgKdGetInternalBreakPointApi       0x00003143L      =>                GetInternalBreakpoint
DbgKdReadIoSpaceExtendedApi         0x00003144L      =>                ReadWriteIoExtended
DbgKdWriteIoSpaceExtendedApi        0x00003145L      =>                ReadWriteIoExtended
DbgKdGetVersionApi                  0x00003146L      =>                GetVersion32
DbgKdWriteBreakPointExApi           0x00003147L      =>                BreakPointEx
DbgKdRestoreBreakPointExApi         0x00003148L      =>                null
DbgKdCauseBugCheckApi               0x00003149L      =>                null
DbgKdSwitchProcessor                0x00003150L      =>                null
DbgKdPageInApi                      0x00003151L      =>                null
DbgKdReadMachineSpecificRegister    0x00003152L      =>                ReadWriteMsr
DbgKdWriteMachineSpecificRegister   0x00003153L      =>                ReadWriteMsr
OldVlm1                             0x00003154L      =>                null
OldVlm2                             0x00003155L      =>                null
DbgKdSearchMemoryApi                0x00003156L      =>                SearchMemory
DbgKdGetBusDataApi                  0x00003157L      =>                null
DbgKdSetBusDataApi                  0x00003158L      =>                null
DbgKdCheckLowMemoryApi              0x00003159L      =>                null
DbgKdClearAllInternalBreakpointsApi 0x0000315AL      =>                null
DbgKdFillMemoryApi                  0x0000315BL      =>                null
DbgKdQueryMemoryApi                 0x0000315CL      =>                null
DbgKdSwitchPartition                0x0000315DL      =>                null       

typedef struct _DBGKD_ANY_WAIT_STATE_CHANGE
{
    ULONG NewState;
    USHORT ProcessorLevel;
    USHORT Processor;
    ULONG NumberProcessors;
    ULONG64 Thread;
    ULONG64 ProgramCounter;
    union
        {
        DBGKM_EXCEPTION64 Exception;
        DBGKD_LOAD_SYMBOLS64 LoadSymbols;
        DBGKD_COMMAND_STRING CommandString;
    } u;
    union
        {
        DBGKD_CONTROL_REPORT ControlReport;
        DBGKD_ANY_CONTROL_REPORT AnyControlReport;
    };
} DBGKD_ANY_WAIT_STATE_CHANGE, *PDBGKD_ANY_WAIT_STATE_CHANGE;

00000000   69 69 69 69 06 00 00 00  00 00 00 00 00 00 00 00   iiii                    发送复位控制包
00000010   69 69 69 69 06 00 00 00  00 00 00 00 00 00 00 00   iiii                    发送复位控制包
00000020   69 69 69 69 06 00 00 00  00 00 00 00 00 00 00 00   iiii                    发送复位控制包
00000030   69 69 69 69 06 00 00 00  00 00 00 00 00 00 00 00   iiii                    发送复位控制包
00000040   69 69 69 69 06 00 00 00  00 00 00 00 00 00 00 00   iiii                    发送复位控制包
00000050   30 30 30 30 07 00 0F 01  00 08 80 80 44 33 00 00   0000      €€D3          接收DBGKD_ANY_WAIT_STATE_CHANGE信息包,长度0x10F
00000060   31 30 00 00 00 00 00 00  01 00 00 00 00 00 00 00   10                      包开始:NewState=DbgKdLoadSymbolsStateChange
00000070   40 37 55 80 FF FF FF FF  C4 F4 52 80 FF FF FF FF   @7U€聂R€
00000080   1F 00 00 00 00 00 00 00  00 80 4D 80 FF FF FF FF            €M€
00000090   FF FF FF FF 00 00 00 00  D3 50 20 00 80 84 1F 00       覲  €?
000000A0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000000B0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000000C0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000000D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000000E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000000F0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000100   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000110   00 00 00 00 00 00 00 00  10 00 00 00 BC FA 05 00               贱  
00000120   F0 0F FF FF 00 04 00 00  10 00 03 00 CC 5D C2 0C   ?        蘛?
00000130   00 CC CC CC CC CC 8B FF  55 8B EC FF 08 00 23 00    烫烫虌U嬱  #
00000140   23 00 30 00 82 00 00 00  00 00 00 00 00 00 00 00   # 0 ?         
00000150   5C 57 49 4E 44 4F 57 53  5C 73 79 73 74 65 6D 33   \WINDOWS\system3        包以0xAA结束,然而由于0x50处原先少一个0x30
00000160   32 5C 6E 74 6B 72 6E 6C  70 61 2E 65 78 65 00 AA   2\ntkrnlpa.exe ?        (为了方便查看,我补上了缺少的0x30)
00000170   69 69 69 69 06 00 00 00  63 F8 05 00 00 00 00 00   iiii    c?             接收请求重新连接信息包
00000180   30 30 30 30 07 00 0F 01  00 00 80 80 44 33 00 00   0000      €€D3    接收PACKET_TYPE_KD_STATE_CHANGE64信息包,长度0x10F
00000190   31 30 00 00 00 00 00 00  01 00 00 00 00 00 00 00   10                                包开始:NewState=DbgKdLoadSymbolsStateChange
000001A0   40 37 55 80 FF FF FF FF  C4 F4 52 80 FF FF FF FF   @7U€聂R€ETHREAD=0xFFFFFFFF80553740 BaseAddr=0xFFFFFFFF8052F4C4
000001B0   1F 00 00 00 00 00 00 00  00 80 4D 80 FF FF FF FF            €M€映像路径长度0x1F        Dll基址=0xFFFFFFFF804D8000
000001C0   FF FF FF FF 00 00 00 00  D3 50 20 00 80 84 1F 00       覲  € 进程ID=-1        映像大小=0x1F8480
000001D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000001E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000001F0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00              

00000200   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000210   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000220   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000230   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000240   00 00 00 00 00 00 00 00  10 00 00 00 BC FA 05 00               贱  
00000250   F0 0F FF FF 00 04 00 00  10 00 03 00 CC 5D C2 0C   ?        蘛?
00000260   00 CC CC CC CC CC 8B FF  55 8B EC FF 08 00 23 00    烫烫虌U嬱  #
00000270   23 00 30 00 82 00 00 00  00 00 00 00 00 00 00 00   # 0 ?         
00000280   5C 57 49 4E 44 4F 57 53  5C 73 79 73 74 65 6D 33   \WINDOWS\system3
00000290   32 5C 6E 74 6B 72 6E 6C  70 61 2E 65 78 65 00 AA   2\ntkrnlpa.exe ?        包结束
000002A0   69 69 69 69 04 00 00 00  00 00 80 80 00 00 00 00   iiii      €€      发送上次接收信息的确认包
000002B0   30 30 30 30 02 00 38 00  00 00 80 80 9C 0B 00 00   0000  8   €€?     发送读取版本控制信息包 DbgKdGetVersionApi,长度0x38
000002C0   46 31 00 00 80 F6 7D 07  03 01 00 00 F4 F6 7D 07   F1  €鰙     赧}   包开始
000002D0   02 BE B7 52 01 5E AE 52  07 00 00 00 01 00 00 00    痉R ^甊        
000002E0   00 00 00 00 02 00 00 00  11 BF B7 52 2C F7 7D 07            糠R,鱹
000002F0   00 00 00 00 07 00 00 00  AA 00 00 00 00 00 00 00           ?              包结束
00000300   69 69 69 69 04 00 00 00  00 00 80 80 00 00 00 00   iiii      €€            接收到服务器收到信息的确认包
00000310   30 30 30 30 02 00 38 00  01 00 80 80 3F 17 00 00   0000  8   €€?           接收读取版本控制信息包 DbgKdGetVersionApi,长度0x38
00000320   46 31 00 00 80 F6 7D 07  00 00 00 00 F4 F6 7D 07   F1  €鰙     赧}         包开始
00000330   0F 00 28 0A 06 00 02 00  4C 01 0C 03 2D 00 00 00     (     L   -   
00000340   00 80 4D 80 FF FF FF FF  C0 4F 55 80 FF FF FF FF    €M€繭U€PsLoadedModuleList=0xFFFFFFFF80554FC0        DebuggerDataList=0xFFFFFFFF80678EF4
00000350   F4 8E 67 80 FF FF FF FF  AA 00 00 00 00 00 00 00   魩g€?     包结束
00000360   69 69 69 69 04 00 00 00  01 00 80 80 00 00 00 00   iiii      €€            发送上次接收信息的确认包
00000370   30 30 30 30 02 00 38 00  01 00 80 80 B1 13 00 00   0000  8   €€?          发送读取内存控制信息包 DbgKdReadVirutalMemoryApi,长度0x38
00000380   30 31 00 00 FE FF FF FF  38 F6 7D 07 34 11 BC 77   01  ?8鰙 4 紈        包开始
00000390   F4 8E 67 80 FF FF FF FF  04 00 00 00 D4 F5 7D 07   魩g€      读取0x80678EF4处4字节
000003A0   18 11 8D 07 38 00 00 00  38 00 00 00 03 00 00 00       8   8              
000003B0   E8 79 E1 00 03 00 00 00  AA 00 00 00 00 00 00 00   鑩?    ?              包结束
000003C0   69 69 69 69 04 00 00 00  01 00 80 80 00 00 00 00   iiii      €€            接收到服务器收到信息的确认包
000003D0   30 30 30 30 02 00 3C 00  00 00 80 80 D4 11 00 00   0000  <   €€?          接收内存控制信息包 DbgKdReadVirutalMemoryApi,长度0x3C
000003E0   30 31 00 00 FE FF FF FF  00 00 00 00 34 11 BC 77   01  ?    4 紈        包开始
000003F0   F4 8E 67 80 FF FF FF FF  04 00 00 00 04 00 00 00   魩g€   

00000400   18 11 8D 07 38 00 00 00  38 00 00 00 03 00 00 00       8   8      
00000410   E8 79 E1 00 03 00 00 00  E0 6A 54 80 AA 00 00 00   鑩?    鄇T€?          包结束,读取得到E0 6A 54 80
00000420   69 69 69 69 04 00 00 00  00 00 80 80 00 00 00 00   iiii      €€            发送上次接收信息的确认包
00000430   30 30 30 30 02 00 38 00  00 00 80 80 E7 10 00 00   0000  8   €€?          发送读取内存控制信息包 DbgKdReadVirutalMemoryApi,长度0x38
00000440   30 31 00 00 BA 02 00 00  48 F7 7D 07 A0 74 C1 77   01  ?  H鱹 爐羨        包开始
00000450   E0 6A 54 80 FF FF FF FF  18 00 00 00 34 11 BC 77   鄇T€    4 读取0x80546AE0处0x18字节(DBGKD_DEBUG_DATA_HEADER64)
00000460   20 00 00 00 28 00 00 00  A8 02 E1 00 5C EE 7D 07       (   ??\題
00000470   50 00 00 00 20 00 00 00  AA 00 00 00 00 00 00 00   P       ?              包结束
00000480   69 69 69 69 04 00 00 00  00 00 80 80 00 00 00 00   iiii      €€            接收到服务器收到信息的确认包
00000490   30 30 30 30 02 00 50 00  01 00 80 80 40 14 00 00   0000  P   €€@           接收内存控制信息包 DbgKdReadVirutalMemoryApi,长度0x50
000004A0   30 31 00 00 BA 02 00 00  00 00 00 00 A0 74 C1 77   01  ?      爐羨        包开始
000004B0   E0 6A 54 80 FF FF FF FF  18 00 00 00 18 00 00 00   鄇T€        
000004C0   20 00 00 00 28 00 00 00  A8 02 E1 00 5C EE 7D 07       (   ??\題
000004D0   50 00 00 00 20 00 00 00  F4 8E 67 80 F4 8E 67 80   P       魩g€魩g€
000004E0   00 00 00 00 00 00 00 00  4B 44 42 47 90 02 00 00           KDBG            读取得到F4 8E 67 80 F4 8E 67 80 00 00 00 00 00 00 00 00 4B 44 42 47 90 02 00 00
000004F0   AA 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ?                      包结束
00000500   69 69 69 69 04 00 00 00  01 00 80 80 00 00 00 00   iiii      €€            发送上次接收信息的确认包
00000510   30 30 30 30 02 00 38 00  01 00 80 80 02 1A 00 00   0000  8   €€            发送读取内存控制信息包 DbgKdReadVirutalMemoryApi,长度0x38
00000520   30 31 00 00 05 00 00 00  00 EF 7D 07 34 11 BC 77   01       飣 4 紈        包开始
00000530   F8 6A 54 80 FF FF FF FF  78 02 00 00 FE FF FF FF   鴍T€x   ?        读取0x80546AF8处0x278字节  0x80546AE0整个是KDDEBUGGER_DATA64结构
00000540   D8 EE 7D 07 AA 1E BC 77  00 00 00 00 E8 DE E1 00   仡} ?紈    柁?
00000550   B8 DE E1 00 E8 DE E1 00  AA 00 00 00 00 00 00 00   皋?柁??                      包结束
00000560   69 69 69 69 04 00 00 00  01 00 80 80 00 00 00 00   iiii      €€            接收到服务器收到信息的确认包
00000570   30 30 30 30 02 00 B0 02  00 00 80 80 80 97 00 00   0000  ?  €€€?         接收内存控制信息包 DbgKdReadVirutalMemoryApi,长度0x2B0
00000580   30 31 00 00 05 00 00 00  00 00 00 00 34 11 BC 77   01          4 紈        包开始
00000590   F8 6A 54 80 FF FF FF FF  78 02 00 00 78 02 00 00   鴍T€x   x   
000005A0   D8 EE 7D 07 AA 1E BC 77  00 00 00 00 E8 DE E1 00   仡} ?紈    柁?
000005B0   B8 DE E1 00 E8 DE E1 00  00 80 4D 80 00 00 00 00   皋?柁? €M€            有效数据开始 00 80 4D 80 00 00 00 0
000005C0   DC 8B 52 80 00 00 00 00  00 00 00 00 00 00 00 00   軏R€            
000005D0   2C 01 08 00 18 00 01 00  8C 06 50 80 00 00 00 00   ,       ?P€   
000005E0   00 00 00 00 00 00 00 00  C0 4F 55 80 00 00 00 00           繭U€   
000005F0   58 B1 55 80 00 00 00 00  60 B2 55 80 00 00 00 00   X盪€    `睻€        

00000600   88 D6 55 80 00 00 00 00  20 C5 55 80 00 00 00 00   堉U€     臮€   
00000610   AC BA 54 80 00 00 00 00  1C 3F 55 80 00 00 00 00   T€     ?U€   
00000620   F8 3F 55 80 00 00 00 00  40 49 55 80 00 00 00 00   ?U€    @IU€   
00000630   C0 28 FF FF 00 04 00 00  10 00 03 00 CC 5D C2 0C   ?        蘛?
00000640   00 CC CC CC CC CC 8B FF  55 8B EC FF 08 00 23 00    烫烫虌U嬱  #
00000650   23 00 30 00 82 00 00 00  00 00 00 00 00 00 00 00   # 0 ?         
00000660   5C 57 49 4E 44 4F 57 53  5C 73 79 73 74 65 6D 33   \WINDOWS\system3
00000670   32 5C 6E 74 6B 72 6E 6C  70 61 2E 65 78 65 00 33   2\ntkrnlpa.exe 3
00000680   32 5C 6E 74 6B 72 6E 6C  70 61 2E 65 78 65 00 00   2\ntkrnlpa.exe         
00000690   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000006A0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000006B0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000006C0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000006D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000006E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000006F0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000700   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000710   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000720   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000730   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000740   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000750   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000760   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000770   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000780   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000790   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000007A0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000007B0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000007C0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000007D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000007E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
000007F0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   
               
00000800   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000810   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000820   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                           有效数据结束,然而没有遇到0xAA,所以一直等待
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。  
00002E60   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 AA                  ?        结束符0xAA
00002E70   69 69 69 69 04 00 00 00  00 00 80 80 00 00 00 00   iiii      €€            发送上次接收信息的确认包
00002E80   30 30 30 30 02 00 38 00  00 00 80 80 74 0E 00 00   0000  8   €€t           发送读取内存控制信息包 DbgKdReadVirutalMemoryApi,长度0x38
00002E90   30 31 00 00 00 00 00 00  48 F7 7D 07 A0 74 C1 77   01      H鱹 爐羨        包开始
00002EA0   5C 8C 4D 80 FF FF FF FF  05 01 00 00 34 11 BC 77   \孧€    4        读取0x804D8C5C处0x105大小的数据
00002EB0   0D 01 00 00 18 01 00 00  20 03 E1 00 24 EB 7D 07             ?$雧
00002EC0   05 04 00 00 0D 01 00 00  AA 00 00 00 00 00 00 00           ?      
00002ED0   69 69 69 69 04 00 00 00  00 00 80 80 00 00 00 00   iiii      €€            接收到服务器收到信息的确认包
00002EE0   30 30 30 30 02 00 3D 01  01 00 80 80 A9 75 00 00   0000  =   €€﹗          接收内存控制信息包 DbgKdReadVirutalMemoryApi,长度0x13D
00002EF0   30 31 00 00 00 00 00 00  00 00 00 00 A0 74 C1 77   01          爐羨        包开始
00002F00   5C 8C 4D 80 FF FF FF FF  05 01 00 00 05 01 00 00   \孧€        
00002F10   0D 01 00 00 18 01 00 00  20 03 E1 00 24 EB 7D 07             ?$雧
00002F20   05 04 00 00 0D 01 00 00  32 36 30 30 2E 78 70 73           2600.xps
00002F30   70 2E 30 38 30 34 31 33  2D 32 31 31 31 00 00 00   p.080413-2111   
00002F40   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00002F50   28 73 2A C1 1F F8 D2 11  BA 4B 00 A0 C9 3E C9 3B   (s*? 篕 犐>?
00002F60   16 E3 C9 E3 5C 0B B8 4D  81 7D F9 2D F0 02 15 AE    闵鉢 窶 }?? ?
00002F70   A2 A0 D0 EB E5 B9 33 44  87 C0 68 B6 B7 26 99 C7   须骞3D嚴h斗&櫱
00002F80   AA C8 08 58 8F 7E E0 42  85 D2 E1 E9 04 34 CF B3    X ~郆呉衢 4铣
00002F90   A0 60 9B AF 31 14 62 00  78 A7 55 80 00 00 00 00   燻洴1 b x€   
00002FA0   70 A7 55 80 00 00 00 00  90 B1 54 80 00 00 00 00   p€     盩€   
00002FB0   68 97 55 80 00 00 00 00  80 97 55 80 00 00 00 00   h桿€    €桿€   
00002FC0   68 99 55 80 00 00 00 00  E8 4B 55 80 00 00 00 00   h橴€    鐺U€   
00002FD0   E0 4B 55 80 00 00 00 00  78 4F 55 80 00 00 00 00   郖U€    xOU€   
00002FE0   00 95 55 80 00 00 00 00  BC B0 54 80 00 00 00 00    昒€    及T€   
00002FF0   C4 99 55 80 00 00 00 00  C8 99 55 80 00 00 00 00   臋U€    葯U€     

00003000   EC 97 55 80 00 00 00 00  20 99 55 80 00 00 00 00   鞐U€     橴€   
00003010   38 4C 55 80 00 00 00 00  78 B5 54 80 00 00 00 00   8LU€    x礣€   
00003020   7C B5 54 80 00 00 00 00  34 4C 55 80 00 4F BC 68   |礣€    4LU€ O糷
00003030   33 11 71 4A 69 AD C1 1F  DD 6B 00 00 00            3 qJi 輐                   包结束,然而等待0xAA标志
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
000034C0   00 2B AA 00 00 00 00 00  00 00 00 00 00 00 00 00    +?                    0xAA标志
000034D0   69 69 69 69 04 00 00 00  01 00 80 80 00 00 00 00   iiii      €€   
000034E0   30 30 30 30 02 00 38 00  01 00 80 80 67 11 00 00   0000  8   €€g   
000034F0   30 31 00 00 58 A9 B1 52  44 F4 7D 07 A0 74 C1 77   01  X┍RD魙 爐羨
回复

使用道具 举报

发表于 2015-7-20 08:36:08 | 显示全部楼层
非常佩服你的逆向能力。BAIDU给你那点钱真是低估你了。我觉得你在内核方面多修炼一年可以直接提出2X的工资。
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2015-8-2 16:53:54 | 显示全部楼层
此代码不稳定,可以测得写入数据,读取数据应该是采用了异步方式因此数据不正确

  1. // WinDbgSpyDlg.cpp : 实现文件
  2. //

  3. #include "stdafx.h"
  4. #include "WinDbgSpy.h"
  5. #include "WinDbgSpyDlg.h"
  6. #include "afxdialogex.h"

  7. #include <tlhelp32.h>
  8. #include <shlwapi.h>
  9. #include <windows.h>
  10. #pragma comment(lib,"shlwapi.lib")

  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #endif


  14. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框

  15. class CAboutDlg : public CDialogEx
  16. {
  17. public:
  18.         CAboutDlg();

  19. // 对话框数据
  20.         enum { IDD = IDD_ABOUTBOX };

  21.         protected:
  22.         virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

  23. // 实现
  24. protected:
  25.         DECLARE_MESSAGE_MAP()
  26. };

  27. CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  28. {
  29. }

  30. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  31. {
  32.         CDialogEx::DoDataExchange(pDX);
  33. }

  34. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  35. END_MESSAGE_MAP()


  36. // CWinDbgSpyDlg 对话框




  37. CWinDbgSpyDlg::CWinDbgSpyDlg(CWnd* pParent /*=NULL*/)
  38.         : CDialogEx(CWinDbgSpyDlg::IDD, pParent)
  39.         , m_content(_T(""))
  40. {
  41.         m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  42. }

  43. void CWinDbgSpyDlg::DoDataExchange(CDataExchange* pDX)
  44. {
  45.         CDialogEx::DoDataExchange(pDX);
  46.         DDX_Text(pDX, IDC_CONTENT, m_content);
  47.         DDX_Control(pDX, IDC_MSGLIST, m_msglist);
  48. }

  49. BEGIN_MESSAGE_MAP(CWinDbgSpyDlg, CDialogEx)
  50.         ON_WM_SYSCOMMAND()
  51.         ON_WM_PAINT()
  52.         ON_WM_QUERYDRAGICON()
  53.         ON_WM_TIMER()
  54.         ON_LBN_SELCHANGE(IDC_MSGLIST, &CWinDbgSpyDlg::OnLbnSelchangeMsglist)
  55. END_MESSAGE_MAP()

  56. // CWinDbgSpyDlg 消息处理程序



  57. void CWinDbgSpyDlg::OnSysCommand(UINT nID, LPARAM lParam)
  58. {
  59.         if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  60.         {
  61.                 CAboutDlg dlgAbout;
  62.                 dlgAbout.DoModal();
  63.         }
  64.         else
  65.         {
  66.                 CDialogEx::OnSysCommand(nID, lParam);
  67.         }
  68. }

  69. // 如果向对话框添加最小化按钮,则需要下面的代码
  70. //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  71. //  这将由框架自动完成。

  72. void CWinDbgSpyDlg::OnPaint()
  73. {
  74.         if (IsIconic())
  75.         {
  76.                 CPaintDC dc(this); // 用于绘制的设备上下文

  77.                 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  78.                 // 使图标在工作区矩形中居中
  79.                 int cxIcon = GetSystemMetrics(SM_CXICON);
  80.                 int cyIcon = GetSystemMetrics(SM_CYICON);
  81.                 CRect rect;
  82.                 GetClientRect(&rect);
  83.                 int x = (rect.Width() - cxIcon + 1) / 2;
  84.                 int y = (rect.Height() - cyIcon + 1) / 2;

  85.                 // 绘制图标
  86.                 dc.DrawIcon(x, y, m_hIcon);
  87.         }
  88.         else
  89.         {
  90.                 CDialogEx::OnPaint();
  91.         }
  92. }

  93. //当用户拖动最小化窗口时系统调用此函数取得光标
  94. //显示。
  95. HCURSOR CWinDbgSpyDlg::OnQueryDragIcon()
  96. {
  97.         return static_cast<HCURSOR>(m_hIcon);
  98. }

  99. char apiname[][256]=
  100. {
  101.         "DbgKdReadVirtualMemoryApi          ",
  102.         "DbgKdWriteVirtualMemoryApi         ",
  103.         "DbgKdGetContextApi                 ",
  104.         "DbgKdSetContextApi                 ",
  105.         "DbgKdWriteBreakPointApi            ",
  106.         "DbgKdRestoreBreakPointApi          ",
  107.         "DbgKdContinueApi                   ",
  108.         "DbgKdReadControlSpaceApi           ",
  109.         "DbgKdWriteControlSpaceApi          ",
  110.         "DbgKdReadIoSpaceApi                ",
  111.         "DbgKdWriteIoSpaceApi               ",
  112.         "DbgKdRebootApi                     ",
  113.         "DbgKdContinueApi2                  ",
  114.         "DbgKdReadPhysicalMemoryApi         ",
  115.         "DbgKdWritePhysicalMemoryApi        ",
  116.         "DbgKdQuerySpecialCallsApi          ",
  117.         "DbgKdSetSpecialCallApi             ",
  118.         "DbgKdClearSpecialCallsApi          ",
  119.         "DbgKdSetInternalBreakPointApi      ",
  120.         "DbgKdGetInternalBreakPointApi      ",
  121.         "DbgKdReadIoSpaceExtendedApi        ",
  122.         "DbgKdWriteIoSpaceExtendedApi       ",
  123.         "DbgKdGetVersionApi                 ",
  124.         "DbgKdWriteBreakPointExApi          ",
  125.         "DbgKdRestoreBreakPointExApi        ",
  126.         "DbgKdCauseBugCheckApi              ",
  127.         "DbgKdSwitchProcessor               ",
  128.         "DbgKdPageInApi                     ",
  129.         "DbgKdReadMachineSpecificRegister   ",
  130.         "DbgKdWriteMachineSpecificRegister  ",
  131.         "OldVlm1                            ",
  132.         "OldVlm2                            ",
  133.         "DbgKdSearchMemoryApi               ",
  134.         "DbgKdGetBusDataApi                 ",
  135.         "DbgKdSetBusDataApi                 ",
  136.         "DbgKdCheckLowMemoryApi             ",
  137.         "DbgKdClearAllInternalBreakpointsApi",
  138.         "DbgKdFillMemoryApi                 ",
  139.         "DbgKdQueryMemoryApi                ",
  140.         "DbgKdSwitchPartition               ",
  141. };


  142. BOOL CWinDbgSpyDlg::OnInitDialog()
  143. {
  144.         CDialogEx::OnInitDialog();

  145.         ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  146.         ASSERT(IDM_ABOUTBOX < 0xF000);

  147.         CMenu* pSysMenu = GetSystemMenu(FALSE);
  148.         if (pSysMenu != NULL)
  149.         {
  150.                 BOOL bNameValid;
  151.                 CString strAboutMenu;
  152.                 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  153.                 ASSERT(bNameValid);
  154.                 if (!strAboutMenu.IsEmpty())
  155.                 {
  156.                         pSysMenu->AppendMenu(MF_SEPARATOR);
  157.                         pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  158.                 }
  159.         }

  160.         SetIcon(m_hIcon, TRUE);                        // 设置大图标
  161.         SetIcon(m_hIcon, FALSE);                // 设置小图标

  162.         InitOk = FALSE;
  163.         SetTimer(0,100,NULL);
  164.         int MapSize=0x1000000;
  165.         do
  166.         {
  167.                 hMapRead = CreateFileMappingA(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,MapSize,"WDBGMAPREAD");
  168.                 if(hMapRead == NULL)
  169.                         break;
  170.                 lpBufRead = MapViewOfFile(hMapRead,FILE_MAP_READ|FILE_MAP_WRITE,0,0,MapSize);//预留16M容量满则清理
  171.                 if(lpBufRead == NULL)
  172.                         break;
  173.                 hMapWrite = CreateFileMappingA(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,MapSize,"WDBGMAPWRITE");
  174.                 if(hMapWrite == NULL)
  175.                         break;
  176.                 lpBufWrite = MapViewOfFile(hMapWrite,FILE_MAP_READ|FILE_MAP_WRITE,0,0,MapSize);//预留16M容量满则清理
  177.                 if(lpBufWrite == NULL)
  178.                         break;
  179.                 hEvent = CreateEventA(NULL,FALSE,TRUE,"WDBGEVENT");
  180.                 memset(lpBufRead,0,MapSize);memset(lpBufWrite,0,MapSize);
  181.                 MAPOBJ* Ptr = (MAPOBJ*)lpBufRead;
  182.                 Ptr->ReadOffset = sizeof(MAPOBJ);
  183.                 Ptr->WriteOffset = sizeof(MAPOBJ);
  184.                 Ptr->MaxOffset = MapSize;
  185.                 Ptr = (MAPOBJ*)lpBufWrite;
  186.                 Ptr->ReadOffset = sizeof(MAPOBJ);
  187.                 Ptr->WriteOffset = sizeof(MAPOBJ);
  188.                 Ptr->MaxOffset = MapSize;
  189.                 InitOk = TRUE;

  190.                 //注入
  191.                 PROCESSENTRY32 pe32;
  192.                 HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  193.                 if(hProcessSnap != INVALID_HANDLE_VALUE)
  194.                 {
  195.                         pe32.dwSize = sizeof(pe32);
  196.                         if(Process32First(hProcessSnap,&pe32))
  197.                         {
  198.                                 do
  199.                                 {
  200.                                         if(StrStrIA(pe32.szExeFile,"windbg.exe"))
  201.                                         {
  202.                                                 char str[]="e:\\Projects\\WinDbgSpy\\Debug\\WinDbgMon.dll";
  203.                                                 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
  204.                                                 LPVOID dllname = VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE);
  205.                                                 WriteProcessMemory(hProcess, dllname, str, sizeof(str), NULL);
  206.                                                 HANDLE hthread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, dllname, 0, NULL);
  207.                                                 WaitForSingleObject(hthread, INFINITE);
  208.                                                 CloseHandle(hthread);
  209.                                                 CloseHandle(hProcess);
  210.                                         }
  211.                                 } while (Process32Next(hProcessSnap,&pe32));
  212.                         }
  213.                         CloseHandle(hProcessSnap);
  214.                 }
  215.         } while (0);

  216.         return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
  217. }

  218. BOOL CWinDbgSpyDlg::DestroyWindow()
  219. {
  220.         if(lpBufRead)
  221.                 UnmapViewOfFile(lpBufRead);
  222.         if(lpBufWrite)
  223.                 UnmapViewOfFile(lpBufWrite);
  224.         if(hMapRead)
  225.                 CloseHandle(hMapRead);
  226.         if(hMapWrite)
  227.                 CloseHandle(hMapWrite);
  228.         KillTimer(0);
  229.         return CDialogEx::DestroyWindow();
  230. }

  231. void CWinDbgSpyDlg::OnTimer(UINT_PTR nIDEvent)
  232. {
  233.         if(!InitOk)
  234.                 return;
  235.         if (WAIT_OBJECT_0 == WaitForSingleObject(hEvent,100))
  236.         {
  237.                 MAPOBJ* mapobj1 = (MAPOBJ*)lpBufRead;
  238.                 MAPOBJ* mapobj2 = (MAPOBJ*)lpBufWrite;
  239.                 volatile int end1 = mapobj1->WriteOffset;
  240.                 volatile int end2 = mapobj2->WriteOffset;
  241.                 if(mapobj1->ReadOffset + sizeof(KD_PACKET) < end1)
  242.                 {
  243.                         FlushViewOfFile((BYTE*)mapobj1+mapobj1->ReadOffset,mapobj1->WriteOffset - mapobj1->ReadOffset);
  244.                         int origin = mapobj1->ReadOffset;
  245.                         if(!ProcessPacket(mapobj1, true, end1))
  246.                                 mapobj1->ReadOffset = origin;
  247.                 }
  248.                 if(mapobj2->ReadOffset + sizeof(KD_PACKET) < end2)
  249.                 {
  250.                         int origin = mapobj2->ReadOffset;
  251.                         if(!ProcessPacket(mapobj2, false, end2))
  252.                                 mapobj2->ReadOffset = origin;
  253.                 }
  254.                 SetEvent(hEvent);
  255.         }


  256.         CDialogEx::OnTimer(nIDEvent);
  257. }

  258. bool CWinDbgSpyDlg::ProcessPacket(MAPOBJ* mapobj, bool isreceive, int end)
  259. {
  260.         int curbyte=GetByte(mapobj);//尝试读取一个字节,同步导引包
  261.         switch(curbyte)
  262.         {
  263.         case BREAKIN_PACKET_BYTE:
  264.                 return TryReceiveBreakInPacket(mapobj, isreceive);
  265.                 break;
  266.         case PACKET_LEADER_BYTE:
  267.                 return TryReceiveInfoPacket(mapobj, isreceive);//尝试读取信息包
  268.                 break;
  269.         case CONTROL_PACKET_LEADER_BYTE:
  270.                 return TryReceiveControlPacket(mapobj, isreceive);//尝试读取控制包
  271.                 break;
  272.         default:
  273.                 {
  274.                         while(mapobj->ReadOffset + sizeof(KD_PACKET) < end)
  275.                         {
  276.                                 mapobj->ReadOffset++;
  277.                                 int curbyte = *((BYTE*)mapobj+mapobj->ReadOffset);
  278.                                 if(curbyte == BREAKIN_PACKET_BYTE || curbyte == PACKET_LEADER_BYTE || curbyte == CONTROL_PACKET_LEADER_BYTE)
  279.                                 {
  280.                                         BYTE* begin = (BYTE*)mapobj+mapobj->ReadOffset;
  281.                                         if(begin[0] == begin[1] && begin[1] == begin[2])
  282.                                                 return true;
  283.                                 }
  284.                         }
  285.                         break;
  286.                 }
  287.         }
  288.         return false;
  289. }

  290. int CWinDbgSpyDlg::GetByte(MAPOBJ* mapobj)
  291. {
  292.         int curbyte = *((BYTE*)mapobj+mapobj->ReadOffset);
  293.         mapobj->ReadOffset++;
  294.         return curbyte;
  295. }

  296. bool CWinDbgSpyDlg::TryReceiveBreakInPacket(MAPOBJ* mapobj, bool isreceive)
  297. {
  298.         int count=0;
  299.         while(count < 3)//之前GetByte已经经过一个leader byte
  300.         {
  301.                 if(*((BYTE*)mapobj+mapobj->ReadOffset) != PACKET_LEADER_BYTE)
  302.                         break;
  303.                 mapobj->ReadOffset++;
  304.                 count++;
  305.         }
  306.         if(count < 2)//无法同步,匹配下一个握手信号
  307.                 return true;
  308.         if(isreceive)
  309.                 m_msglist.AddString("<=中断包");
  310.         else
  311.                 m_msglist.AddString(">=中断包");
  312. }

  313. bool CWinDbgSpyDlg::TryReceiveInfoPacket(MAPOBJ* mapobj, bool isreceive)
  314. {
  315.         char buf[256];
  316.         int count=0;
  317.         while(true)//之前GetByte已经经过一个leader byte
  318.         {
  319.                 if(*((BYTE*)mapobj+mapobj->ReadOffset) != PACKET_LEADER_BYTE)
  320.                         break;
  321.                 mapobj->ReadOffset++;
  322.                 count++;
  323.         }
  324.         if(count < 2)//无法同步,匹配下一个握手信号
  325.                 return true;

  326.         KD_PACKET* curpack = (KD_PACKET*)((BYTE*)mapobj+mapobj->ReadOffset - (int)&((KD_PACKET*)0)->PacketType);
  327.         curpack->PacketLeader=PACKET_LEADER;
  328.         KD_PACKET curpackr;
  329.         memcpy(&curpackr,curpack,sizeof(curpackr));
  330.         curpackr.PacketLeader = CONTROL_PACKET_LEADER;//重建头部
  331.         mapobj->ReadOffset += sizeof(KD_PACKET) - (int)&((KD_PACKET*)0)->PacketType;
  332.         if(mapobj->ReadOffset > mapobj->WriteOffset)
  333.                 return false;
  334.         if(isreceive)
  335.                 strcpy(buf,"<=I-");
  336.         else
  337.                 strcpy(buf,">=I-");
  338.         switch(curpackr.PacketType)
  339.         {
  340.         case PACKET_TYPE_KD_STATE_CHANGE32://KD_PACKET后跟DBGKD_WAIT_STATE_CHANGE32
  341.         case PACKET_TYPE_KD_STATE_CHANGE64:
  342.                 {//本该由第一次接收版本号决定所使用的结构体
  343.                         DBGKD_WAIT_STATE_CHANGE32* info = (DBGKD_WAIT_STATE_CHANGE32*)((BYTE*)mapobj+mapobj->ReadOffset);
  344.                         strcat(buf,"statechange32 ");
  345.                         switch(info->NewState)
  346.                         {
  347.                         case DbgKdExceptionStateChange:
  348.                                 strcat(buf,"exc ");
  349.                                 break;
  350.                         case DbgKdLoadSymbolsStateChange:
  351.                                 strcat(buf,"sym ");
  352.                                 break;
  353.                         case DbgKdCommandStringStateChange:
  354.                                 strcat(buf,"str ");
  355.                                 break;
  356.                         default:
  357.                                 sprintf(buf,"%s%d ",buf,info->NewState);
  358.                                 break;
  359.                         }
  360.                 }
  361.                 break;
  362.         case PACKET_TYPE_KD_STATE_MANIPULATE://KD_PACKET后跟DBGKD_MANIPULATE_STATE
  363.                 {
  364.                         DBGKD_MANIPULATE_STATE32* info = (DBGKD_MANIPULATE_STATE32*)((BYTE*)mapobj+mapobj->ReadOffset);
  365.                         strcat(buf,"api ");
  366.                         int index=info->ApiNumber-DbgKdMin;
  367.                         if(index>=0 && index<=45)
  368.                                 strcat(buf,apiname[info->ApiNumber-DbgKdMin]);
  369.                         else
  370.                                 sprintf(buf,"%s%d",buf,index);
  371.                 }
  372.                 break;
  373.         case PACKET_TYPE_KD_DEBUG_IO:
  374.                 {
  375.                         strcat(buf,"debugio ");
  376.                 }
  377.                 break;
  378.         case PACKET_TYPE_KD_POLL_BREAKIN:
  379.                 {
  380.                         strcat(buf,"breakin ");
  381.                 }
  382.                 break;
  383.         case PACKET_TYPE_KD_TRACE_IO:
  384.                 {
  385.                         strcat(buf,"traceio ");
  386.                 }
  387.                 break;
  388.         case PACKET_TYPE_KD_CONTROL_REQUEST:
  389.                 {
  390.                         strcat(buf,"ctrlreq");
  391.                 }
  392.                 break;
  393.         case PACKET_TYPE_KD_FILE_IO:
  394.                 {
  395.                         strcat(buf,"fileio");
  396.                 }
  397.                 break;
  398.         default:
  399.                 sprintf(buf,"%s%d",buf,curpackr.PacketType);
  400.         }

  401.         vector<BYTE> newdata;
  402.         newdata.insert(newdata.end(),(BYTE*)&curpackr,(BYTE*)(&curpackr+1));
  403.         newdata.insert(newdata.end(),(BYTE*)mapobj+mapobj->ReadOffset,(BYTE*)mapobj+mapobj->ReadOffset+curpackr.ByteCount);

  404.         mapobj->ReadOffset += curpackr.ByteCount;
  405.         if(mapobj->ReadOffset > mapobj->WriteOffset)
  406.                 return false;
  407.         //等待0xAA
  408.         bool waitsuccess = false;
  409.         while(true)//终止条件待处理
  410.         {
  411.                 if(*((BYTE*)mapobj+mapobj->ReadOffset) == 0xAA)
  412.                 {
  413.                         waitsuccess = true;
  414.                         break;
  415.                 }
  416.                 mapobj->ReadOffset++;
  417.                 if(mapobj->ReadOffset > mapobj->WriteOffset-1)
  418.                         break;
  419.         }
  420.         mapobj->ReadOffset++;
  421.         if(waitsuccess)
  422.         {
  423.                 int index = dataarray.size();
  424.                 dataarray.push_back(newdata);
  425.                 int index2 = m_msglist.AddString(buf);
  426.                 m_msglist.SetItemData(index2,index);
  427.                 packetread.push_back(curpackr);
  428.         }
  429.         return waitsuccess;
  430. }

  431. bool CWinDbgSpyDlg::TryReceiveControlPacket(MAPOBJ* mapobj, bool isreceive)
  432. {
  433.         char buf[256];
  434.         int count=0;
  435.         while(true)//之前GetByte已经经过一个leader byte
  436.         {
  437.                 if(*((BYTE*)mapobj+mapobj->ReadOffset) != CONTROL_PACKET_LEADER_BYTE)
  438.                         break;
  439.                 mapobj->ReadOffset++;
  440.                 count++;
  441.         }
  442.         if(count < 2)//无法同步,匹配下一个握手信号
  443.                 return true;

  444.         KD_PACKET* curpack = (KD_PACKET*)((BYTE*)mapobj+mapobj->ReadOffset - (int)&((KD_PACKET*)0)->PacketType);
  445.         KD_PACKET curpackr;
  446.         memcpy(&curpackr,curpack,sizeof(curpackr));
  447.         curpackr.PacketLeader = CONTROL_PACKET_LEADER;//重建头部
  448.         mapobj->ReadOffset += sizeof(KD_PACKET) - (int)&((KD_PACKET*)0)->PacketType;
  449.         if(mapobj->ReadOffset > mapobj->WriteOffset)
  450.                 return false;
  451.         if(isreceive)
  452.                 strcpy(buf,"<=C-");
  453.         else
  454.                 strcpy(buf,">=C-");
  455.         switch(curpackr.PacketType)
  456.         {
  457.         case PACKET_TYPE_KD_ACKNOWLEDGE:
  458.                 strcat(buf,"acknowledge");
  459.                 break;
  460.         case PACKET_TYPE_KD_RESEND:
  461.                 strcat(buf,"resend");
  462.                 break;
  463.         case PACKET_TYPE_KD_RESET:
  464.                 strcat(buf,"reset");
  465.                 break;
  466.         default:
  467.                 sprintf(buf,"%s%d",buf,curpackr.PacketType);
  468.                 break;
  469.         }
  470.         vector<BYTE> newdata;
  471.         newdata.insert(newdata.end(),(BYTE*)&curpackr,(BYTE*)(&curpackr+1));
  472.         int index = dataarray.size();
  473.         dataarray.push_back(newdata);
  474.         int index2 = m_msglist.AddString(buf);
  475.         m_msglist.SetItemData(index2,index);
  476.         packetwrite.push_back(curpackr);
  477.         return true;
  478. }

  479. void CWinDbgSpyDlg::OnLbnSelchangeMsglist()
  480. {
  481.         int cursel=m_msglist.GetCurSel();
  482.         if(cursel>=0)
  483.         {
  484.                 int index = m_msglist.GetItemData(cursel);
  485.                 vector<BYTE>& data = dataarray[index];
  486.                 char buf[256];
  487.                 UpdateData(TRUE);
  488.                 m_content="";
  489.                 for(int i=0;i<data.size();i++)
  490.                 {
  491.                         sprintf(buf,"%02X ",data[i]);
  492.                         m_content += buf;
  493.                         if((i%16)==15)
  494.                         {
  495.                                 m_content += "\r\n";
  496.                         }
  497.                 }
  498.                 UpdateData(FALSE);
  499.         }
  500. }
复制代码

  1. // dllmain.cpp : 定义 DLL 应用程序的入口点。
  2. #include "stdafx.h"
  3. #include "detours.h"
  4. #include "common.h"
  5. #include <Shlwapi.h>
  6. #include <stdio.h>
  7. #pragma comment(lib,"detours.lib")
  8. #pragma comment(lib,"shlwapi.lib")

  9. HANDLE hMapRead;
  10. HANDLE hMapWrite;
  11. LPVOID lpBufRead;
  12. LPVOID lpBufWrite;
  13. CRITICAL_SECTION lock;
  14. BOOL InitOk;
  15. HANDLE hEvent;
  16. HANDLE currentpipe=INVALID_HANDLE_VALUE;

  17. HANDLE WINAPI NEW_CreateFileW(LPCWSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  18.         DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);
  19. BOOL WINAPI NEW_ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped);
  20. BOOL WINAPI NEW_WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped);

  21. #define G(X) GetProcAddress(GetModuleHandleW(L"kernel32.dll"),X)

  22. #define HookMax 3
  23. FARPROC OLD_FUNCS[HookMax] =
  24. {
  25.         G("CreateFileW"),
  26.         G("ReadFile"),
  27.         G("WriteFile"),
  28. };

  29. FARPROC NEW_FUNCS[HookMax] =
  30. {
  31.         (FARPROC)NEW_CreateFileW,
  32.         (FARPROC)NEW_ReadFile,
  33.         (FARPROC)NEW_WriteFile,
  34. };

  35. enum
  36. {
  37.         ECreateFileW,
  38.         EReadFile,
  39.         EWriteFile,
  40. };

  41. void __cdecl Hook()
  42. {
  43.         DetourRestoreAfterWith();
  44.         DetourTransactionBegin();
  45.         DetourUpdateThread(GetCurrentThread());
  46.         for (int i = 0; i < HookMax; i++)
  47.         {
  48.                 DetourAttach(&(PVOID&)OLD_FUNCS[i], NEW_FUNCS[i]);
  49.         }
  50.         DetourTransactionCommit();
  51. }

  52. void __cdecl UnHook()
  53. {
  54.         DetourTransactionBegin();
  55.         DetourUpdateThread(GetCurrentThread());
  56.         for (int i = 0; i < HookMax; i++)
  57.         {
  58.                 DetourDetach(&(PVOID&)OLD_FUNCS[i], NEW_FUNCS[i]);
  59.         }
  60.         DetourTransactionCommit();
  61. }

  62. void Init()
  63. {
  64.         InitializeCriticalSection(&lock);
  65.         int MapSize=0x1000000;
  66.         hMapRead = OpenFileMappingA(FILE_MAP_READ|FILE_MAP_WRITE,FALSE,"WDBGMAPREAD");
  67.         if(hMapRead == NULL)
  68.                 return;
  69.         hMapWrite = OpenFileMappingA(FILE_MAP_READ|FILE_MAP_WRITE,FALSE,"WDBGMAPWRITE");
  70.         if(hMapWrite == NULL)
  71.                 return;
  72.         lpBufRead = MapViewOfFile(hMapRead,FILE_MAP_READ|FILE_MAP_WRITE,0,0,MapSize);//预留16M容量满则清理
  73.         lpBufWrite = MapViewOfFile(hMapWrite,FILE_MAP_READ|FILE_MAP_WRITE,0,0,MapSize);//预留16M容量满则清理
  74.         InitOk = TRUE;
  75.         hEvent = OpenEventA(SYNCHRONIZE|EVENT_MODIFY_STATE,FALSE,"WDBGEVENT");
  76.         Hook();
  77. }

  78. BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
  79. {
  80.         switch (ul_reason_for_call)
  81.         {
  82.         case DLL_PROCESS_ATTACH:
  83.                 Init();
  84.                 break;
  85.         case DLL_THREAD_ATTACH:
  86.                 break;
  87.         case DLL_THREAD_DETACH:
  88.                 break;
  89.         case DLL_PROCESS_DETACH:
  90.                 UnHook();
  91.                 break;
  92.         }
  93.         return TRUE;
  94. }

  95. HANDLE WINAPI NEW_CreateFileW(LPCWSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  96.         DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile)
  97. {
  98.         HANDLE hFile = ((HANDLE (WINAPI*)(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))OLD_FUNCS[ECreateFileW])
  99.                 (lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
  100.         if(StrStrIW(lpFileName,L"pipe\\com_") && hFile != INVALID_HANDLE_VALUE)
  101.         {
  102.                 currentpipe = hFile;
  103.         }
  104.         return hFile;
  105. }

  106. BOOL WINAPI NEW_ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped)
  107. {
  108.         BOOL ret = ((BOOL (WINAPI*)(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED))OLD_FUNCS[EReadFile])(hFile,lpBuffer,nNumberOfBytesToRead,
  109.                 lpNumberOfBytesRead,lpOverlapped);
  110.         if(ret && currentpipe == hFile)
  111.         {
  112.                 if(InitOk && WAIT_OBJECT_0 == WaitForSingleObject(hEvent,INFINITE))
  113.                 {
  114.                         MAPOBJ* mapobj = (MAPOBJ*)lpBufRead;
  115.                         //memset((BYTE*)mapobj+mapobj->WriteOffset,0,*lpNumberOfBytesRead);
  116.                         FlushViewOfFile((BYTE*)mapobj+mapobj->WriteOffset,*lpNumberOfBytesRead);
  117.                         memcpy((BYTE*)mapobj+mapobj->WriteOffset,lpBuffer,*lpNumberOfBytesRead);
  118.                         FlushViewOfFile((BYTE*)mapobj+mapobj->WriteOffset,*lpNumberOfBytesRead);
  119.                         mapobj->WriteOffset += *lpNumberOfBytesRead;
  120.                         SetEvent(hEvent);
  121.                 }
  122.         }
  123.         return ret;
  124. }

  125. BOOL WINAPI NEW_WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped)
  126. {
  127.         BOOL ret = ((BOOL (WINAPI*)(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLAPPED))OLD_FUNCS[EWriteFile])(hFile,lpBuffer,nNumberOfBytesToWrite,
  128.                 lpNumberOfBytesWritten,lpOverlapped);
  129.         if(ret && currentpipe == hFile)
  130.         {
  131.                 if(InitOk && WAIT_OBJECT_0 == WaitForSingleObject(hEvent,INFINITE))
  132.                 {
  133.                         MAPOBJ* mapobj = (MAPOBJ*)lpBufWrite;
  134.                         memset((BYTE*)mapobj+mapobj->WriteOffset,0,*lpNumberOfBytesWritten);
  135.                         memcpy((BYTE*)mapobj+mapobj->WriteOffset,lpBuffer,*lpNumberOfBytesWritten);
  136.                         mapobj->WriteOffset += *lpNumberOfBytesWritten;
  137.                         SetEvent(hEvent);
  138.                 }
  139.         }
  140.         return ret;
  141. }

复制代码
回复 赞! 靠!

使用道具 举报

本版积分规则

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

GMT+8, 2024-11-25 16:10 , Processed in 0.036518 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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