Сейчас на форуме: vsv1, r0lka, -Sanchez-, testrev1337, johnniewalker, Kybyx, bedop66938 (+3 невидимых) |
eXeL@B —› Крэки, обсуждения —› Взлом пользовательской контрольной суммы |
Посл.ответ | Сообщение |
|
Создано: 24 июля 2009 18:03 · Личное сообщение · #1 Господа! Имеется программа. Программа использует логин на сервер, после успешного логина идет обычная работа, после неуспешного вываливается в еррор. Процесс активации необходимо разложить по полочкам - для создания своего логин-сервера для данной программы (не разово взломать программу, а именно разложить авторизацию по полочкам). Программа написана на VisualC и активно юзает msvcrt80.dll Авторизация ПОЧТИ разложена, вся. Нужна помощь прогрессивного тутошнего сообщества - у меня затык именно на последнем, финальном этапе процесса (ну, это уж как водится). Итак, авторизация программы идет в такой последовательности: 1. Берется показание сист.таймера (GetTimer) 2. Таймером сидируется генератор случ.чисел (msvcrt.srand() ) 3. Генерируется рандом-число (msvcrt.rand() ). 4. В памяти создается строка для закидывания на сервер (используется несколько параметров - юзернейм итд). Все данные в строке - каждый раз постоянные, КРОМЕ рандомного числа. 5. По определенному алгоритму вычисляется контрольная сумма от этой строки. Ее длина - 8 байт. Запоминается. Так как рандом-число всегда разное - то и crc всегда разный. 6. Строка отправляется на сервер. 7. В ответ на эту строку сервер присылает пакет данных, у которого помимо прочих данных в хвосте записана ответная crc на ранее принятый им пакет. Данные выпарсиваются и юзаются в работе далее, а вот эта вот серверная crc просто тупо построчно сравнивается с той, "правильной", которая была ранее вычислена самим клиентом (см.п.5 выше). Если "то что прислал сервер" совпало с "тем что должно быть" по мнению клиента (все 8 байт в обоих строках совпали) - то логин считается пройденным успешно. Поставлены бряки, процедура вычисления "того что должно быть" от введенной строки - вычислена и выдрана к себе, но вот дальше - у меня затык, и я прошу помощи у опытных крякеров. Дело в том, что процедура имеет минимальную кодовую обвязку в своей шапке, а далее идет тупо МАССА вычислений в коде, безо всяких ветвлений и проверок - код просто тупо исполняется от начала и до конца, и в хвосте возвращает нужные мне 8 байт на строку, скормленную ему в начале. Вопрос в том, что я прошу помощи в переводе этой массы вычислений в высокоуровневый язык (идеально - в перл или пхп, на базе коих и сделан свой сервер). ИДА по паттернам не сказала ничего вменяемого на данный код - это, скорее всего, самописный блок подсчета CRC. Максимум что смогла ИДА - это дать мне помимо АСМа еще и псевдо-C - но код такой что лось ногу сломит, хотя его и меньше асмового.... Прошу у гуру посмотреть на эту процедурку - может, кто-то видел что-то подобное? На что это вообще похоже? Я подозреваю, что это ВОЗМОЖНО какая-то стандартная процедура, просто ИДА ее дизассемблировала до кучи вместе со всем остальным, а в сорце она возможно пишется-то одной строчкой, типа result=MD5(stroka), и дело с концом....Все нужное прилагаю, в архиве: 1. Код всей процедуры в асме (ида) 2. Код всей процедуры в псевдо-С (ида+HexRays) 3. график шапки процедуры в наглядном виде (ида) 4. пример входной строки (выход с кода - ВСЕГДА 8 байт бинари, семпла не прилагаю за ненадобностью). С удовольствием отвечу на дополнительные и наводящие вопросы. Очень хочется разобраться и вменяемо повторить эту процедуру - с некорректной crc в ответном пакете сервера клиент не залогинится.....Задача стоит ТОЛЬКО в повторении алгоритма перлом\пхп...ХЕЛП МИ!!!!!! 71bb_24.07.2009_CRACKLAB.rU.tgz - subroutine.rar |
|
Создано: 24 июля 2009 18:54 · Личное сообщение · #2 |
|
Создано: 24 июля 2009 19:02 · Личное сообщение · #3 собери dll и используй её в качестве модуля расширения для php, тогда не придётся морочиться с переводом листинга на php Ога. Я уже думал над этим, но хотелось бы изящности и "цивилизованных методов".... Все же что-то мне подсказывает, что там ОБЫЧНАЯ функция, ибо смысла писать супер-пупер защиты там нету (прога попсовая и фришная). Логин нужен скорее всего для отсева ботов и циничного левого скачивания контента любой качалкой - прологиненному клиенту выдается сессия для работы, а без сессии - не пущаетЪ)... Вот, хотелось бы именно ПОНЯТЬ оный до сорцев, и воплотить у себя. ДЛЛка - это совсем уж неправославно, и крайний метод имхо... |
|
Создано: 24 июля 2009 21:57 · Личное сообщение · #4 Да, кстати: 1. Прога от 2005го года, так что чего-то особо нового и изощренного от алгоритмов ожидать имхо не следует 2. Совсем рядом с вышеуказанным кодом (в рамках формирования строки перед отправкой ее на сервер) прога активнейше юзает Base64.Encode. Но нужный мне CRC не похож на Base64 - во-первых CRC всегда 8 байт, во-вторых оные - всегда бинарь, а не текст, и в третьих - при изменении хотя бы одного байта в начальной строке CRC меняется кардинально весь, а не в какой-то своей части как это было бы в случае Base64. |
|
Создано: 24 июля 2009 22:15 · Личное сообщение · #5 |
|
Создано: 24 июля 2009 22:33 · Личное сообщение · #6 Jupiter пишет: прогу выложи - процесс быстрее пойдёт А смысл? Она во-первых - здоровенная по трафу, во-вторых - основной вопрос не в проге уже, а в алгоритме подсчета CRC. Хакать в проге уже ничего не надо, саму прогу я давно пропатчил, чтобы она уходила в успешный логин по всем НЕПРАВИЛЬНЫМ пакетам с сервера (JZ-->JNZ, дело замены одного байта), кои заведомо неправильные пакеты я Апачем и отдаю, с нулями вместо CRC....Всё работает, место патча - верное, и гнездо у логина - именно в этом месте. Но сейчас надо именно правильные пакеты со своего сервера - хочется именно правильный сервак в локалке, чтобы не искать и не париться с патчами каждой новой вышедшей версии, а раз посидеть и сделать правильную отдачу на все последующие версии (ну, пока разрабы не прочухают и не сменят). И вопрос оных правильных пакетов - всего-то алгоритм определить, кой в первом посте и приаттачен... Если надо какие-то процедурки, регистры\стек на входе\выходе - так только попросите ж, всё дам..... Моего умишка перевести ЭТО в высокоуровневое - уже не хватает, к сожалению, о чем и сабж...Да еще С\C++ не владею абсолютно, даже понятия не имею - тот псевдо-С с ИДА - он рабочий, или проще сразу выкинуть.... с АСМом как раз все понятно (насколько у меня хватило усидчивости), но эти 15К строк я буду переводить лапками весь остаток своей жизни......... |
|
Создано: 24 июля 2009 23:07 · Поправил: Nowar · Личное сообщение · #7 |
|
Создано: 24 июля 2009 23:31 · Личное сообщение · #8 parasss пишет: А смысл? смысл - посмотреть самому. parasss пишет: здоровенная по трафу если пара сотен мегов - то не проблема но обычно проге для минимальной работы столько не нужно parasss пишет: основной вопрос не в проге уже, а в алгоритме подсчета CRC это понятно и с этим у меня непонимания не возникало parasss пишет: пока разрабы не прочухают и не сменят это спустя 4 года то? parasss пишет: Если надо какие-то процедурки, регистры\стек на входе\выходе - так только попросите ж, всё дам надо прогу полностью. не надо под дурачка работать! не хочешь выкладывать прогу - так и скажи, не нужно под всякими предлогами отмазываться! parasss пишет: но эти 15К строк я буду переводить лапками весь остаток своей жизни там большая часть кода прекрасно сворачивается макросами ----- EnJoy! |
|
Создано: 25 июля 2009 08:11 · Поправил: parasss · Личное сообщение · #9 если пара сотен мегов - то не проблема ДВДюк, в сетапе, 3.2Гб, 8 файлов вида setup.exe, data.01, data.02 итд. Тебе может и не проблема - а у меня исходящий траф 100мб на МЕСЯЦ, после выюзывания коего не коннектится даже аська со своими скромными запросами к инету. 3.2Гб - это 32 месяца...(((( это спустя 4 года то? Новые версии выходят и присылаются (на дисках) постоянно, кои и ломать уже устал. Последняя пришла 2 недели назад. Препарируемая именно в данном конкретном случае - от 2005 года, одна из первых доступных мне версий. Она банально быстрее ворочается на моем компе, и еще\уже проходит логин на родном сервере и полностью работоспособна в рамках функционала 2005го года -> отлаживать проще. надо прогу полностью. не надо под дурачка работать! не хочешь выкладывать прогу - так и скажи, не нужно под всякими предлогами отмазываться! Хм. Я разве дал повод для подобных фамильярностей? Прога называется TravFlex Online (http://www.11infotech.com/travel-solution/travflex.php), клиент бесплатный и рассылается в виде апдейтов всем партнерам на дисках, а вот за установку локального сервера (где логин и обычный SQL-базовод) дерут совершенно невменяемую денюжку (порядка 20.000$ разово), причем техники приезжают ставить это все лично и клиенту на руки ничего не дают, кроме как установленного сервера и UID\pass на каждого уполномоченного работника. Ну или подписать с ними контракт и юзать ихний сервер в ихней шарашке удаленно (примерно десятая часть от вышеуказанной суммы в год). Физического доступа к родному серверу у меня нет - снять имидж с диска не предлагать. там большая часть кода прекрасно сворачивается макросами Оппа. А подробнее, плз? |
|
Создано: 26 июля 2009 00:10 · Личное сообщение · #10 parasss пишет: ДВДюк, в сетапе, 3.2Гб Jupiter пишет: обычно проге для минимальной работы столько не нужно я думаю, что исполняемый файл поменьше весит. parasss пишет: Хм. Я разве дал повод для подобных фамильярностей? обрати внимание: exe-шник проги ты так и не выложил я скажу так: хотел бы выложить файл - давно бы выложил. когда речь идёт от проге за 20 килобаксов, смешно слышать про траф в 100 мегов на месяц предлагаю совсем уж простой вариант: выложи idb (IDA Database) теперь про макросы. смотри код процедуры sub_100012D0 (я так понимаю, этот код в dll) лучше всего смотреть этот код в IDA выделяешь регистр, IDA подсвечивает все такие же регистры - ты можешь явно углядеть одинаковые блоки массив - от 0 до 0FFh (от 0 до 255), всего 256 (100h) элементов набор команд очень мал: mov, not, xor, and, imul, sub пример блока: mov reg8_A,[reg32+const1] mov reg8_B,[reg32+const2] add reg8_B,reg8_A mov [reg32+const2],reg8_B его можно просто выразить через макрос в константах разных блоков есть опеределённые зависимости, я бы даже сказал последовательности ----- EnJoy! |
|
Создано: 26 июля 2009 18:49 · Поправил: parasss · Личное сообщение · #11 речь идёт от проге за 20 килобаксов Прога бесплатна. Платен свой собственный выделенный сервер к ней, кой сейчас и пытаемся создать своими силами. Дело в 8и байтах..... выложи idb (IDA Database) Блин. Так дал же нужный кусок листинга именно с нее. Весь-то зачем? Чем данный кусок не устраивает? Перевести в высокоуровневое надо его, и только его. Весь idb данной дллки (178 метров) дать пока не в состоянии по техническим причинам - см.выше про 100 метров\мес, и про конец месяца на календаре. Возможно, в начале след.месяца админа уломаю выложить, или по GPRS буду уродоваться... Да, кстати - кусок этот не в основном exe, а в одной из дллок. Выложить просто экзешник - ничего не даст, он еще половину пакета к себе захочет при запуске прежде чем начнет запускаться... выделяешь регистр, IDA подсвечивает все такие же регистры - ты можешь явно углядеть одинаковые блоки массив - от 0 до 0FFh (от 0 до 255), всего 256 (100h) элементов набор команд очень мал: mov, not, xor, and, imul, sub в константах разных блоков есть опеределённые зависимости, я бы даже сказал последовательности Эт-то понятно, что что там циклический либо блоковый алгоритм - видно сразу невооруженным взглядом. Непонятно, как ЭТО перевести в нужный мне perl\php...... Кстати, такой вопрос: пока суть да дело - хотелось бы попробовать прогнать логин через ДЛЛку. Теста ради, так сказать. Пожалуйста, пни в сторону линька, где написано как приспособить данный код в свою дллку? То есть, тупо скомпилить этот код (как он есть) внутрь ДЛЛки я еще смогу, но насколько я понимаю - придется же еще озаботиться приемом нужной строки от обработчика php\perl в этот алгоритм, а потом выдачей результата с алгоритма - опять в обработчик. То есть, я смогу тупо сделать функцию в ДЛЛ, например, "CalculateCRC" (с данным кодом как он есть) я смогу, и в пхп-скрипте буду вызывать CalculateCRC(string) - тоже смогу...но вот как данный код получит эту строку - я не догадываюсь.... В оригинале коду через стек передается только оффсет на начало строки, и ее длину. Как оно окажется в стеке при работе через пхп+ДЛЛ - я не представляю...Пни, плиз, в сторону пошагового мануала или тутора... Спасибо. PS: сорри за ламерские вопросы - я изначально не программер (тем более не высокоуровневый виндявый), но решить вопрос таки надо. |
|
Создано: 27 июля 2009 01:14 · Личное сообщение · #12 по поводу написания расширений для PHP можешь поискать по запросу "Extending PHP", а также "Zend API" пример расширений (с сорсами) можешь найти здесь: ----- EnJoy! |
|
Создано: 27 июля 2009 21:28 · Личное сообщение · #13 |
|
Создано: 28 июля 2009 07:58 · Личное сообщение · #14 |
|
Создано: 28 июля 2009 10:16 · Личное сообщение · #15 скомпиленная дллка, ф-ция PacketCRC принимает 3 параметра, конвенция вызовов - как в оригинале нужны данные вызывающей ф-ции, которая в твоём случае - sub_1002B9B0 поэтому я и просил тебя выложить больше данных, т.к. процесс пошёл бы быстрее c413_28.07.2009_CRACKLAB.rU.tgz - TravFlex.PacketCRC.Dll.v0.02.rar ----- EnJoy! |
|
Создано: 28 июля 2009 21:35 · Личное сообщение · #16 |
|
Создано: 29 июля 2009 11:03 · Личное сообщение · #17 скомпиленная дллка, ф-ция PacketCRC принимает 3 параметра К сожалению, php стандартным образом подключения расширений - оную не принимает (при старте php, еще до исполнения каких-либо пользовательских скриптов - еррорит): ------------------- Y:\usr\local\php5>php.exe PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'PacketCRC.dll' in Unknown on line 0 ------------------- В аттаче - пример стандартного расширения php (шло в комплекте с ним), если это поможет разобраться... 3635_29.07.2009_CRACKLAB.rU.tgz - php_pdo_mysql.rar |
|
Создано: 29 июля 2009 14:40 · Личное сообщение · #18 |
|
Создано: 29 июля 2009 15:35 · Личное сообщение · #19 |
|
Создано: 29 июля 2009 15:53 · Личное сообщение · #20 parasss пишет: А....а как мне ее тестировать? ты до сих пор не понял? выложенной тобой инфы не достаточно! я собрал длл на основе твоего дизасма если бы этого было достаточно, то при передаче 3-х параметров (каких - хз), ф-ция возвращала бы нужные данные повторяю снова и снова: то, что ты не хочешь или не можешь выложить dll, приводит только к тому, что я вынужден смотреть всё фактически всплепую, додумывая, что та или иная ф-ция может возвращать ----- EnJoy! |
|
Создано: 29 июля 2009 18:57 · Поправил: parasss · Личное сообщение · #21 я собрал длл на основе твоего дизасма Вот то, что ты выложил - можно ли уже как-то куда-то применить\потестить, имея при себе пхп\перл\асм и нулевые знания в Си? Может, оно УЖЕ работает - а мужики-то и не знают...? я вынужден смотреть всё фактически всплепую Я же отправил всё запрошенное по пунктам, мылом. Если что-то еще надо - озвучь, плз. КРОМЕ больших файлов - ну НЕТУ технической возможности пока что большое выкладывать, ну правила тут такие - траф юзать только по работе, иначе потом связи не будет - а работу спросят, да еще и логи поднимут - куда траф дел... на крякерские форумы, ага...(((((( Мелкое что (в сумме) - да хоть 5 раз на дню.... Откуда я знал что для разборки вся эта куча файлА понадобится, если нужно было только 140Кб работающего кода перевести.... Не обижайся, лучше скажи конкретно, что надо. |
|
Создано: 29 июля 2009 19:17 · Личное сообщение · #22 parasss это длл, скомпиленная из тех исходников, что ты присылал она не является расширением пхп проблема в том, что ты не хочешь присылать .idb и мне приходится просить тебя присылать куски ф-ций, которые мне не видны в общем, мне нужны все ф-ции, которые вызывает sub_1002B9B0 (sub_1004EDF0 sub_1004EC70 sub_1004ED80 и связанные с ними) так же мне нужно определить НАЧАЛЬНУЮ ф-цию, в которую передаются данные для подписи. поскольку idb/dll ты давать не намерен, то тебе придётся сделать это самому мне нужна ф-ция, которая однозначно принимает пакет и считает сумму также мне нужны однозначные данные этой ф-ции (вход - выход) ----- EnJoy! |
|
Создано: 30 июля 2009 07:59 · Поправил: parasss · Личное сообщение · #23 она не является расширением пхп Я понял. Выше я спрашивал уже не про пхп, а про "вообще". Вот то, что ты приаттачил - можно ли уже как-то куда-то применить\потестить? Не обязательно с пхп. Ведь не зря же ты ее приаттачил - мне с ней надо что-то делать, насколько я понимаю? в общем, мне нужны все ф-ции, которые вызывает sub_1002B9B0(sub_1004EDF0 sub_1004EC70 sub_1004ED80 и связанные с ними) Да не вопрос. Почта. так же мне нужно определить НАЧАЛЬНУЮ ф-цию, в которую передаются данные для подписи А зачем? Строка, приходящая на вход алгоритму (вот тому, который в топе прицеплен) - мне известна до байта. Я смогу ее сформировать из посылаемых клиентом данных в любое время (благо что и формировать-то ничего не надо особо - это данные из octet-stream клиента при логине, добитые нулями до кратности 8ке). Нет никакой нужды трейсить и отрабатывать эту строку асмом - я ее прекрасно получу от клиента и отработаю тем же пхп, и подам из переменной на вход PacketCRC(). Потом получу return из PacketCRC() в виде 8и байт crc, дооформлю строку ответа этой контрольной суммой (средствами пхп) и вывалю ответ клиенту. Трейсить в вышележащие процедуры и разбирать всю полученную от клиента строку средствами асма нет нужды, имхо - асм нужен только для расчета crc от поданной на его вход строки (какой бы она ни была, хоть цитата из Пушкина...). Сформировать же эту строку в правильном виде - это уже задача пхп, и эта задача у меня уже выполнена. Могу привести множество примеров валидных строк на входе алгоритма, если нужно. мне нужна ф-ция, которая однозначно принимает пакет и считает сумму sub_10024300 На входе - строка, пример: --------- 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F2 AF 83 C7 CA B6 10 C4 6E 62 00 00 8D 52 C3 77 00 00 00 00 00 00 00 --------- (40 байт, строка в хвосте добита 7ю нулями до кратности 8ке и подана на вход sub_10024300). Эта строка для целей тестирования у меня ВСЕГДА постоянна (в клиенте юзаются неизменные и верные логин\пассворд, где строка выше - это тип_логина(1 байт - хол.старт клиента, полный логин)+UID(16 байт, пустой логин=тестовый вход)+Key(8 байт, пароль "testtest" вбит)+(rand(srand(time))-8 байт, меняю ручками чтобы всегда были постоянные при входе в процедуру)+7 нулей для кратности=40 байт. Больше клиентом в рамках логин-процесса не передается ничего. Выход от этой строки в какой-то конкретный логин: --------- AC CA D8 8E 8D 4A C7 7C --------- (это CRC, которая мне и нужна). По этой crc клиент на тот момент и залогинился. При следующей подаче ЭТОЙ ЖЕ строки на вход ЭТОЙ ЖЕ функции - CRC на выходе будет другим, но и клиент по этой другой crc тоже пройдет авторизацию на тот момент времени и опять залогинится успешно, ибо строка для проверки пришедшей этой другой crc в клиенте тоже будет другой, и обе строки таки опять сойдутся. "Время жизни" одного crc (полученного значения на выходе, по которому клиент все еще сможет авторизоваться) - это что-то около 1 минуты. То есть, если клиент отправит запрос логина на сервер и будет ждать ответа, а я ответ сервера задержу на прокси на время t=<~60сек, а потом отдам - то клиент савторизуется успешно. Если же я задержу ответ на t=>~60сек - то клиент уже НЕ савторизуется, несмотря на то что в него CRC пришла верная, от родного сервера. Причина - при проверке пришедшей crc в клиенте на то время получится уже другая строка crc для проверки, коя и не сойдется с принятой. Вывод: crc от неизменной строки будет разным каждую конкретную минуту? Я не знаю почему выдаются разные значения - в этом и заключается вопрос этой темы, собссно. Подозреваю, что где-то подмешивается time() - благо что значение time() клиент вычисляет заранее, и оно есть в стеке на момент входа в процедуру просчета crc. Но вот используется ли оно там - я не знаю. Если ты заметил вызов каких-то дополнительных параметров внутри функции, которые я тебе еще не давал по мылу - скажи, предоставлю. Надо 10 снимков стека и регистров при 10и разных проходах от неизменной входной строки - скажи, будут. Надо 20 - скажи, будут. Они мелкие, какие-то килобайты - мне нет никакой проблемы их предоставлять хоть 10 раз на дню. |
eXeL@B —› Крэки, обсуждения —› Взлом пользовательской контрольной суммы |