Как найти нужную функцию?

Discussion in 'WASM.WIN32' started by Quark, Feb 23, 2008.

  1. Quark

    Quark New Member

    Blog Posts:
    0
    Как-то слышал о файловом вирусе (С) Z0mbie который использует функции заражаемой программы в своих целях. Каким образом он это делает - просто снифет прогу на сигнатуру стандартных функций crt (sprintf, strcpy и т.д.)?


    Допустим есть несколько версий одной программы. Вообще прога распространяется в сорцах и в общем случае может быть скомпилена на различных компиляторах (gcc, vc). Мне нужно узнать адрес одной из её функций. Думаю как это можно сделать:

    проверять в Пе заголовке версию линкера. Снифить секцию кода на наличие сигнатуры данной функции соответствующей данному линкеру. Придётся прошить несколько сигнатур - для каждого линкера свою. Мало того - вообще-то могут быть и различные настройки линкера.. например стандартный формат функций __cdecl __stdcall __fastcall, различная оптимизация кода ит.д. Понятно что в общем случае эта задача не решается, но может будут какие-то предложения?
     
  2. Booster

    Booster New Member

    Blog Posts:
    0
    Quark
    Какие сигнатуры? Call addr - Это сигнатура?
    Всё что можно этo посмотреть импорт, а он от компилятора никак не зависит. Не путаем объктники с экзешниками. -)
     
  3. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Booster
    наверное, он имеет в виду использование статически прилинкованных библиотечных функций.
     
  4. Booster

    Booster New Member

    Blog Posts:
    0
    rmn
    И что, в этом случае будут сигнатуры? Откуда? LOL. Жжёте не по детски. Спасибо что подняли настроение.
     
  5. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Booster
    Да, точно. FLIRT - это просто выдумка разработчика и то, что мы видели, как Ида распознает библиотечные функции по сигнатурам - массовая галлюцинация.

    Другое дело, что идея поиска и использования этих функций слегка бредовая.
     
  6. Quark

    Quark New Member

    Blog Posts:
    0
    Точно. Я имею ввиду тот-же механизм что и в иде. Определяет же она как-то crt функции причём различных компиляторов/линкеров.

    Вот, например fsopen:
    Code (Text):
    1. .text:0045A134 ; FILE *__cdecl _fsopen(const char *,const char *,int)
    2. .text:0045A134 __fsopen        proc near               ; CODE XREF: _fopen+Ap
    3. .text:0045A134
    4. .text:0045A134 var_20          = dword ptr -20h
    5. .text:0045A134 var_1C          = dword ptr -1Ch
    6. .text:0045A134 ms_exc          = CPPEH_RECORD ptr -18h
    7. .text:0045A134 arg_0           = dword ptr  8
    8. .text:0045A134 arg_4           = dword ptr  0Ch
    9. .text:0045A134 arg_8           = dword ptr  10h
    10. .text:0045A134
    11. .text:0045A134                 push    10h
    12. .text:0045A136                 push    offset stru_47FCE8
    13. .text:0045A13B                 call    __SEH_prolog
    14. .text:0045A140                 call    __getstream
    15. .text:0045A145                 mov     [ebp+var_1C], eax
    16. .text:0045A148                 test    eax, eax
    17. .text:0045A14A                 jnz     short loc_45A15B
    18. .text:0045A14C                 call    __errno
    19. .text:0045A151                 mov     dword ptr [eax], 18h
    20. .text:0045A157                 xor     eax, eax
    21. .text:0045A159                 jmp     short loc_45A180
    22. .text:0045A15B ; ---------------------------------------------------------------------------
    23. .text:0045A15B
    24. .text:0045A15B loc_45A15B:                             ; CODE XREF: __fsopen+16j
    25. .text:0045A15B                 and     [ebp+ms_exc.disabled], 0
    26. .text:0045A15F                 push    eax             ; int
    27. .text:0045A160                 push    [ebp+arg_8]     ; int
    28. .text:0045A163                 push    [ebp+arg_4]     ; int
    29. .text:0045A166                 push    [ebp+arg_0]     ; char *
    30. .text:0045A169                 call    __openfile
    31. .text:0045A16E                 add     esp, 10h
    32. .text:0045A171                 mov     [ebp+var_20], eax
    33. .text:0045A174                 or      [ebp+ms_exc.disabled], 0FFFFFFFFh
    34. .text:0045A178                 call    sub_45A186
    35. .text:0045A17D                 mov     eax, [ebp+var_20]
    36. .text:0045A180
    37. .text:0045A180 loc_45A180:                             ; CODE XREF: __fsopen+25j
    38. .text:0045A180                 call    __SEH_epilog
    39. .text:0045A185                 retn
    40. .text:0045A185 __fsopen        endp
    Да вообще речь даже не в использовании. Просто хочу сделать свою прогу максимум жизнеспособной. можно было бы взять несколько наиболее распространённых версий этой проги и запомнить адрес нужной мне функции, но хочется какой-никакой универсальности.
     
  7. Booster

    Booster New Member

    Blog Posts:
    0
    Quark
    Цитата с сайта IDA о флирте.
    Вы о чём говорите вообще? Вы в своём уме? Я под стулом. -)
     
  8. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Booster
    О поиске функции в образе по ее сигнатуре. А о чем ты? Вылазь уже из-под стула...
     
  9. Booster

    Booster New Member

    Blog Posts:
    0
    rmn
    Ну раз проблем нет, флаг в руки и вперёд.
    Имхо практичекого применения это, кроме как написать ещё одну иду не вижу. А то что была предпринята попытка сделать такое в вирусе, кроме как попыткой и не назвать.
     
  10. Quark

    Quark New Member

    Blog Posts:
    0
    Тем не менее вирь был, да и зомбу все знают, а вот Booster только под столом валяется.
     
  11. Booster

    Booster New Member

    Blog Posts:
    0
    Quark
    И что c того что был? Наверняка работал очень плохо, а теперь вообще врядли работает. Наверняка был сделан только для демонстрации, а практической цели это увы не имеет. Зачем использовать такие сверхненадёжные техники, когда есть намного лучше и проще?
    Имхо это имеет значение только в таких проектах как Ида. Для остального это мягко говоря тупиковый подход.