ReadProcessMemory error

Тема в разделе "WASM.WIN32", создана пользователем baga, 21 фев 2008.

  1. baga

    baga New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    16
    Делаю простую утилиту для дампа памяти:

    Код (Text):
    1. #include <windows.h>
    2. #include <tlhelp32.h>
    3. #include <tchar.h>
    4. #include <stdio.h>
    5.  
    6. #define CHUNK_SIZE (4 * 1024 * 1024)
    7. #define OUTPUT_DIR "pdump_out"
    8.  
    9. static VOID PrintError(TCHAR *msg);
    10. static BOOL GetProcByName(DWORD *pdwPid, const char *pcName);
    11. static BOOL DumpProcess(DWORD dwPid);
    12. static BOOL DumpModule(HANDLE hProcess, MODULEENTRY32 *me32, BYTE *pBuf);
    13.  
    14. VOID PrintError(TCHAR *msg)
    15. {
    16.   DWORD eNum;
    17.   TCHAR sysMsg[512];
    18.   TCHAR *p;
    19.  
    20.     eNum = GetLastError();
    21.     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
    22.         NULL, eNum,
    23.         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    24.         sysMsg, 256, NULL);
    25.  
    26.     p = sysMsg;
    27.     while((*p > 31) || (*p == 9))
    28.         ++p;
    29.  
    30.     do
    31.     {
    32.         *p-- = 0;
    33.     }
    34.     while((p >= sysMsg) && ((*p == '.') || (*p < 33)));
    35.  
    36.     _tprintf(TEXT("\n  WARNING: %s failed with error %d (%s)"), msg, eNum, sysMsg);
    37. }
    38.  
    39. BOOL GetProcByName(DWORD *pdwPid, const char *pcName)
    40. {
    41.     HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    42.     if(hProcessSnap == INVALID_HANDLE_VALUE)
    43.     {
    44.         PrintError("CreateToolhelp32Snapshot");
    45.         return FALSE;
    46.     }
    47.  
    48.     PROCESSENTRY32 pe32;
    49.     memset(&pe32, 0, sizeof(pe32));
    50.     pe32.dwSize = sizeof(pe32);
    51.  
    52.     if(!Process32First(hProcessSnap, &pe32))
    53.     {
    54.         PrintError("Process32First");
    55.         CloseHandle(hProcessSnap);
    56.         return FALSE;
    57.     }
    58.  
    59.     do
    60.     {
    61.         if(strcmp(pcName, pe32.szExeFile) == 0)
    62.         {
    63.             printf("=====================================================");
    64.             _tprintf(TEXT("\nPROCESS NAME:  %s"), pe32.szExeFile);
    65.             printf("\n-----------------------------------------------------");
    66.             printf("\n  Process ID        = 0x%08X", pe32.th32ProcessID);
    67.             printf("\n  Thread count      = %d", pe32.cntThreads);
    68.             printf("\n  Parent process ID = 0x%08X", pe32.th32ParentProcessID);
    69.             printf("\n  Priority base     = %d", pe32.pcPriClassBase);
    70.  
    71.             *pdwPid = pe32.th32ProcessID;
    72.             CloseHandle(hProcessSnap);
    73.             return TRUE;
    74.         }
    75.     }
    76.     while(Process32Next(hProcessSnap, &pe32));
    77.  
    78.     CloseHandle(hProcessSnap);
    79.     return FALSE;
    80. }
    81.  
    82. BOOL DumpProcess(DWORD dwPid)
    83. {
    84.     HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
    85.     if(!hProcess)
    86.     {
    87.         PrintError("OpenProcess");
    88.         return FALSE;
    89.     }
    90.  
    91.     HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPid);
    92.     if(!hModuleSnap)
    93.     {
    94.         PrintError("CreateToolhelp32Snapshot");
    95.         return FALSE;
    96.     }
    97.  
    98.     BYTE *pBuf = (BYTE *)HeapAlloc(GetProcessHeap(), 0, CHUNK_SIZE);
    99.     if(!pBuf)
    100.     {
    101.         PrintError("HeapAlloc");
    102.         CloseHandle(hProcess);
    103.         return FALSE;
    104.     }
    105.  
    106.     MODULEENTRY32 me32;
    107.     memset(&me32, 0, sizeof(me32));
    108.     me32.dwSize = sizeof(me32);
    109.  
    110.     if(!Module32First(hModuleSnap, &me32))
    111.     {
    112.         PrintError("Module32First");
    113.         HeapFree(GetProcessHeap(), 0, pBuf);
    114.         CloseHandle(hModuleSnap);
    115.         CloseHandle(hProcess);
    116.         return FALSE;
    117.     }
    118.  
    119.     do
    120.     {
    121.         _tprintf(TEXT("\n\n     MODULE NAME:     %s"), me32.szModule);
    122.         _tprintf(TEXT("\n     Executable     = %s"), me32.szExePath);
    123.         printf("\n     Process ID     = 0x%08X", me32.th32ProcessID);
    124.         printf("\n     Ref count (g)  = 0x%04X", me32.GlblcntUsage);
    125.         printf("\n     Ref count (p)  = 0x%04X", me32.ProccntUsage);
    126.         printf("\n     Base address   = 0x%08X", (DWORD)me32.modBaseAddr);
    127.         printf("\n     Base size      = %d", me32.modBaseSize);
    128.  
    129.         DumpModule(hProcess, &me32, pBuf);
    130.     }
    131.     while(Module32Next(hModuleSnap, &me32));
    132.  
    133.     HeapFree(GetProcessHeap(), 0, pBuf);
    134.     CloseHandle(hModuleSnap);
    135.     CloseHandle(hProcess);
    136.     return TRUE;
    137. }
    138.  
    139. BOOL DumpModule(HANDLE hProcess, MODULEENTRY32 *me32, BYTE *pBuf)
    140. {
    141.     char szFileName[_MAX_PATH];
    142.     strcpy_s(szFileName, sizeof(szFileName), OUTPUT_DIR);
    143.     strcat_s(szFileName, sizeof(szFileName), "\\");
    144.     strcat_s(szFileName, sizeof(szFileName), me32->szModule);
    145.     strcat_s(szFileName, sizeof(szFileName), ".d");
    146.  
    147.     HANDLE hFile = CreateFile(
    148.         szFileName,
    149.         FILE_ALL_ACCESS,
    150.         FILE_SHARE_READ,
    151.         NULL,
    152.         CREATE_ALWAYS,
    153.         FILE_ATTRIBUTE_NORMAL,
    154.         NULL);
    155.     if(!hFile)
    156.     {
    157.         PrintError("CreateFile");
    158.         return FALSE;
    159.     }
    160.  
    161.     BYTE *pBaseAddr = me32->modBaseAddr;
    162.     DWORD dwBaseSize = me32->modBaseSize;
    163.     DWORD dwPos = 0;
    164.     DWORD dwBytesToRead;
    165.     DWORD dwRes;
    166.  
    167.     while(dwPos < dwBaseSize)
    168.     {
    169.         DWORD dwDelta = dwBaseSize - dwPos;
    170.  
    171.         if(dwDelta >= CHUNK_SIZE)
    172.             dwBytesToRead = CHUNK_SIZE;
    173.         else
    174.             dwBytesToRead = dwDelta;
    175.  
    176.         if(!ReadProcessMemory(hProcess,
    177.             pBaseAddr + dwPos, pBuf + dwPos, dwBytesToRead, &dwRes))
    178.         {
    179.             PrintError("ReadProcessMemory");
    180.             CloseHandle(hFile);
    181.             return FALSE;
    182.         }
    183.  
    184.         if(!WriteFile(hFile, pBuf + dwPos, dwBytesToRead, &dwRes, NULL))
    185.         {
    186.             PrintError("WriteFile");
    187.             CloseHandle(hFile);
    188.             return FALSE;
    189.         }
    190.  
    191.         dwPos += dwBytesToRead;
    192.     }
    193.  
    194.     CloseHandle(hFile);
    195.     return TRUE;
    196. }
    197.  
    198. void main(int argc, char *argv[])
    199. {
    200.     if(argc < 2)
    201.     {
    202.         printf("Usage: pdump <ProcessName>\n");
    203.         return;
    204.     }
    205.  
    206.     CreateDirectory(OUTPUT_DIR, NULL);
    207.  
    208.     DWORD dwPid;
    209.     if(GetProcByName(&dwPid, argv[1]))
    210.     {
    211.         DumpProcess(dwPid);
    212.     }
    213. }
    Проблема заключается в том, что иногда ReadProcessMemory возвращает error 998 (Invalid access to memory location). Например:

    Код (Text):
    1. =====================================================
    2. PROCESS NAME:  qip.exe
    3. -----------------------------------------------------
    4.   Process ID        = 0x00000BB4
    5.   Thread count      = 9
    6.   Parent process ID = 0x00000228
    7.   Priority base     = 8
    8.  
    9.      MODULE NAME:     qip.exe
    10.      Executable     = C:\Program Files\QIP\qip.exe
    11.      Process ID     = 0x00000BB4
    12.      Ref count (g)  = 0xFFFF
    13.      Ref count (p)  = 0xFFFF
    14.      Base address   = 0x00400000
    15.      Base size      = 3297280
    16.  
    17.      MODULE NAME:     ntdll.dll
    18.      Executable     = C:\WINDOWS\system32\ntdll.dll
    19.      Process ID     = 0x00000BB4
    20.      Ref count (g)  = 0xFFFF
    21.      Ref count (p)  = 0xFFFF
    22.      Base address   = 0x7C900000
    23.      Base size      = 720896
    24.  
    25.      MODULE NAME:     kernel32.dll
    26.      Executable     = C:\WINDOWS\system32\kernel32.dll
    27.      Process ID     = 0x00000BB4
    28.      Ref count (g)  = 0xFFFF
    29.      Ref count (p)  = 0xFFFF
    30.      Base address   = 0x7C800000
    31.      Base size      = 999424
    32.  
    33.      MODULE NAME:     user32.dll
    34.      Executable     = C:\WINDOWS\system32\user32.dll
    35.      Process ID     = 0x00000BB4
    36.      Ref count (g)  = 0xFFFF
    37.      Ref count (p)  = 0xFFFF
    38.      Base address   = 0x77D40000
    39.      Base size      = 589824
    40.  
    41.      MODULE NAME:     GDI32.dll
    42.      Executable     = C:\WINDOWS\system32\GDI32.dll
    43.      Process ID     = 0x00000BB4
    44.      Ref count (g)  = 0xFFFF
    45.      Ref count (p)  = 0xFFFF
    46.      Base address   = 0x77F10000
    47.      Base size      = 286720
    48.  
    49.      MODULE NAME:     advapi32.dll
    50.      Executable     = C:\WINDOWS\system32\advapi32.dll
    51.      Process ID     = 0x00000BB4
    52.      Ref count (g)  = 0xFFFF
    53.      Ref count (p)  = 0xFFFF
    54.      Base address   = 0x77DD0000
    55.      Base size      = 634880
    56.  
    57.      MODULE NAME:     RPCRT4.dll
    58.      Executable     = C:\WINDOWS\system32\RPCRT4.dll
    59.      Process ID     = 0x00000BB4
    60.      Ref count (g)  = 0xFFFF
    61.      Ref count (p)  = 0xFFFF
    62.      Base address   = 0x77E70000
    63.      Base size      = 593920
    64.  
    65.      MODULE NAME:     oleaut32.dll
    66.      Executable     = C:\WINDOWS\system32\oleaut32.dll
    67.      Process ID     = 0x00000BB4
    68.      Ref count (g)  = 0xFFFF
    69.      Ref count (p)  = 0xFFFF
    70.      Base address   = 0x77120000
    71.      Base size      = 573440
    72.  
    73.      MODULE NAME:     msvcrt.dll
    74.      Executable     = C:\WINDOWS\system32\msvcrt.dll
    75.      Process ID     = 0x00000BB4
    76.      Ref count (g)  = 0xFFFF
    77.      Ref count (p)  = 0xFFFF
    78.      Base address   = 0x77C10000
    79.      Base size      = 360448
    80.  
    81.      MODULE NAME:     ole32.dll
    82.      Executable     = C:\WINDOWS\system32\ole32.dll
    83.      Process ID     = 0x00000BB4
    84.      Ref count (g)  = 0xFFFF
    85.      Ref count (p)  = 0xFFFF
    86.      Base address   = 0x774E0000
    87.      Base size      = 1294336
    88.  
    89.      MODULE NAME:     version.dll
    90.      Executable     = C:\WINDOWS\system32\version.dll
    91.      Process ID     = 0x00000BB4
    92.      Ref count (g)  = 0xFFFF
    93.      Ref count (p)  = 0xFFFF
    94.      Base address   = 0x77C00000
    95.      Base size      = 32768
    96.  
    97.      MODULE NAME:     comctl32.dll
    98.      Executable     = C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2180_x-ww_a84f1ff9\comctl32.dll
    99.      Process ID     = 0x00000BB4
    100.      Ref count (g)  = 0xFFFF
    101.      Ref count (p)  = 0xFFFF
    102.      Base address   = 0x773D0000
    103.      Base size      = 1056768
    104.  
    105.      MODULE NAME:     SHLWAPI.dll
    106.      Executable     = C:\WINDOWS\system32\SHLWAPI.dll
    107.      Process ID     = 0x00000BB4
    108.      Ref count (g)  = 0xFFFF
    109.      Ref count (p)  = 0xFFFF
    110.      Base address   = 0x77F60000
    111.      Base size      = 483328
    112.  
    113.      MODULE NAME:     imm32.dll
    114.      Executable     = C:\WINDOWS\system32\imm32.dll
    115.      Process ID     = 0x00000BB4
    116.      Ref count (g)  = 0xFFFF
    117.      Ref count (p)  = 0xFFFF
    118.      Base address   = 0x76390000
    119.      Base size      = 118784
    120.  
    121.      MODULE NAME:     winspool.drv
    122.      Executable     = C:\WINDOWS\system32\winspool.drv
    123.      Process ID     = 0x00000BB4
    124.      Ref count (g)  = 0xFFFF
    125.      Ref count (p)  = 0xFFFF
    126.      Base address   = 0x73000000
    127.      Base size      = 155648
    128.  
    129.      MODULE NAME:     shell32.dll
    130.      Executable     = C:\WINDOWS\system32\shell32.dll
    131.      Process ID     = 0x00000BB4
    132.      Ref count (g)  = 0xFFFF
    133.      Ref count (p)  = 0xFFFF
    134.      Base address   = 0x7C9C0000
    135.      Base size      = 8470528
    136.   WARNING: ReadProcessMemory failed with error 998 (Invalid access to memory location)
    137.  
    138.      MODULE NAME:     comdlg32.dll
    139.      Executable     = C:\WINDOWS\system32\comdlg32.dll
    140.      Process ID     = 0x00000BB4
    141.      Ref count (g)  = 0xFFFF
    142.      Ref count (p)  = 0xFFFF
    143.      Base address   = 0x763B0000
    144.      Base size      = 299008
    145.  
    146.      MODULE NAME:     winmm.dll
    147.      Executable     = C:\WINDOWS\system32\winmm.dll
    148.      Process ID     = 0x00000BB4
    149.      Ref count (g)  = 0xFFFF
    150.      Ref count (p)  = 0xFFFF
    151.      Base address   = 0x76B40000
    152.      Base size      = 184320
    153.  
    154.      MODULE NAME:     MSCTF.dll
    155.      Executable     = C:\WINDOWS\system32\MSCTF.dll
    156.      Process ID     = 0x00000BB4
    157.      Ref count (g)  = 0x0002
    158.      Ref count (p)  = 0x0002
    159.      Base address   = 0x74720000
    160.      Base size      = 307200
    161.  
    162.      MODULE NAME:     uxtheme.dll
    163.      Executable     = C:\WINDOWS\system32\uxtheme.dll
    164.      Process ID     = 0x00000BB4
    165.      Ref count (g)  = 0x0003
    166.      Ref count (p)  = 0x0003
    167.      Base address   = 0x5AD70000
    168.      Base size      = 229376
    169.  
    170.      MODULE NAME:     olepro32.dll
    171.      Executable     = C:\WINDOWS\system32\olepro32.dll
    172.      Process ID     = 0x00000BB4
    173.      Ref count (g)  = 0x0001
    174.      Ref count (p)  = 0x0001
    175.      Base address   = 0x5EDD0000
    176.      Base size      = 94208
    177.  
    178.      MODULE NAME:     D3d8.dll
    179.      Executable     = C:\WINDOWS\system32\D3d8.dll
    180.      Process ID     = 0x00000BB4
    181.      Ref count (g)  = 0x0001
    182.      Ref count (p)  = 0x0001
    183.      Base address   = 0x6D9A0000
    184.      Base size      = 1212416
    185.  
    186.      MODULE NAME:     d3d8thk.dll
    187.      Executable     = C:\WINDOWS\system32\d3d8thk.dll
    188.      Process ID     = 0x00000BB4
    189.      Ref count (g)  = 0x0001
    190.      Ref count (p)  = 0x0001
    191.      Base address   = 0x6D990000
    192.      Base size      = 24576
    193.  
    194.      MODULE NAME:     DSound.dll
    195.      Executable     = C:\WINDOWS\system32\DSound.dll
    196.      Process ID     = 0x00000BB4
    197.      Ref count (g)  = 0x0002
    198.      Ref count (p)  = 0x0002
    199.      Base address   = 0x73F10000
    200.      Base size      = 376832
    201.  
    202.      MODULE NAME:     security.dll
    203.      Executable     = C:\WINDOWS\system32\security.dll
    204.      Process ID     = 0x00000BB4
    205.      Ref count (g)  = 0x0001
    206.      Ref count (p)  = 0x0001
    207.      Base address   = 0x71F80000
    208.      Base size      = 16384
    209.  
    210.      MODULE NAME:     SECUR32.dll
    211.      Executable     = C:\WINDOWS\system32\SECUR32.dll
    212.      Process ID     = 0x00000BB4
    213.      Ref count (g)  = 0x0003
    214.      Ref count (p)  = 0x0003
    215.      Base address   = 0x77FE0000
    216.      Base size      = 69632
    217.  
    218.      MODULE NAME:     msv1_0.dll
    219.      Executable     = C:\WINDOWS\system32\msv1_0.dll
    220.      Process ID     = 0x00000BB4
    221.      Ref count (g)  = 0x0001
    222.      Ref count (p)  = 0x0001
    223.      Base address   = 0x77C70000
    224.      Base size      = 143360
    225.  
    226.      MODULE NAME:     WS2_32.dll
    227.      Executable     = C:\WINDOWS\system32\WS2_32.dll
    228.      Process ID     = 0x00000BB4
    229.      Ref count (g)  = 0x0025
    230.      Ref count (p)  = 0x0025
    231.      Base address   = 0x71AB0000
    232.      Base size      = 94208
    233.  
    234.      MODULE NAME:     WS2HELP.dll
    235.      Executable     = C:\WINDOWS\system32\WS2HELP.dll
    236.      Process ID     = 0x00000BB4
    237.      Ref count (g)  = 0x0028
    238.      Ref count (p)  = 0x0028
    239.      Base address   = 0x71AA0000
    240.      Base size      = 32768
    241.  
    242.      MODULE NAME:     iphlpapi.dll
    243.      Executable     = C:\WINDOWS\system32\iphlpapi.dll
    244.      Process ID     = 0x00000BB4
    245.      Ref count (g)  = 0x0001
    246.      Ref count (p)  = 0x0001
    247.      Base address   = 0x76D60000
    248.      Base size      = 102400
    249.  
    250.      MODULE NAME:     docking.dll
    251.      Executable     = C:\Program Files\QIP\Plugins\docking.dll
    252.      Process ID     = 0x00000BB4
    253.      Ref count (g)  = 0x0001
    254.      Ref count (p)  = 0x0001
    255.      Base address   = 0x10000000
    256.      Base size      = 65536
    257.  
    258.      MODULE NAME:     CLBCATQ.DLL
    259.      Executable     = C:\WINDOWS\system32\CLBCATQ.DLL
    260.      Process ID     = 0x00000BB4
    261.      Ref count (g)  = 0x0002
    262.      Ref count (p)  = 0x0002
    263.      Base address   = 0x76FD0000
    264.      Base size      = 520192
    265.  
    266.      MODULE NAME:     COMRes.dll
    267.      Executable     = C:\WINDOWS\system32\COMRes.dll
    268.      Process ID     = 0x00000BB4
    269.      Ref count (g)  = 0x0002
    270.      Ref count (p)  = 0x0002
    271.      Base address   = 0x77050000
    272.      Base size      = 806912
    273.  
    274.      MODULE NAME:     Flash8.ocx
    275.      Executable     = C:\WINDOWS\system32\Macromed\Flash\Flash8.ocx
    276.      Process ID     = 0x00000BB4
    277.      Ref count (g)  = 0x0001
    278.      Ref count (p)  = 0x0001
    279.      Base address   = 0x30000000
    280.      Base size      = 2236416
    281.  
    282.      MODULE NAME:     WSOCK32.dll
    283.      Executable     = C:\WINDOWS\system32\WSOCK32.dll
    284.      Process ID     = 0x00000BB4
    285.      Ref count (g)  = 0x0002
    286.      Ref count (p)  = 0x0002
    287.      Base address   = 0x71AD0000
    288.      Base size      = 36864
    289.  
    290.      MODULE NAME:     WININET.dll
    291.      Executable     = C:\WINDOWS\system32\WININET.dll
    292.      Process ID     = 0x00000BB4
    293.      Ref count (g)  = 0x0005
    294.      Ref count (p)  = 0x0005
    295.      Base address   = 0x771B0000
    296.      Base size      = 679936
    297.  
    298.      MODULE NAME:     CRYPT32.dll
    299.      Executable     = C:\WINDOWS\system32\CRYPT32.dll
    300.      Process ID     = 0x00000BB4
    301.      Ref count (g)  = 0x0012
    302.      Ref count (p)  = 0x0012
    303.      Base address   = 0x77A80000
    304.      Base size      = 606208
    305.  
    306.      MODULE NAME:     MSASN1.dll
    307.      Executable     = C:\WINDOWS\system32\MSASN1.dll
    308.      Process ID     = 0x00000BB4
    309.      Ref count (g)  = 0x0013
    310.      Ref count (p)  = 0x0013
    311.      Base address   = 0x77B20000
    312.      Base size      = 73728
    313.  
    314.      MODULE NAME:     urlmon.dll
    315.      Executable     = C:\WINDOWS\system32\urlmon.dll
    316.      Process ID     = 0x00000BB4
    317.      Ref count (g)  = 0x0007
    318.      Ref count (p)  = 0x0007
    319.      Base address   = 0x77260000
    320.      Base size      = 638976
    321.  
    322.      MODULE NAME:     WINTRUST.dll
    323.      Executable     = C:\WINDOWS\system32\WINTRUST.dll
    324.      Process ID     = 0x00000BB4
    325.      Ref count (g)  = 0x0008
    326.      Ref count (p)  = 0x0008
    327.      Base address   = 0x76C30000
    328.      Base size      = 188416
    329.  
    330.      MODULE NAME:     IMAGEHLP.dll
    331.      Executable     = C:\WINDOWS\system32\IMAGEHLP.dll
    332.      Process ID     = 0x00000BB4
    333.      Ref count (g)  = 0x0008
    334.      Ref count (p)  = 0x0008
    335.      Base address   = 0x76C90000
    336.      Base size      = 163840
    337.  
    338.      MODULE NAME:     wdmaud.drv
    339.      Executable     = C:\WINDOWS\system32\wdmaud.drv
    340.      Process ID     = 0x00000BB4
    341.      Ref count (g)  = 0x0009
    342.      Ref count (p)  = 0x0009
    343.      Base address   = 0x72D20000
    344.      Base size      = 36864
    345.  
    346.      MODULE NAME:     msacm32.drv
    347.      Executable     = C:\WINDOWS\system32\msacm32.drv
    348.      Process ID     = 0x00000BB4
    349.      Ref count (g)  = 0x0002
    350.      Ref count (p)  = 0x0002
    351.      Base address   = 0x72D10000
    352.      Base size      = 32768
    353.  
    354.      MODULE NAME:     MSACM32.dll
    355.      Executable     = C:\WINDOWS\system32\MSACM32.dll
    356.      Process ID     = 0x00000BB4
    357.      Ref count (g)  = 0x0002
    358.      Ref count (p)  = 0x0002
    359.      Base address   = 0x77BE0000
    360.      Base size      = 86016
    361.  
    362.      MODULE NAME:     midimap.dll
    363.      Executable     = C:\WINDOWS\system32\midimap.dll
    364.      Process ID     = 0x00000BB4
    365.      Ref count (g)  = 0x0001
    366.      Ref count (p)  = 0x0001
    367.      Base address   = 0x77BD0000
    368.      Base size      = 28672
    369.  
    370.      MODULE NAME:     SXS.DLL
    371.      Executable     = C:\WINDOWS\system32\SXS.DLL
    372.      Process ID     = 0x00000BB4
    373.      Ref count (g)  = 0x0001
    374.      Ref count (p)  = 0x0001
    375.      Base address   = 0x75E90000
    376.      Base size      = 720896
    377.  
    378.      MODULE NAME:     shdocvw.dll
    379.      Executable     = C:\WINDOWS\system32\shdocvw.dll
    380.      Process ID     = 0x00000BB4
    381.      Ref count (g)  = 0x0002
    382.      Ref count (p)  = 0x0002
    383.      Base address   = 0x77760000
    384.      Base size      = 1490944
    385.  
    386.      MODULE NAME:     CRYPTUI.dll
    387.      Executable     = C:\WINDOWS\system32\CRYPTUI.dll
    388.      Process ID     = 0x00000BB4
    389.      Ref count (g)  = 0x0002
    390.      Ref count (p)  = 0x0002
    391.      Base address   = 0x754D0000
    392.      Base size      = 524288
    393.  
    394.      MODULE NAME:     NETAPI32.dll
    395.      Executable     = C:\WINDOWS\system32\NETAPI32.dll
    396.      Process ID     = 0x00000BB4
    397.      Ref count (g)  = 0x0002
    398.      Ref count (p)  = 0x0002
    399.      Base address   = 0x5B860000
    400.      Base size      = 344064
    401.  
    402.      MODULE NAME:     WLDAP32.dll
    403.      Executable     = C:\WINDOWS\system32\WLDAP32.dll
    404.      Process ID     = 0x00000BB4
    405.      Ref count (g)  = 0x0003
    406.      Ref count (p)  = 0x0003
    407.      Base address   = 0x76F60000
    408.      Base size      = 180224
    409.  
    410.      MODULE NAME:     shdoclc.dll
    411.      Executable     = C:\WINDOWS\system32\shdoclc.dll
    412.      Process ID     = 0x00000BB4
    413.      Ref count (g)  = 0x0002
    414.      Ref count (p)  = 0x0002
    415.      Base address   = 0x20000000
    416.      Base size      = 557056
    417.  
    418.      MODULE NAME:     xpsp2res.dll
    419.      Executable     = C:\WINDOWS\system32\xpsp2res.dll
    420.      Process ID     = 0x00000BB4
    421.      Ref count (g)  = 0x0002
    422.      Ref count (p)  = 0x0002
    423.      Base address   = 0x03260000
    424.      Base size      = 2904064
    425.  
    426.      MODULE NAME:     mshtml.dll
    427.      Executable     = C:\WINDOWS\system32\mshtml.dll
    428.      Process ID     = 0x00000BB4
    429.      Ref count (g)  = 0x0001
    430.      Ref count (p)  = 0x0001
    431.      Base address   = 0x7D4A0000
    432.      Base size      = 3022848
    433.  
    434.      MODULE NAME:     msls31.dll
    435.      Executable     = C:\WINDOWS\system32\msls31.dll
    436.      Process ID     = 0x00000BB4
    437.      Ref count (g)  = 0x0001
    438.      Ref count (p)  = 0x0001
    439.      Base address   = 0x746C0000
    440.      Base size      = 159744
    441.  
    442.      MODULE NAME:     mlang.dll
    443.      Executable     = C:\WINDOWS\system32\mlang.dll
    444.      Process ID     = 0x00000BB4
    445.      Ref count (g)  = 0x0003
    446.      Ref count (p)  = 0x0003
    447.      Base address   = 0x75CF0000
    448.      Base size      = 593920
    449.  
    450.      MODULE NAME:     KsUser.dll
    451.      Executable     = C:\WINDOWS\system32\KsUser.dll
    452.      Process ID     = 0x00000BB4
    453.      Ref count (g)  = 0x0001
    454.      Ref count (p)  = 0x0001
    455.      Base address   = 0x73EE0000
    456.      Base size      = 16384
    457.  
    458.      MODULE NAME:     mswsock.dll
    459.      Executable     = C:\WINDOWS\System32\mswsock.dll
    460.      Process ID     = 0x00000BB4
    461.      Ref count (g)  = 0x0005
    462.      Ref count (p)  = 0x0005
    463.      Base address   = 0x71A50000
    464.      Base size      = 258048
    465.  
    466.      MODULE NAME:     DNSAPI.dll
    467.      Executable     = C:\WINDOWS\system32\DNSAPI.dll
    468.      Process ID     = 0x00000BB4
    469.      Ref count (g)  = 0x0002
    470.      Ref count (p)  = 0x0002
    471.      Base address   = 0x76F20000
    472.      Base size      = 159744
    473.  
    474.      MODULE NAME:     winrnr.dll
    475.      Executable     = C:\WINDOWS\System32\winrnr.dll
    476.      Process ID     = 0x00000BB4
    477.      Ref count (g)  = 0x0001
    478.      Ref count (p)  = 0x0001
    479.      Base address   = 0x76FB0000
    480.      Base size      = 32768
    481.  
    482.      MODULE NAME:     rasadhlp.dll
    483.      Executable     = C:\WINDOWS\system32\rasadhlp.dll
    484.      Process ID     = 0x00000BB4
    485.      Ref count (g)  = 0x0001
    486.      Ref count (p)  = 0x0001
    487.      Base address   = 0x76FC0000
    488.      Base size      = 24576
    489.  
    490.      MODULE NAME:     hnetcfg.dll
    491.      Executable     = C:\WINDOWS\system32\hnetcfg.dll
    492.      Process ID     = 0x00000BB4
    493.      Ref count (g)  = 0x0001
    494.      Ref count (p)  = 0x0001
    495.      Base address   = 0x662B0000
    496.      Base size      = 360448
    497.  
    498.      MODULE NAME:     wshtcpip.dll
    499.      Executable     = C:\WINDOWS\System32\wshtcpip.dll
    500.      Process ID     = 0x00000BB4
    501.      Ref count (g)  = 0x0001
    502.      Ref count (p)  = 0x0001
    503.      Base address   = 0x71A90000
    504.      Base size      = 32768
    505.  
    506.      MODULE NAME:     msimtf.dll
    507.      Executable     = C:\WINDOWS\system32\msimtf.dll
    508.      Process ID     = 0x00000BB4
    509.      Ref count (g)  = 0x0001
    510.      Ref count (p)  = 0x0001
    511.      Base address   = 0x746F0000
    512.      Base size      = 172032
    513.  
    514.      MODULE NAME:     jscript.dll
    515.      Executable     = C:\WINDOWS\system32\jscript.dll
    516.      Process ID     = 0x00000BB4
    517.      Ref count (g)  = 0x0001
    518.      Ref count (p)  = 0x0001
    519.      Base address   = 0x75C50000
    520.      Base size      = 450560
    521.  
    522.      MODULE NAME:     SETUPAPI.dll
    523.      Executable     = C:\WINDOWS\system32\SETUPAPI.dll
    524.      Process ID     = 0x00000BB4
    525.      Ref count (g)  = 0x0001
    526.      Ref count (p)  = 0x0001
    527.      Base address   = 0x77920000
    528.      Base size      = 995328
    529.  
    530.      MODULE NAME:     appHelp.dll
    531.      Executable     = C:\WINDOWS\system32\appHelp.dll
    532.      Process ID     = 0x00000BB4
    533.      Ref count (g)  = 0x0001
    534.      Ref count (p)  = 0x0001
    535.      Base address   = 0x77B40000
    536.      Base size      = 139264
    537.  
    538.      MODULE NAME:     mshtmled.dll
    539.      Executable     = C:\WINDOWS\system32\mshtmled.dll
    540.      Process ID     = 0x00000BB4
    541.      Ref count (g)  = 0x0001
    542.      Ref count (p)  = 0x0001
    543.      Base address   = 0x76200000
    544.      Base size      = 462848
     
  2. seeQ

    seeQ New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2003
    Сообщения:
    71
    Как корабль назовешь, так он и поплывет...
    Код глянул мельком, но VirtualProtect перед вызовом ReadProcessMemory не нашел, в этом и ошибка.
     
  3. baga

    baga New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    16
    Странно, почему без VirtualProtect не работает на некоторых либах.

    Код (Text):
    1. BOOL DumpModule(HANDLE hProcess, MODULEENTRY32 *me32, BYTE *pBuf)
    2. {
    3.     char szFileName[_MAX_PATH];
    4.     strcpy_s(szFileName, sizeof(szFileName), OUTPUT_DIR);
    5.     strcat_s(szFileName, sizeof(szFileName), "\\");
    6.     strcat_s(szFileName, sizeof(szFileName), me32->szModule);
    7.     strcat_s(szFileName, sizeof(szFileName), ".d");
    8.  
    9.     HANDLE hFile = CreateFile(
    10.         szFileName,
    11.         FILE_ALL_ACCESS,
    12.         FILE_SHARE_READ,
    13.         NULL,
    14.         CREATE_ALWAYS,
    15.         FILE_ATTRIBUTE_NORMAL,
    16.         NULL);
    17.     if(!hFile)
    18.     {
    19.         PrintError("CreateFile");
    20.         return FALSE;
    21.     }
    22.  
    23.     MEMORY_BASIC_INFORMATION virtualInfo;
    24.     BYTE *pBaseAddr = me32->modBaseAddr;
    25.     BYTE *pAddr;
    26.     DWORD dwBaseSize = me32->modBaseSize;
    27.     DWORD dwPos = 0;
    28.     DWORD dwDelta;
    29.     DWORD dwBytesToRead;
    30.     DWORD dwProtect;
    31.     DWORD dwOldProtect;
    32.     DWORD dwBytes;
    33.     BOOL bRet = FALSE;
    34.  
    35.     while(dwPos < dwBaseSize)
    36.     {
    37.         pAddr = pBaseAddr + dwPos;
    38.         dwDelta = dwBaseSize - dwPos;
    39.  
    40.         if(dwDelta >= CHUNK_SIZE)
    41.             dwBytesToRead = CHUNK_SIZE;
    42.         else
    43.             dwBytesToRead = dwDelta;
    44.  
    45.         VirtualQuery(pAddr, &virtualInfo, sizeof(virtualInfo));
    46.  
    47.         dwProtect = virtualInfo.AllocationProtect | PAGE_EXECUTE_READ;
    48.  
    49.         if(!VirtualProtect(pAddr, dwBytesToRead, dwProtect, &dwOldProtect))
    50.         {
    51.             PrintError("VirtualProtect");
    52.             goto err;
    53.         }
    54.  
    55.         if(!ReadProcessMemory(hProcess, pAddr, pBuf + dwPos, dwBytesToRead, &dwBytes))
    56.         {
    57.             PrintError("ReadProcessMemory");
    58.             goto err;
    59.         }
    60.  
    61.         if(!WriteFile(hFile, pBuf + dwPos, dwBytesToRead, &dwBytes, NULL))
    62.         {
    63.             PrintError("WriteFile");
    64.             goto err;
    65.         }
    66.  
    67.         if(!VirtualProtect(pAddr, dwBytesToRead, dwOldProtect, &dwProtect))
    68.         {
    69.             PrintError("VirtualProtect");
    70.             goto err;
    71.         }
    72.  
    73.         dwPos += dwBytesToRead;
    74.     }
    75.  
    76.     pAddr = NULL;
    77.     bRet = TRUE;
    78.  
    79. err:
    80.  
    81.     if(pAddr)
    82.         VirtualProtect(pAddr, dwBytesToRead, dwOldProtect, &dwProtect);
    83.  
    84.     CloseHandle(hFile);
    85.  
    86.     return bRet;
    87. }
    VirtualProtect failed with error 487 (Attempt to access invalid address)

    В msdn сказано что можно менять флаги доступа только для страниц целиком, может нужно dwBytesToRead получать из MEMORY_BASIC_INFORMATION?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Сам понимаеш что спаршиваеш ?