Опять о старом, перехват API функций!

Тема в разделе "WASM.WIN32", создана пользователем LuckyDevil, 6 фев 2012.

  1. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Всем доброго!
    Много статей описано на эту тему, но складывается впечатление, что это просто копи-паст.
    Хотелось бы получить комментарии Форумчан, какие методы на сегодня являются рабочими, если есть примеры, буду признателен.
    Для начала есть такой код:
    Код (Text):
    1. int __cdecl sub_829C7E(int a1, int a2, int a3)
    2. {
    3.   HMODULE v3; // eax@2
    4.   HMODULE v4; // edi@2
    5.   FARPROC v5; // eax@3
    6.   FARPROC v6; // eax@4
    7.   FARPROC v7; // eax@4
    8.   FARPROC v8; // eax@7
    9.   FARPROC v9; // eax@8
    10.   int (*v10)(void); // esi@11
    11.   int (__stdcall *v11)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // eax@11
    12.   int (__stdcall *v12)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // edi@11
    13.   int v13; // eax@13
    14.   int (*v14)(void); // eax@22
    15.   int (__stdcall *v15)(_DWORD); // eax@25
    16.   int (__stdcall *v16)(_DWORD, _DWORD, _DWORD, _DWORD); // eax@27
    17.   char v18; // [sp+10h] [bp-20h]@14
    18.   char v19; // [sp+18h] [bp-18h]@15
    19.   char v20; // [sp+1Ch] [bp-14h]@14
    20.   unsigned int v21; // [sp+20h] [bp-10h]@1
    21.   int v22; // [sp+24h] [bp-Ch]@1
    22.   int v23; // [sp+28h] [bp-8h]@1
    23.   int v24; // [sp+2Ch] [bp-4h]@1
    24.  
    25.   v23 = _encoded_null();
    26.   v24 = 0;
    27.   v22 = 0;
    28.   v21 = 0;
    29.   if ( !dword_AA6610 )
    30.   {
    31.     v3 = LoadLibraryA("USER32.DLL");
    32.     v4 = v3;
    33.     if ( !v3 || (v5 = GetProcAddress(v3, "MessageBoxA")) == 0 )
    34.       return 0;
    35.     dword_AA6610 = _encode_pointer(v5);
    36.     v6 = GetProcAddress(v4, "GetActiveWindow");
    37.     dword_AA6614 = _encode_pointer(v6);
    38.     v7 = GetProcAddress(v4, "GetLastActivePopup");
    39.     dword_AA6618 = _encode_pointer(v7);
    40.     if ( sub_81DF6B((int)&v22) )
    41.       sub_6D1BF0();
    42.     if ( v22 == 2 )
    43.     {
    44.       v8 = GetProcAddress(v4, "GetUserObjectInformationA");
    45.       dword_AA6620 = _encode_pointer(v8);
    46.       if ( dword_AA6620 )
    47.       {
    48.         v9 = GetProcAddress(v4, "GetProcessWindowStation");
    49.         dword_AA661C = _encode_pointer(v9);
    50.       }
    51.     }
    52.   }
    53.   if ( dword_AA661C == v23
    54.     || dword_AA6620 == v23
    55.     || (v10 = (int (*)(void))_decode_pointer(dword_AA661C),
    56.         v11 = (int (__stdcall *)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))_decode_pointer(dword_AA6620),
    57.         v12 = v11,
    58.         !v10)
    59.     || !v11
    60.     || (v13 = v10()) != 0 && v12(v13, 1, &v18, 12, &v20) && v19 & 1 )
    61.   {
    62.     if ( dword_AA6614 != v23 )
    63.     {
    64.       v14 = (int (*)(void))_decode_pointer(dword_AA6614);
    65.       if ( v14 )
    66.       {
    67.         v24 = v14();
    68.         if ( v24 )
    69.         {
    70.           if ( dword_AA6618 != v23 )
    71.           {
    72.             v15 = (int (__stdcall *)(_DWORD))_decode_pointer(dword_AA6618);
    73.             if ( v15 )
    74.               v24 = v15(v24);
    75.           }
    76.         }
    77.       }
    78.     }
    79.   }
    80.   else
    81.   {
    82.     if ( sub_81DFA2((int)&v21) )
    83.       sub_6D1BF0();
    84.     if ( v21 < 4 )
    85.       a3 |= 0x40000u;
    86.     else
    87.       a3 |= 0x200000u;
    88.   }
    89.   v16 = (int (__stdcall *)(_DWORD, _DWORD, _DWORD, _DWORD))_decode_pointer(dword_AA6610);
    90.   if ( v16 )
    91.     return v16(v24, a1, a2, a3);
    92.  return 0;
    93. }
    v11 = (int (__stdcall *)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))_decode_pointer(dword_AA6620)
    v12 = v11;
    v12(v13, 1, &v18, 12, &v20)

    Выделил места, вызова API функций на прямую, как я понимаю. Как с этим бороться?
     
  2. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Сплайсинг.
     
  3. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Да конечно, но результата желаемого не получите, так как расчет точки входа высчитывается динамически.
     
  4. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Что такое расчет точки входа и чего я не получу?
     
  5. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    Все методы рабочие с чего бы им не работать. Читайте одну из копипаст.
     
  6. totimoud

    totimoud New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2012
    Сообщения:
    78
    Отрезать руки, как обычно.

    На сегодня рабочий метод это маршрутизация. Но придётся заюзать немного графов.
     
  7. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    ГЫ. Это значительно сложней. Ковырял один небольшой сэмпл маршрутизации выложенный на руткитс.су несколько дней, пока не врубился. Там действительно все не тривиально. А упомянутые выше варианты просты и в большинстве случаев работают.
     
  8. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    Sholar
    totimoud
    а можно ссылочку где об этом пишут и что это такое ?
     
  9. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
  10. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    Sholar
    Что такое тривиально ?
    Механизмы отложенной передачи управления в общем просты, реализация бывает немного сложной. Но тот пример очень прост, проще не придумать. Обычно народ не привык бегать по стеку или переключаться между копиями проекции, хотя что тут сложного не понятно.

    Это не варианты, это вредительство. Портить код в памяти не годится, это палится и выпиливается. Можно написать простейшую надстройку, которая будет мапить модуля не как RWE-Image, а как RE-Map секцию, либо просто залочить память проекции из ядра. Тогда не нужны будут никакие аверские утилиты - 98% малварки тут же отвалится, к примеру распиаренный зевс выпиливается восстановлением испорченных им секций, ели запись не доступна, то он не будет работать. Помимо статического есть есчо и детект в динамике, не менее важный чем первый.
     
  11. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    LightMoon
    Ваша маршрутицация не всегда подходит. см. IE9( ole32.dll!CoCreateInstance ) x64, когда в импле вместо GetProcAddress происходит редирект на Shim!GetProcAddress, а вот тут получим адресс меньше чем база ole32.dll, соответсвенно лучше будет отказатся от маршрутизации ... думаю причины понятны.
     
  12. sender0

    sender0 New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2011
    Сообщения:
    25
    кем палится, кем выпиливается и кто это использует?
    палить и выпиливать можно что угодно и даже реальные фильтры только кому это нужно
     
  13. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    Ну как жеж чем? Антируткетаме же. И выпиливаюца таки, да, таки на ура. Иногда даже с бсод'аме.
     
  14. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    shchetinin
    ole как и advapi и прочий высокоуровневый шлах идеально подходит для захачивания. Ну вы же не понимаете, по сему вас я с рк и выпилил :lol:

    sender0
    Все это используют. Вы думаете юзер такое создание, которое вообще кроме вконтакте не юзает - нет же, у нас например пакеты софта автоматически ставятся, рку первый инструмент, который юзают при возникновении проблем. Мб у вас юзеры совсем дибилы, я не знаю. Я например не считаю даже за малварь то, что портит в памяти код. Достаточно раз по кнопки дёрнуть, чтоб ваш гуан выпилить окончательно.
     
  15. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    LightMoon
    Вы посмотрите что делает там IEShims.dll а потом будете хачить ...
     
  16. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    shchetinin
    Не имеет значения что он этот модуль делает. Вы понимаете что речь про отложенную передачу управления, реализация которой - три типа маршрутизации. Вызывает к примеру ваш IE9(чисто условно, я хз что он юзает и что за шим тот) какуюнить IEShims.BlackConnect() - это не точка для получения управления. Оно будет получено много ранее, гденибудь в kernel32!GetMDH() и выполнена маршрутизация - стековая, либо потоковая, после чего уже не будет кода IE9, произойдёт однократное переключение на копию проекции. При этом теряет смысл оригинальная проекция - это паразитный модуль, который будет зря висеть в ап. Некоторые проблемы могут возникнуть с векторами, но это локально и очень просто решается их редиректом. Вы явно не понимаете сути отложенной передачи управления.
     
  17. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    LightMoon
    Вы сначало посмотрите на какую проекцию ссылается IE9 при вызове ole32 и найдите её, а потом будем говорить об маршрутизации ... Хотя для патча хватить вызова GetProcAddress который IEShims.dll уже редиректнул. Но вы как всегда не вежда , и потом пишете текст не в тему.
     
  18. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    shchetinin
    При отложенной передаче управления совершенно не имеет значения целевой код. К примеру для захачивания какой нить WriteFile() достаточно похекать AllocConsole().. Нет ничего, что не может быть таким образом похекано. Нет смысла в этом со мной спорить.
     
  19. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    LightMoon
    Можно вообще весь кодес под дебаггером запустить ... что зря ...
     
  20. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    shchetinin
    Что это даст ?

    Патч - детект - выпил. А наличие отладочного порта значения не имеет.