Windbg help отсутствует функция kernel32

Я пытаюсь следовать этому руководству здесь https://www.microsoftpressstore.com/articles/article.aspx?p=2201303 в частности та часть, где упоминается x kernel32!writeprocessmemory

Я не могу найти метод kernel32!WriteProcessMemory =, хотя в документации он упоминается, но я могу найти kernel32!_imp__WriteProcessMemory и kernel32!WriteProcessMemoryStub. Я новичок в windbg и пытаюсь следовать руководству, поэтому я не уверен, что этот метод устарел, и если да, то чем он заменяет и как мы можем добиться аналогичной функциональности.

Спасибо


person Mohamed341    schedule 13.05.2020    source источник
comment
0:000› .foreach (place { x /1 kernel32!*wrprme*} ) { dps place l1 } начиная с Windows 7, многие функции были перемещены в другие DLL, а API-SET used, который разрешает все эти старые функции для новых dll, которые вы, вероятно, используете в xpera tut / doc   -  person blabb    schedule 16.05.2020


Ответы (1)


Экспортированная функция WriteProcessMemory на самом деле указывает на заглушку kernel32!WriteProcessMemoryStub, которая сама переходит на kernel32!__imp_WriteProcessMemory, которая перенаправляет на kernelbase DLL, которая является "реальным" местоположением для этой функции.

Проверим дампом ссылки:

C:>link /dump /exports c:\windows\system32\kernel32.dll | findstr /I WriteProcess
       1579  62A 00036C50 WriteProcessMemory

0x36C50 — это RVA, где функция «WriteProcessMemory» находится в kernel32 (как указано в таблице экспорта). Теперь в виндбг:

0:007> ln kernel32 + 0x36c50
Browse module
Set bu breakpoint

(00007ff9`4a6e6c50)   KERNEL32!WriteProcessMemoryStub   |  (00007ff9`4a6e6c60)   KERNEL32!ZombifyActCtxStub

У нас есть точное совпадение, которое на самом деле является функцией KERNEL32!WriteProcessMemoryStub. Если мы посмотрим на это:

0:007> u KERNEL32!WriteProcessMemoryStub
KERNEL32!WriteProcessMemoryStub:
00007ff9`4a6e6c50 48ff2599150400  jmp     qword ptr [KERNEL32!_imp_WriteProcessMemory (00007ff9`4a7281f0)]
00007ff9`4a6e6c57 cc              int     3

Мы видим, что это просто переход к KERNEL32!_imp_WriteProcessMemory (находится где-то в разделе .idata ядра32).

Теперь, если мы посмотрим, что содержится в этом месте, у нас есть указатель:

0:007> dp KERNEL32!_imp_WriteProcessMemory L1
00007ff9`4a7281f0  00007ff9`496f0ca0

Если мы спросим у Windbg, что это за указатель:

0:007> ln 00007ff9`496f0ca0
Browse module
Set bu breakpoint

(00007ff9`496f0ca0)   KERNELBASE!WriteProcessMemory   |  (00007ff9`496f0dc4)   KERNELBASE!OpenWow64CrossProcessWorkConnection
Exact matches:
    KERNELBASE!WriteProcessMemory (void)

Мы видим, что на самом деле «настоящее» местоположение WriteProcessMemory находится в kernelbase.dll.


примечание: вы можете выполнить две последние команды в одной с помощью dps:

0:007> dps KERNEL32!_imp_WriteProcessMemory L1
00007ff9`4a7281f0  00007ff9`496f0ca0 KERNELBASE!WriteProcessMemory

Используемая команда Windbg:

person Neitsa    schedule 13.05.2020
comment
Большое спасибо! вы случайно не порекомендуете какие-то ресурсы для обучения виндбг, кажется, их огромное количество, но ни один из них не поможет вам на практике! - person Mohamed341; 14.05.2020
comment
Еще один вопрос, когда я проверяю стек, я замечаю, что в некоторых примерах он имеет формат адреса возврата CHILD EBP, а затем информацию. В то время как у меня он показывает обратный адрес и информацию CHILD SP, есть ли причина, по которой некоторые стеки с командой k отображаются по-разному? - person Mohamed341; 14.05.2020
comment
@Mohamed341 1) Единственный учебник, о котором я могу думать, находится в Практическая реверсивная инженерия (отказ от ответственности: она была написана моими друзьями) В ней есть отдельная глава о практике работы с windbg. 2) Это зависит от используемого вами «вкуса» Windbg: версия x86 показывает дочерний EBP, а версия x64 показывает дочерний SP (даже при отладке кода x86). - person Neitsa; 15.05.2020