Привет всем, встретил тут в одной темке инфу, что плагино-трейсером можно писать лог выполнения программы, очень хотелось бы воспользоваться этим, но не знаю где найти плагин! Поиск что-то ничего не выдаёт, если можно - ссылочку в студию P.S. если не жалко, то не плохо бы и инструкцию к плагину [ОФФТОП] А www.cracklab.ru и wasm.ru это же разные сайты? Просто почему-то не открывается крэк лаб, с разных компов пробывал...
WantButCant Забудь. Юзермодные трассировщики ничего трассировать не могут, детектитсо крайне просто. Поверь мне.
нужно (желательно) записать выполнение программы на определённом участке (всё что будет происходить внутри call функции), а именно: адрес выполняемой команды,саму команду и совершённые ею действия (чтение/записть в память или регистры) ------------------------------------------ twgt, попробовал OllyHeapTrace (http://www.harmonysecurity.com/OllyHeapTrace.html) и OllyCallTrace (http://www.harmonysecurity.com/OllyCallTrace.html) nobodyzzz, попробывал и гуглить, и рамблерить и яндексить... не то записать нужно примерно так: [адрес текущей команды] сама команда: текущее значение / изменённое значение и того получится такая таблица, в которой будет очень ценная инфа, а ценна она тем, что: ломаю защиту одного сервера lineage от ботов, уже докапался до всего, нашёл де палится бот, в некий пакет пишется число (integer - 4 байта) и это число каждый раз разное; нашёл место в коде движка игры, которое отличается от стандартного - фактически на месте INT3 вырос небольшой код, который вклинивается во что-то а нужен мне лог для того, что я могу отследить искомое число снифером пакетов и затем мог бы в логе выполнения того куска кода найти это число, найти место где оно формируется и уже оттуда "плясать": как оно генерируется
А мне вот такого хочется. Грузим прогу в Olly.Ставим бряки на все вызовы API, запускаемплагин. Тот должен {запускать прогу и снимать бряк на котором остановились} в цикле. Реально ли такое?
GoldFinch, не помогут, ибо: время трассирования ограничено, а для пролистывания 1000-2000 строк кода вручную с записью значений нужно много времени, неужели нет такого плагина, ведь вся эта инфа и так пишется, её просто ужно в фаил писать автоматом xD а IDA умеет писать такой лог?
WantButCant а чем время-то ограничено? ставишь бряк, трасируешь, надоело - идешь пить чай, возвращаешся - трассируешь дальше. Я примерно так ла2 и ковыряю... Потом жмеш F9 и в клиенте видишь забавную анимацию как он обрабатывает все полученные пакеты. А в IDA вообще время не ограничено, заодно сразу видна структура кода, опять же hex-rays помогает.
проблема ограничения времени связана с: входом на гейм сервер, т.к. трассировка будет идти по главному пакету, по которому происходит конект к гейм серверу, то игроку даётся ~30 сек, чтобы его клиент отправил этот пакет, иначе будет дисконект и разумеется за это время я ручками ну никак не успею что-либо записать xD
WantButCant ну будешь ты постоянно вводить логин-пароль, ну и что? у тебя с каким пакетом проблемы-то?
RequestAuthLogin, да с ним не проблемы, а наоборот - в этот пакет последним integer'ом дописывается число, которое как-то генерится, я конечно могу в коде покопать тот call, но в нём ещё десятка 2 call'ов и уйма кода... проблема не в релогине, а в том, чтобы успеть найти место формирования этого числа в коде раньше, чем оборвётся конект, иначе пакет не отправится и я не узнаю, что за число там было P.S. замечу, что я не ошибся, и это не "мусорные байты", т.к. при замене этого числа на 0 сервер начинает воспринимать клиент как бота
WantButCant, у RequestAuthLogin родной формат cSSd, этот dword на конце пакета там всегда, и всегда разный другое дело, что защита в него может писать чтото свое. А работает это так: при нажатии на кнопочку [логин] вызывается UNetworkHandler::RequestAuthLogin(ushort *Login,ushort *Password,int Param) где последний параметр и есть тот DWORD затем RequestAuthLogin вызывает функцию отправки пакета SendPacket("cSSd",ID_RequestAuthLogin,Login,Password,Param) где пакет собирается из частей в буфер, шифруется, и отправляется на сервер. Что там трассировать?
а SendPacket выглядит так: Code (Text): void SendPacket(int Object, char *szFormat, ...) { int _Object; // esi@1 int Data_Size; // eax@3 int Packet_Size; // ebx@4 char Flag; // zf@4 _BYTE Buf_Packet_Data[8190]; // [sp+2h] [bp-1FFEh]@3 va_list va; // [sp+200Ch] [bp+Ch]@1 __int16 Buf_Packet_Size; // [sp+0h] [bp-2000h]@4 va_start(va, szFormat); AllocStackFrame(8192); _Object = Object; if ( *(_DWORD *)(Object + 0x38) ) // hSocket { RtlEnterCriticalSection(Object + 0x4EFC); if ( szFormat ) { Data_Size = AssemblePacket(Buf_Packet_Data, 8190, szFormat, va); if ( Data_Size ) { Packet_Size = Data_Size + 2; Flag = *(_DWORD *)(_Object + 0x50BC) == 0; Buf_Packet_Size = (_WORD)Data_Size + 2; if ( !Flag ) (*(int (__thiscall **)(int, _DWORD, int, int))(*(_DWORD *)_Object + 0x78))( _Object, Buf_Packet_Data, _Object + 0x50C0, Data_Size); send(*(_DWORD *)(_Object + 0x38), (const char *)&Buf_Packet_Size, Packet_Size, 0); *(_DWORD *)(_Object + 0x4978) += Packet_Size; *(_DWORD *)(_Object + 0x497C) += Packet_Size; } RtlLeaveCriticalSection(_Object + 0x4EFC); } else { RtlLeaveCriticalSection(_Object + 0x4EFC); } } }
в том-то и дело, что на нормальных (вроде С4) в конце пишется 0, а на этом серве туда запихали число, трассировать надо, чтобы узнать: каким алгоритмом оно получается?! а для этого я и решил прибегнуть к: лог + пакет в снифере и тогда можно будет посмотреть как оно получается
спасиб, попробую, так выходит, что сами данные пакета будет сформированы по вызову этой функции? или он просто будет собран уже из готовых данных?