плагин-трейсер для OllyDbg

Тема в разделе "WASM.BEGINNERS", создана пользователем WantButCant, 20 ноя 2008.

  1. WantButCant

    WantButCant New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2008
    Сообщения:
    16
    Привет всем, встретил тут в одной темке инфу, что плагино-трейсером можно писать лог выполнения программы, очень хотелось бы воспользоваться этим, но не знаю где найти плагин!

    Поиск что-то ничего не выдаёт, если можно - ссылочку в студию :)


    P.S. если не жалко, то не плохо бы и инструкцию к плагину

    [ОФФТОП] А www.cracklab.ru и wasm.ru это же разные сайты? Просто почему-то не открывается крэк лаб, с разных компов пробывал...
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    штатный трейсер ольки умеет записывать трассу в файл

    лол)
     
  3. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    как?

    http://www.wasm.ru/forum/viewtopic.php?id=25334
     
  4. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    http://letmegooglethatforyou.com/?q=write+trace+to+file+OllyDbg
     
  5. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    nobodyzzz
    Совсем не то, что надо, она пишет в файл.
     
  6. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    WantButCant
    Забудь. Юзермодные трассировщики ничего трассировать не могут, детектитсо крайне просто. Поверь мне.
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    twgt
    в файл пишет команды. А что нужно писать?
     
  8. WantButCant

    WantButCant New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2008
    Сообщения:
    16
    нужно (желательно) записать выполнение программы на определённом участке (всё что будет происходить внутри call функции), а именно: адрес выполняемой команды,саму команду и совершённые ею действия (чтение/записть в память или регистры)

    ------------------------------------------

    twgt, попробовал OllyHeapTrace (http://www.harmonysecurity.com/OllyHeapTrace.html) и OllyCallTrace (http://www.harmonysecurity.com/OllyCallTrace.html)

    nobodyzzz, попробывал и гуглить, и рамблерить и яндексить... не то

    записать нужно примерно так:

    [адрес текущей команды] сама команда: текущее значение / изменённое значение

    и того получится такая таблица, в которой будет очень ценная инфа, а ценна она тем, что:

    ломаю защиту одного сервера lineage от ботов, уже докапался до всего, нашёл де палится бот, в некий пакет пишется число (integer - 4 байта) и это число каждый раз разное; нашёл место в коде движка игры, которое отличается от стандартного - фактически на месте INT3 вырос небольшой код, который вклинивается во что-то

    а нужен мне лог для того, что я могу отследить искомое число снифером пакетов и затем мог бы в логе выполнения того куска кода найти это число, найти место где оно формируется и уже оттуда "плясать": как оно генерируется
     
  9. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    А мне вот такого хочется. Грузим прогу в Olly.Ставим бряки на все вызовы API, запускаемплагин. Тот должен {запускать прогу и снимать бряк на котором остановились} в цикле. Реально ли такое?
     
  10. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    WantButCant
    бряки+F7 тебе поможет.
    алсо такие вещи лучше делать в IDA
     
  11. WantButCant

    WantButCant New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2008
    Сообщения:
    16
    GoldFinch, не помогут, ибо: время трассирования ограничено, а для пролистывания 1000-2000 строк кода вручную с записью значений нужно много времени, неужели нет такого плагина, ведь вся эта инфа и так пишется, её просто ужно в фаил писать автоматом xD

    а IDA умеет писать такой лог?
     
  12. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    WantButCant
    а чем время-то ограничено? ставишь бряк, трасируешь, надоело - идешь пить чай, возвращаешся - трассируешь дальше. Я примерно так ла2 и ковыряю... Потом жмеш F9 и в клиенте видишь забавную анимацию как он обрабатывает все полученные пакеты.
    А в IDA вообще время не ограничено, заодно сразу видна структура кода, опять же hex-rays помогает.
     
  13. WantButCant

    WantButCant New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2008
    Сообщения:
    16
    проблема ограничения времени связана с:

    входом на гейм сервер, т.к. трассировка будет идти по главному пакету, по которому происходит конект к гейм серверу, то игроку даётся ~30 сек, чтобы его клиент отправил этот пакет, иначе будет дисконект

    и разумеется за это время я ручками ну никак не успею что-либо записать xD
     
  14. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    WantButCant
    ну будешь ты постоянно вводить логин-пароль, ну и что?
    у тебя с каким пакетом проблемы-то?
     
  15. WantButCant

    WantButCant New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2008
    Сообщения:
    16
    RequestAuthLogin, да с ним не проблемы, а наоборот - в этот пакет последним integer'ом дописывается число, которое как-то генерится, я конечно могу в коде покопать тот call, но в нём ещё десятка 2 call'ов и уйма кода...

    проблема не в релогине, а в том, чтобы успеть найти место формирования этого числа в коде раньше, чем оборвётся конект, иначе пакет не отправится и я не узнаю, что за число там было


    P.S. замечу, что я не ошибся, и это не "мусорные байты", т.к. при замене этого числа на 0 сервер начинает воспринимать клиент как бота :)
     
  16. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    WantButCant, у RequestAuthLogin родной формат cSSd, этот dword на конце пакета там всегда, и всегда разный :) другое дело, что защита в него может писать чтото свое.

    А работает это так: при нажатии на кнопочку [логин] вызывается
    UNetworkHandler::RequestAuthLogin(ushort *Login,ushort *Password,int Param)
    где последний параметр и есть тот DWORD
    затем RequestAuthLogin вызывает функцию отправки пакета
    SendPacket("cSSd",ID_RequestAuthLogin,Login,Password,Param)
    где пакет собирается из частей в буфер, шифруется, и отправляется на сервер.

    Что там трассировать?
     
  17. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    а SendPacket выглядит так:
    Код (Text):
    1. void SendPacket(int Object, char *szFormat, ...)
    2. {
    3.   int _Object; // esi@1
    4.   int Data_Size; // eax@3
    5.   int Packet_Size; // ebx@4
    6.   char Flag; // zf@4
    7.   _BYTE Buf_Packet_Data[8190]; // [sp+2h] [bp-1FFEh]@3
    8.   va_list va; // [sp+200Ch] [bp+Ch]@1
    9.   __int16 Buf_Packet_Size; // [sp+0h] [bp-2000h]@4
    10.  
    11.   va_start(va, szFormat);
    12.   AllocStackFrame(8192);
    13.   _Object = Object;
    14.   if ( *(_DWORD *)(Object + 0x38) )                             // hSocket
    15.   {
    16.     RtlEnterCriticalSection(Object + 0x4EFC);
    17.     if ( szFormat )
    18.     {
    19.       Data_Size = AssemblePacket(Buf_Packet_Data, 8190, szFormat, va);
    20.       if ( Data_Size )
    21.       {
    22.         Packet_Size = Data_Size + 2;
    23.         Flag = *(_DWORD *)(_Object + 0x50BC) == 0;
    24.         Buf_Packet_Size = (_WORD)Data_Size + 2;
    25.         if ( !Flag )
    26.           (*(int (__thiscall **)(int, _DWORD, int, int))(*(_DWORD *)_Object + 0x78))(
    27.             _Object,
    28.             Buf_Packet_Data,
    29.             _Object + 0x50C0,
    30.             Data_Size);
    31.         send(*(_DWORD *)(_Object + 0x38), (const char *)&Buf_Packet_Size, Packet_Size, 0);
    32.         *(_DWORD *)(_Object + 0x4978) += Packet_Size;
    33.         *(_DWORD *)(_Object + 0x497C) += Packet_Size;
    34.       }
    35.       RtlLeaveCriticalSection(_Object + 0x4EFC);
    36.     }
    37.     else
    38.     {
    39.       RtlLeaveCriticalSection(_Object + 0x4EFC);
    40.     }
    41.   }
    42. }
     
  18. WantButCant

    WantButCant New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2008
    Сообщения:
    16
    в том-то и дело, что на нормальных (вроде С4) в конце пишется 0, а на этом серве туда запихали число, трассировать надо, чтобы узнать: каким алгоритмом оно получается?!

    а для этого я и решил прибегнуть к: лог + пакет в снифере и тогда можно будет посмотреть как оно получается
     
  19. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    ставь бряк на вызов UNetworkHandler::RequestAuthLogin и смотри как получается последний параметр %)
     
  20. WantButCant

    WantButCant New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2008
    Сообщения:
    16
    спасиб, попробую, так выходит, что сами данные пакета будет сформированы по вызову этой функции? или он просто будет собран уже из готовых данных?