2014-09-21 11 views
0

我使用winappdbg爲了設置斷點NTDLL!NtWriteVirtualMemory。winappdbg NtWriteVirtualMemory處理錯誤

我的目標是檢查遠程進程的內存保護PAGE_EXECUTE。

所以我成功地在NtWriteVirtualMemory上設置了斷點,問題是我得到了 函數中的一個參數(例如0x20),但是當我在腳本中使用它時它是無效的。

我嘗試使用winappdbg.win32.VirtualQueryEx(GOT句柄無效)

任何想法?

def action_callback(event): 
    print "ntdll!NtWriteVirtualMemory was called!" 
    process = event.get_process() 
    thread = event.get_thread() 
    # Get the address of the top of the stack. 
    stack = thread.get_sp() 

    # Get the return address of the call. 
    retAddress = process.read_pointer(stack) 
    print "ret address " + hex(retAddress) 
    processHandle = process.read_pointer(stack+4) 
    print "processHandle " + hex(processHandle) 
    BaseAddress = process.read_pointer(stack+8) 
    print "BaseAddress " + hex(BaseAddress) 
    Buffer = process.read_pointer(stack+12) 
    print "Buffer " + hex(Buffer) 
    NumberOfBytesToWrite = process.read_pointer(stack+16) 
    print "NumberOfBytesToWrite " + hex(NumberOfBytesToWrite) 
    NumberOfBytesWritten = process.read_pointer(stack+16) 
    print "NumberOfBytesWritten " + hex(NumberOfBytesWritten) 
    print "=====================" 
    print "virtualQuery - " + VirtualQueryEx(int(processHandle), BaseAddress) 

謝謝!!

回答

0

恐怕你正在試圖做的不能工作的 - Win32的手柄僅創建它們的過程中有效,並且你想在由過程創建腳本,以使用一個手柄重新調試。

你需要做的是試圖讓進程ID代替。進程ID是全局的,您可以使用OpenProcess()爲它們創建自己的句柄。您必須鉤住所有可以返回進程句柄的函數,獲取它們的參數和返回值,然後可以將外部句柄映射到進程ID中。

另一種選擇是,嘗試通過將目標進程中調用GetProcessID()(如果你從腳本做同樣的原因上面解釋它會失敗)來解決手柄插入進程ID。這有點棘手,因爲代碼注入可能會失敗,我建議使用更多的鉤子。但是如果你想試試這個,event.get_process()。inject_code()是你的朋友:http://winappdbg.sourceforge.net/doc/latest/reference/winappdbg.process.Process-class.html#inject_code

0

最後我用了DuplicateHandle。它工作得很好!

source_pid = event.get_process().get_pid() 
print 'source pid =', source_pid 
source_phandle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, FALSE, source_pid) 
print 'source phandle =', source_phandle 
current_phandle = win32process.GetCurrentProcess() 
print 'current phandle =', current_phandle 
duplicated_handle = win32api.DuplicateHandle(source_phandle, processHandle, current_phandle, 
         0, FALSE, win32con.DUPLICATE_SAME_ACCESS)     
print 'dup h =', duplicated_handle 
source_process_name = win32process.GetModuleFileNameEx(source_phandle, 0) 
print "source_process_name - ", (source_process_name) 

q = VirtualQueryEx(duplicated_handle.handle, BaseAddress) 
print "virtualQuery - is_executable() " + str(q.is_executable()) 
target_process_name = win32process.GetModuleFileNameEx(duplicated_handle.handle, 0) 
print "target_process_name - ", (target_process_name) 

VirtualQueryEx工作正常!

的問題,現在GetModulefileNameEx到複製手柄返回我「的句柄無效」。

如何顯示目標進程名稱?

謝謝!