Экспортированная функция 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