Как-то слышал о файловом вирусе (С) Z0mbie который использует функции заражаемой программы в своих целях. Каким образом он это делает - просто снифет прогу на сигнатуру стандартных функций crt (sprintf, strcpy и т.д.)? Допустим есть несколько версий одной программы. Вообще прога распространяется в сорцах и в общем случае может быть скомпилена на различных компиляторах (gcc, vc). Мне нужно узнать адрес одной из её функций. Думаю как это можно сделать: проверять в Пе заголовке версию линкера. Снифить секцию кода на наличие сигнатуры данной функции соответствующей данному линкеру. Придётся прошить несколько сигнатур - для каждого линкера свою. Мало того - вообще-то могут быть и различные настройки линкера.. например стандартный формат функций __cdecl __stdcall __fastcall, различная оптимизация кода ит.д. Понятно что в общем случае эта задача не решается, но может будут какие-то предложения?
Quark Какие сигнатуры? Call addr - Это сигнатура? Всё что можно этo посмотреть импорт, а он от компилятора никак не зависит. Не путаем объктники с экзешниками. -)
rmn И что, в этом случае будут сигнатуры? Откуда? LOL. Жжёте не по детски. Спасибо что подняли настроение.
Booster Да, точно. FLIRT - это просто выдумка разработчика и то, что мы видели, как Ида распознает библиотечные функции по сигнатурам - массовая галлюцинация. Другое дело, что идея поиска и использования этих функций слегка бредовая.
Точно. Я имею ввиду тот-же механизм что и в иде. Определяет же она как-то crt функции причём различных компиляторов/линкеров. Вот, например fsopen: Code (Text): .text:0045A134 ; FILE *__cdecl _fsopen(const char *,const char *,int) .text:0045A134 __fsopen proc near ; CODE XREF: _fopen+Ap .text:0045A134 .text:0045A134 var_20 = dword ptr -20h .text:0045A134 var_1C = dword ptr -1Ch .text:0045A134 ms_exc = CPPEH_RECORD ptr -18h .text:0045A134 arg_0 = dword ptr 8 .text:0045A134 arg_4 = dword ptr 0Ch .text:0045A134 arg_8 = dword ptr 10h .text:0045A134 .text:0045A134 push 10h .text:0045A136 push offset stru_47FCE8 .text:0045A13B call __SEH_prolog .text:0045A140 call __getstream .text:0045A145 mov [ebp+var_1C], eax .text:0045A148 test eax, eax .text:0045A14A jnz short loc_45A15B .text:0045A14C call __errno .text:0045A151 mov dword ptr [eax], 18h .text:0045A157 xor eax, eax .text:0045A159 jmp short loc_45A180 .text:0045A15B ; --------------------------------------------------------------------------- .text:0045A15B .text:0045A15B loc_45A15B: ; CODE XREF: __fsopen+16j .text:0045A15B and [ebp+ms_exc.disabled], 0 .text:0045A15F push eax ; int .text:0045A160 push [ebp+arg_8] ; int .text:0045A163 push [ebp+arg_4] ; int .text:0045A166 push [ebp+arg_0] ; char * .text:0045A169 call __openfile .text:0045A16E add esp, 10h .text:0045A171 mov [ebp+var_20], eax .text:0045A174 or [ebp+ms_exc.disabled], 0FFFFFFFFh .text:0045A178 call sub_45A186 .text:0045A17D mov eax, [ebp+var_20] .text:0045A180 .text:0045A180 loc_45A180: ; CODE XREF: __fsopen+25j .text:0045A180 call __SEH_epilog .text:0045A185 retn .text:0045A185 __fsopen endp Да вообще речь даже не в использовании. Просто хочу сделать свою прогу максимум жизнеспособной. можно было бы взять несколько наиболее распространённых версий этой проги и запомнить адрес нужной мне функции, но хочется какой-никакой универсальности.
rmn Ну раз проблем нет, флаг в руки и вперёд. Имхо практичекого применения это, кроме как написать ещё одну иду не вижу. А то что была предпринята попытка сделать такое в вирусе, кроме как попыткой и не назвать.
Quark И что c того что был? Наверняка работал очень плохо, а теперь вообще врядли работает. Наверняка был сделан только для демонстрации, а практической цели это увы не имеет. Зачем использовать такие сверхненадёжные техники, когда есть намного лучше и проще? Имхо это имеет значение только в таких проектах как Ида. Для остального это мягко говоря тупиковый подход.