2014-09-22 107 views
0

我有一個奇怪的崩潰轉儲我的應用程序,我無法弄清楚崩潰的原因。我注意到,!chkimg命令揭示了一些錯誤,在轉儲:chkimg錯誤的意義崩潰轉儲

0:013> !chkimg 
824985 errors : @eip (77230010-7731016b) 

地址範圍77230010-7731016b屬於ntdll.dll中的模塊。 這是惡意軟件影響我的程序的明確標誌嗎?我能以某種方式證實或消除這個假設嗎?

編輯: 基礎上,blabb的回答一些補充:

的範圍大小爲917851出其中824985的NTDLL(默認情況下被改變chkimg不檢查可寫的部分,以便輸出seesm suspicous

我在WinDbg中的最新版本執行的命令,並將其發現8219個不是824985錯誤。

你不能assum e一臺機器根據可能的腐敗轉儲而被宕機

我的應用程序由幾個不同的進程/可執行文件組成,並且我幾乎爲每個進程執行了轉儲。而!!chkimg爲所有人返回相同的錯誤。

的dumpwrite路徑可以有BSOD和腐敗轉儲過程中遇到問題可以寫

所有場是用戶模式下的內核。

而且我得到以下警告,同時重新加載符號:

*警告:符號時間戳是錯誤的0x521ea8e7 0x4ce7ba58爲ntdll.dll中

+0

什麼樣的崩潰呢?難道是DLL的內存被覆蓋,例如由緩衝區溢出? – 2014-09-22 19:53:34

+0

緩衝區溢出可能會破壞進程內存中加載的ntdll.dll映像嗎?我相信這樣的嘗試會因訪問衝突而失敗。 – vkrzv 2014-09-22 20:09:21

+0

你說得對,當然這個DLL頁面應該是PAGE_READONLY。 – 2014-09-22 21:44:04

回答

1

的範圍大小爲917851外面824985在改變ntdll(默認情況下!chkimg不檢查可寫的部分,以便輸出seesm suspicous

使用chkimg -d它應該告訴你在哪裏原始文件從一個就是內存
或強制命令掃描模塊NTDLL與chkimg -d ntdll

不同的地方

你不能假設一臺機器是基於一個可能可能已損壞轉儲malwared
的dumpwrite路徑可以有BSOD和腐敗轉儲可以寫
檢查與chkimg -db可以顯示在區域中的所有零它是過程中出現問題檢查
我假設你有一個內核完全轉儲

orginal file address xxxxxxxx 60 90 cc 
memory file     00 00 00 

上面可以chkimg輸出表現出這種巨大的差異

lkd> !chkimg nt -d 
    80501bc8-80501bcb 4 bytes - nt!KiServiceTable+24 
    [ ec cb 60 80:a0 9a 3e a9 ] 
    80501bf0-80501bf3 4 bytes - nt!KiServiceTable+4c (+0x28) 
    [ 44 c9 5c 80:7e a5 3e a9 ] 
    80501c08-80501c0b 4 bytes - nt!KiServiceTable+64 (+0x18) 
    [ ba 1c 5b 80:5d e8 42 a9 ] 

有可能只覆蓋被標記IMAGE_SCN_MEM_WRITE寫入任何二進制的部分其他部分將生成訪問衝突 和chkimg,除非被迫不將這些部分與屬性在pe標頭中進行比較,因此查詢中顯示的內容在沒有允許或不期望修改的地方。

這裏,需要一個DLL名稱,並嘗試示例代碼寫入到.data段

#include <windows.h> 
#include <stdio.h> 
int main (int argc,char *argv[]) { 
    UNREFERENCED_PARAMETER(argc); 
    HMODULE hMod = LoadLibrary(argv[1]); 
    if (hMod) { 
     PIMAGE_DOS_HEADER doshead = (PIMAGE_DOS_HEADER) hMod; 
     DWORD ntoffset = doshead->e_lfanew + (DWORD)hMod; 
     DWORD datsecoffset = ntoffset + sizeof(IMAGE_NT_HEADERS); 
     PIMAGE_NT_HEADERS nthead = (PIMAGE_NT_HEADERS)(ntoffset); 
     DWORD totsections = nthead->FileHeader.NumberOfSections; 
     for (DWORD i = 0 ; i< totsections ; i++) { 
      PIMAGE_SECTION_HEADER sechead = (PIMAGE_SECTION_HEADER) 
       (datsecoffset + i * sizeof(IMAGE_SECTION_HEADER)); 
      if((sechead->Characteristics & IMAGE_SCN_MEM_WRITE) == 
       IMAGE_SCN_MEM_WRITE) { 
        CONSOLE_SCREEN_BUFFER_INFO csbiInfo; 
        HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); 
        GetConsoleScreenBufferInfo(out, &csbiInfo); 
        WORD oldcolor = csbiInfo.wAttributes; 
        SetConsoleTextAttribute(out,10); 
        printf(
         "Module %p Section %s is writable trying to write\n", 
         hMod,sechead->Name); 
        for(DWORD j = sechead->VirtualAddress ; 
         j < sechead->VirtualAddress + sechead->SizeOfRawData ; 
         j++) { 
          BYTE Inbyte = *(BYTE *) ((BYTE *)hMod + j); 
          *(BYTE *) ((BYTE *)hMod + j) = Inbyte; 
        } 
        printf(
         "Module %p Section %s is written to successfully\n", 
         hMod,sechead->Name); 
        SetConsoleTextAttribute(
         GetStdHandle(STD_OUTPUT_HANDLE),oldcolor); 
      } else { 
       printf(
        "Module %p Section %s is not writable skipping\n", 
        hMod,sechead->Name); 
      } 
     } 
     return 0; 
    } 
} 

輸出上hexedited DLL和NTDLL下面

:\>xxd -s +0x3c -l 4 -g 4 sec_attr_mod_dll.dll 
000003c: b0000000        ....  
:\>set /a 0xb0 + 0xf8 + 0x24 
460 
:\>xxd -s +460 -l 4 -g 4 sec_attr_mod_dll.dll & xxd -s +500 -l 4 -g 4 sec_attr_m 
od_dll.dll & xxd -s +540 -l 4 -g 4 sec_attr_mod_dll.dll & xxd -s +580 -l 4 -g 4 
sec_attr_mod_dll.dll 
00001cc: 400000c0        @... 
00001f4: 400000c0        @... 
000021c: 400000c0        @... 
0000244: 400000c2        @... 

:\>w2dl.exe sec_attr_mod_dll.dll 
Module 10000000 Section .text is writable trying to write 
Module 10000000 Section .text is written to successfully 
Module 10000000 Section .rdata is writable trying to write 
Module 10000000 Section .rdata is written to successfully 
Module 10000000 Section .data is writable trying to write 
Module 10000000 Section .data is written to successfully 
Module 10000000 Section .reloc is writable trying to write 
Module 10000000 Section .reloc is written to successfully 

:\>w2dl.exe ntdll.dll 
Module 7C900000 Section .text is not writable skipping 
Module 7C900000 Section .data is writable trying to write 
Module 7C900000 Section .data is written to successfully 
Module 7C900000 Section .rsrc is not writable skipping 
Module 7C900000 Section .reloc is not writable skipping 

:\> 
+0

感謝您的回覆。我編輯了我的問題,以根據您的假設添加一些信息。 – vkrzv 2014-09-28 19:22:41

+0

如果你有一個符號問題,那麼你不能指望!chkimg正常工作嘗試.symfix +看看你的下游符號文件夾中的ntdll.dll和ntdll.pdb保存在某個地方,以防萬一刪除這兩個文件夾並抓住一組全新的符號和dll從微軟的符號服務器,然後做一個簡短的谷歌!chkimg似乎dll的細節屬於w2k8 x64 syswow確保您使用windbg的正確位錯誤模塊名稱:ntdll.dll,版本:6.1.7601.17514,時間郵票:0x4ce7ba58 錯誤模塊名稱:ntdll.dll,版本:6.1.7601.18247,時間戳:0x521ea8e7 – blabb 2014-09-28 20:01:11

+0

嗯,'lmDvmntdll'打印:'時間戳:Thu Aug 29 05:50:31 2013(521EA8E7)'和'FileVersion: 6.1.7601.17514(win7sp1_rtm.101119-1850)'。 Google說521EA8E7對應於6.1.7601.18247,而不是6.1.7601.17514。另外我看到它爲我的本地c:\ windows \ syswow64 \ ntdll.dll。這怎麼可能? – vkrzv 2014-09-29 10:25:53