2017-02-16 60 views
1

我正在研究大學項目,所以我試圖在MASM32中編寫PE感染器。 其中一個需要的功能不是直接調用所需的功能,而是動態地查找它們的地址: 我在內存中搜索kernel32 lib,使用它的導出表找到GetProcAddressName函數,然後GetModuleHandle函數,然後用這個函數加載user32句柄,我使用GetProcAdsress訪問函數; MessageBoxA在我的示例中:彙編動態調用導致分段錯誤

.386 
.model flat, stdcall 
option casemap:none 

     include \masm32\include\windows.inc 
     include \masm32\include\user32.inc 
     include \masm32\include\kernel32.inc 
     include \masm32\include\masm32rt.inc 

     includelib \masm32\lib\user32.lib 
     includelib \masm32\lib\kernel32.lib 

.code 

start: 
     mov ebx, dword ptr[esp] 
     and ebx, 0ffff0000h 
     .while word ptr[ebx] != 'ZM' 
      dec ebx 
     .endw 
     mov kernelAddr, ebx 

     mov eax, ebx 
     add eax, 3Ch 
     mov eax, dword ptr[eax] 
     add eax, ebx 
pekernelFound: 
     mov peKernelAddr, eax 

     mov edx, kernelAddr 
     mov ebx, eax 
     add ebx, 78h 
     mov ebx, dword ptr[ebx] 
     add ebx, edx 

     mov ecx, ebx 
     add ecx, 1ch 
     mov ecx, dword ptr[ecx] 
     add ecx, edx 
     mov functionTableAddr, ecx 

     mov ecx, ebx 
     add ecx, 20h 
     mov ecx, dword ptr[ecx] 
     add ecx, edx 
     mov functionNameTableAddr, ecx 

     mov ecx, ebx 
     add ecx, 24h 
     mov ecx, dword ptr[ecx] 
     add ecx, edx 
     mov ordinalTableAddr, ecx 

searchProcAddressFunc:  
     mov ebx, functionNameTableAddr 
     mov esi, dword ptr[ebx] 
     add esi, kernelAddr 
     mov edi, offset GetProcAddressName 
     mov edx, 1 
     mov ecx, 0 ; l'index 
     .while edx != 0 
      mov al, byte ptr [esi] 
      mov bl, byte ptr [edi] 
      .if al != bl 
       .while byte ptr [esi] != 0 
        inc esi 
       .endw 
       inc esi 
       inc ecx 
       mov edi, offset GetProcAddressName 
      .else 
       .if byte ptr [esi] == 0 
        mov edx, 0 
       .else 
        inc esi 
        inc edi 
       .endif 
      .endif 
     .endw 

     mov eax, 2 
     mul ecx 
     mov ecx, eax 
     add ecx, ordinalTableAddr 
     xor eax, eax 
     mov ax, word ptr [ecx] 
     mov ecx, 4 
     mul ecx 
     add eax, functionTableAddr 
     mov eax, dword ptr [eax] 
     add eax, kernelAddr 
     mov GetProcAddressAddr, eax 

gettingGetModuleHandle: 
     push offset GetModuleHandleName 
     push kernelAddr 
     call GetProcAddressAddr 
     mov GetModuleHandleAddr, eax 
     push offset User32DllName 
     call GetModuleHandleAddr 

gettingMessageBox:   
     mov user32Addr, eax 
     push offset MessageBoxName 
     push eax 
     call GetProcAddressAddr 
     mov MessageBoxAddr, eax 

     push MB_OK 
     push offset hello 
     push offset hello 
     push 0 
     call MessageBoxAddr 

     push 0 
    call ExitProcess 

     hello      db  "Hello buddy", 0 


     kernelAddr     dd  ? 
     user32Addr     dd  ? 
     peKernelAddr    dd  ? 
     functionTableAddr   dd  ? 
     functionNameTableAddr  dd  ? 
     ordinalTableAddr   dd  ? 

     GetProcAddressName   db  "GetProcAddress",0 
     GetModuleHandleName   db  "GetModuleHandleA",0 
     MessageBoxName    db  "MessageBoxA", 0 
     MessageBoxAddr    dd  ? 

     GetProcAddressAddr   dd  ? 
     GetModuleHandleAddr   dd  ? 

     User32DllName    db  "User32.dll",0 
end start 

結果是在調用MessageBoxAddr時出現了段錯誤。 的例外,如果我把原來的功能,無所謂其中:

push MB_OK 
    push offset hello 
    push offset hello 
    push 0 
    call MessageBoxA 

如果我之前把這個樣品,或者之後,兩個呼叫工作,這是一個完整的無感我。

你有任何線索嗎?謝謝

回答

1

問題解決了: GetModuleHandle函數只在lib已經加載到內存中並且給出句柄時才起作用。

我使用LoadLibraryA代替(找不到LoadLibrary,我不知道爲什麼......),它的工作原理完美。無論如何感謝:p

+0

謝謝你回答你自己的問題。 – fuz