Запускаю калькулятор CreateProcessA(... CREATE_SUSPENDED...) Нужно найти базу, по которой он загружен в памяти, при этом само приложение не должно начать работать. Пробовал с CreateToolhelp32Snapshot( TH32CS_SNAPMODULE..) - дает пустой список модулей (если запустить без флага CREATE_SUSPENDED - то все ок). Та же беда через ZwQueryInformationProcess - узнаю PEB и читаю указатели. Когда процесс "стартует замороженным" поле PPEB_LDR_DATA Ldr; еще пустое. Вопрос: как сделать? (нужно именно самому научиться дампить). Причем Process Explorer от Марка показывает адрес модуля и ntdll.dll (только их 2). Тут только юзермод.
krol Дай калькулятору запуститься то. Перед снятием дампа "останови" все потоки калькулятора. Узнай базу основного модуля и читай секции через VirtualQueryEx.
Booster, это я могу, но не факт, что программа спроецирована по тому же адресу? В 7-ке разве не по рандомным адресам мапится?
krol Программы всегда спроецированы по фиксированному адресу, рандомными могут быть только базы библиотек(и то не всех, а которые поддерживают это).
Booster Address Space Layout Randomization (ASLR) ASLR moves executable images into random locations when a system boots, making it harder for exploit code to operate predictably. For a component to support ASLR, all components that it loads must also support ASLR. For example, if A.exe consumes B.dll and C.dll, all three must support ASLR. By default, Windows Vista and later will randomize system DLLs and EXEs, but DLLs and EXEs created by ISVs must opt in to support ASLR using the /DYNAMICBASE linker option. ASLR also randomizes heap and stack memory: When an application creates a heap in Windows Vista and later, the heap manager will create that heap at a random location to help reduce the chance that an attempt to exploit a heap-based buffer overrun succeeds. Heap randomization is enabled by default for all applications running on Windows Vista and later. When a thread starts in a process linked with /DYNAMICBASE, Windows Vista and later moves the thread's stack to a random location to help reduce the chance that a stack-based buffer overrun exploit will succeed. http://msdn.microsoft.com/en-us/library/bb430720.aspx krol Смотри в сторону трасировки, а не через ж** делать ... CreateProcessA(... CREATE_SUSPENDED...) do { WaitForDebugEvent(); switch () { case CREATE_PROCESS_DEBUG_EVENT: //Это то место где вы хотите сделать дамп, тольк зачем его сдесь делать? это без смысленно ... break; } } while ( ContinueDebugEvent() );
shchetinin Много приложений юзают /DYNAMICBASE? Ещё можно запросить закоммиченые страницы и сделать по ним поиск сигнатуры.
shchetinin То что нужно! Только флаг CreateProcessA(... CREATE_SUSPENDED...) - нужно убрать а поставить DEBUG_ONLY_THIS_PROCESS