Что я хочу сделать. 1. Загрузить дллку 2. Начать по очереди вызывать все функции ею экспортируемые 3. Сохранить ззначение стека до вызова и после. И по разнице найти количество аргументов функции. 4. Сохранить код ошибки Подводные камни: 1. В функции может быть вызван ExitThread, ExitProcess либо необрабатываемое исключение. 2. Функция самостоятельно может изменять обработчики исключений. По умолчанию все функции _stdcall Помогите решить проблему с подовдными камнями, т.к. я не знаю, как обойти ни первый ни второй. =(
1. В функции может быть вызван ExitThread, ExitProcess либо необрабатываемое исключение. Лочь функи через хуки. 2. Функция самостоятельно может изменять обработчики исключений. хз
dyn, qqwe "подводных камней тут гораздо больше. например, как вы узнаете какие параметры передавать функциям?" Брут для любого устраивающего диапазона параметров, для которых значение ошибки будет одинаковым. Похучить все что может вызвать неприятности как предложил x0man. Сделали, занесли в базу а-ля: push <0x0000 - 0x0F400> push <0x0000 - 0x10000> call <Lib.Func> # EAX = 0xC0FFEE # EDX = 0
А не легче ли статическим анализом найти конец ф-ции и посмотреть на сколько байт делается ret ? Помоему как раз в 99% будет креш еще до окончания ф-ции, и ты нифига не сможешь узнать. Даже если внутри этих ф-ций будет устанавливатся сех и ошибки будут обрабатыватся, ret она сделать все равно не сможет, т.к. возьмет из стека неправильный адрес возврата. ИМХО гемор полный все это, зачем это нужно? Для генерации фейковых вызовов апишек ? Ну так можно распарсить либ файлы и вытащить оттуда параметры.
onSide Свой хэндлер на крeш? Нет, RET заберет адрес возврата, который лежит на стеке над параметрами, и только потом откорректирует ESP. Т.е. худший случай - ESP будет выше чем нужно, что и даст понять после вызова, сколько функция принимает на вход.
onSide имхо > 99%. и это хорошо если просто сбойнет, а не сделает чегонить, чего делать не стоит. вообще, подобные дубовые способы лучше испытывать в виртуалке. (а про время какое на это пойдет я вообще молчу. быстрее рары брутить)
onSide ПРо либ-файлы - хорошая идея. Спасибо. Формат где-либо описан? PS: нет, это не для фейковых апи. Это для системы саморазмножения
Угу, насчет этого я протупил, ночью вспомнил и понял что сморозил чушь)) Свой обработчик то можно поставить, тока что ты с ним будешь делать дальше? Допустим func1->func2->crash, ты его словил и что дальше, ты же не знаешь что это func2 крешнулась или func1... Формат либов да, описан )
Если я примерно правильно понял для каких это целей, тому кто делает, всегда очень интересно иметь какой-то предсказуемый результат на выходе =) Ну да ладнл....
А для чего такой тестинг? Даже если не упадёт и вернётся, то наобум передавать параметры это мягко говоря странно. А вообще можно забить в стек много адресов возврата и тогда оно должно с большой вероятностью благополучно вернуться. Правда не факт, что от таких параметров всё-равно крышу не снесёт.