Здравствуйте, WoldemaR, Вы писали:
WR>Есть проект на VC++. WR>Исходный код могу править как надо.
WR>Как определить Месторасположение некоторой моей функции в *.exe?
.map файлы? AFAIK, они для объектников, но если поиграться, то можно получить хорошие результаты.
WR>Предполагается использовать тупые асм-вставки и использовать их как сигнатуру для поиска в памяти. WR>Если нет более кошерного пути, то прошу — подскажите, какие асм-вставки лучше всего использовать?
Зачем ассемблерные... создай какую-нибудь строку и все... потом по этой строке ищи.
And solder won't keep me together (c)
Re: Как определить Месторасположение моей функции в *.exe
Здравствуйте, WoldemaR, Вы писали:
WR>Есть проект на VC++. WR>Исходный код могу править как надо.
WR>Как определить Месторасположение некоторой моей функции в *.exe?
WR>Предполагается использовать тупые асм-вставки и использовать их как сигнатуру для поиска в памяти.
WR>Если нет более кошерного пути, то прошу — подскажите, какие асм-вставки лучше всего использовать?
Сделай их экспортируемыми.
А дальше уж сам смотри что с ними делать, хошь — GetProcAddress(), хошь — анализ PE.
Честнее получается и надежнее.
Re[2]: Как определить Месторасположение моей функции в *.exe
Здравствуйте, Demon, Вы писали:
D>Сделай их экспортируемыми. D>А дальше уж сам смотри что с ними делать, хошь — GetProcAddress(), хошь — анализ PE. D>Честнее получается и надежнее.
Нет. Такой вариант не катит. (нестану объяснять почему)
К тому-же надо как-то определять конец функции.
Re: Как определить Месторасположение моей функции в *.exe
Здравствуйте, WoldemaR, Вы писали:
WR>Если нет более кошерного пути, то прошу — подскажите, какие асм-вставки лучше всего использовать?
первое, что пришло в голову — вставить в начало и конец функции int 3, штук несколько. такой код точно в обычной жизни не встречается . А, проанализировав, забить nop'ами, чтобы не мешались.
Re[3]: Как определить Месторасположение моей функции в *.exe
Здравствуйте, WoldemaR, Вы писали:
WR>Здравствуйте, Demon, Вы писали:
D>>Сделай их экспортируемыми. D>>А дальше уж сам смотри что с ними делать, хошь — GetProcAddress(), хошь — анализ PE. D>>Честнее получается и надежнее.
WR>Нет. Такой вариант не катит. (нестану объяснять почему)
WR> К тому-же надо как-то определять конец функции.
вот с этим могут быть проблемы... никто не обещал что "конец у функции в машинном коде" буит один
что касаца вставок это может быть много чего... примеры:
push eax
mov eax, 0DEADFACEh
pop eax
; или
jmp label
db'my MEGA function starts here'label:
при определенных обстоятельствах можно убрать сохранение|восстановление eax...
Re[2]: Как определить Месторасположение моей функции в *.exe
Здравствуйте, Conr, Вы писали:
C>Здравствуйте, WoldemaR, Вы писали:
WR>>Если нет более кошерного пути, то прошу — подскажите, какие асм-вставки лучше всего использовать? C>первое, что пришло в голову — вставить в начало и конец функции int 3, штук несколько. такой код точно в обычной жизни не встречается . А, проанализировав, забить nop'ами, чтобы не мешались.
оч многое в данном предложении зависит от... начиная от задачи (полные усолвия которой мы кстати не знаем) и заканчивая библиотеками|тулзами|ОСями используемыми в проекте.
`0xCD 0x03' сколько бы ни было штук могут этой функции и не принадлежать
это чужая прилинкованная библиотека
это пролог|эпилог компилятора (кто его туда сунул и почему он такой -- другой вопрос)
мы выполняемся под отладчиком или какойлибо другой странной тулзой... или это просто юзер из SoftIce "шутит"
идея забить нопами тоже во многом спорна... некоторые ОС в таком случае воплне могут "забить" закой процесс насмерть за это
Re[3]: Как определить Месторасположение моей функции в *.exe
Здравствуйте, zaufi, Вы писали:
Z>оч многое в данном предложении зависит от... начиная от задачи (полные усолвия которой мы кстати не знаем) и заканчивая библиотеками|тулзами|ОСями используемыми в проекте.
Ну, исходя из VC++ можно предположить что все-таки Windows
Z>`0xCD 0x03' сколько бы ни было штук могут этой функции и не принадлежать Z> это чужая прилинкованная библиотека
Код свой, потому как есть возможность его менять.
Z> это пролог|эпилог компилятора (кто его туда сунул и почему он такой -- другой вопрос)
за тикие прологи стрелять надо через повешение Опять-таки помним про VC++, он таких финтов вроде не делает
Z> мы выполняемся под отладчиком или какойлибо другой странной тулзой... или это просто юзер из SoftIce "шутит"
насколько я понимаю, планируется шифровать или как-то видоизменять функции налету, без участия пользователя. + присутствие отладчика можно при необходимости попытаться обнаружить.
Z>идея забить нопами тоже во многом спорна... некоторые ОС в таком случае воплне могут "забить" закой процесс насмерть за это
ну не нопами, так push eax xor eax, eax pop eax, это несущественно. Если все так серьезно можно взять ade32 или любой другой disam engine и морфить налету. Кстати, а можно поподробнее прокомментировать бан за нопы от системы? Не приходилось как-то сталкиваться...
Re[2]: Как определить Месторасположение моей функции в *.exe
Здравствуйте, Conr, Вы писали:
C>первое, что пришло в голову — вставить в начало и конец функции int 3, штук несколько. такой код точно в обычной жизни не встречается . А, проанализировав, забить nop'ами, чтобы не мешались.
А загляни-ка в дизасм к PE32 от VC++ и посчитай, сколько там этих int 3 (0xCC) в начале и конце функции
--
wbr, icestudent
Re: Как определить Месторасположение моей функции в *.exe
В чём вопрос вообще? Адрес функции известен на стадии компиляции. Или тебе нужно определить RVA её? Ну тогда если известен IMAGE_BASE (задаётся в опции линкера), тогда RVA = VA — IMAGE_BASE.
--
wbr, icestudent
Re[4]: Как определить Месторасположение моей функции в *.exe
Здравствуйте, Conr, Вы писали:
C>ну не нопами, так push eax xor eax, eax pop eax, это несущественно. Если все так серьезно можно взять ade32 или любой другой disam engine и морфить налету. Кстати, а можно поподробнее прокомментировать бан за нопы от системы? Не приходилось как-то сталкиваться...
имееца ввиду AV т.к. кодовый сегмент может быть execution only -- т.е. туда не то что писать, почитать не дадут (без извратов)