есть. надёжный в отличии от приведённого метода (он базируется на предположении что функции устанавливают ebp-фрейм, что не всегда верно). но и гораздо более сложный.
сначало
Здравствуйте, anonymous185, Вы писали:
A>есть. надёжный в отличии от приведённого метода (он базируется на предположении что функции устанавливают ebp-фрейм, что не всегда верно). но и гораздо более сложный. A>сначало A>
A> DWORD64 ImageBase;
A> PRUNTIME_FUNCTION pRT = RtlLookupFunctionEntry(Rip, &ImageBase, 0);
A> PUNWIND_INFO pui = (PUNWIND_INFO)RtlOffsetToPointer(ImageBase, pRT->UnwindData);
A>
A>ну а затем раскручивать цепочку структур UNWIND_INFO. базовая информация об этом здесь
зачем всё это ? ради c.Rip и c.Rsp только ?? а как насчет _ReturnAddress() и _AddressOfReturnAddress() использовать ?
а линковаться с ntdll.lib, чтобы напрямую вызывать RtlLookupFunctionEntry без всякой фигни — сложно ?
A>зачем всё это ? ради c.Rip и c.Rsp только ?? а как насчет _ReturnAddress() и _AddressOfReturnAddress() использовать ? A>а линковаться с ntdll.lib, чтобы напрямую вызывать RtlLookupFunctionEntry без всякой фигни — сложно ?
про _ReturnAddress() и _AddressOfReturnAddress() не знал, спасибо.
RtlOffsetToPointer — это не функция, это макрос.
#define RtlOffsetToPointer(B,O) ((PCHAR)( ((PCHAR)(B)) + ((ULONG_PTR)(O)) ))
он доступен всем. просто хук — непонял. опять таки это макрос.
Callers of RtlOffsetToPointer must be running at IRQL < DISPATCH_LEVEL if the memory range from Base to Offset is pageable.
идиотское примечание. да в kernel mode нельзя обращаться к pageable memory on IRQL >= DISPATCH_LEVEL. какое это отношение имеет к макросу я плохо понимаю.
вообщем всё это спокойно можно использовать в обычном приложении без всяких проблем
A>Callers of RtlOffsetToPointer must be running at IRQL < DISPATCH_LEVEL if the memory range from Base to Offset is pageable.
A>идиотское примечание. да в kernel mode нельзя обращаться к pageable memory on IRQL >= DISPATCH_LEVEL. какое это отношение имеет к макросу я плохо понимаю.
самое прямое — если адрес pagable и страница сброшена, то при попытке использования этого макроса на высоких irql получишь bsod. Так что насчет "без проблем" — это сильное заявление, надо все-таки смотреть что там за адрес памяти.