![]() |
eXeL@B —› Вопросы новичков —› Помощь в переводе асм кода |
Посл.ответ | Сообщение |
|
Создано: 01 января 2012 15:41 · Поправил: dimka_new · Личное сообщение · #1 С новым 2012 годом уважаемые форумчане ! Столкнулся с проблемой -требуется перевести ассемблерный код в Делфи\паскаль Code:
С ассемблером не дружу - вроде разобрал всю процедуру генерации серийника, но нарвался на непонятный код (выделен символом ?) ![]() |
|
Создано: 01 января 2012 15:58 · Личное сообщение · #2 |
|
Создано: 01 января 2012 16:35 · Личное сообщение · #3 004623D5 . 81E3 FF000080 AND EBX,800000FF <<Прибавляем 800000FF в этой строке не прибавление, а обнуление некоторых бит. aNd вместо aDd Открой это место в ида про и нажми ф5 - получишь свой сишный код 004623DD . 4B DEC EBX ? 004623DE . 81CB 00FFFFFF OR EBX,FFFFFF00 ? 004623E4 . 43 INC EBX вот это похоже на работу со знаком. Может перевод int8 в int32? Вобщем, посмотри хексрейс, там все увидишь ![]() |
|
Создано: 01 января 2012 16:48 · Поправил: MSoft · Личное сообщение · #4 Code:
это не функция рандомизации. Судя по всему, получает нужный совершенно определенный байт. Может введенное имя? Code:
esi - счетчик. Тут он "выравнивается", чтобы быть индексом в таблице. Code:
это та самая таблица. Судя по всему, имеет размер 0х20 байт. Т.е. берется индекс текущего байта, если он больше 20, то грубо говоря он обнуляется, потом из этой таблицы берется байт с этим индексом. Code:
Вот тут число, которое получено в функции "рандомизации" (как ты ее назвал), умножается на тот самый байт из таблицы, приьавляется число 0Е, обнуляются все байты, кроме 8000000ФФ. Судя по всему, просто проверяется, не стал ли символ отрицательным. Если нет, тогда идет прыжок Code:
Если байт стал отрицательным, скорее всего он расширяется до дворда. Мусорный код компилятора скорее всего. Code:
тут полученный байт сохраняется в локальную переменную, потом сравнивается с другой таблицей. Если не равен, идет прыжок ![]() |
|
Создано: 01 января 2012 16:55 · Поправил: MSoft · Личное сообщение · #5 dword counter = 1; dword X = call 00402BC4 X = ((471C0B[counter mod 0x20] * X) + 0E) & 0xFF if (X == 471C1F[counter]) { 004623F1 . C645 FF FF MOV BYTE PTR SS:[EBP-1],0FF <<!!!Требуется попасть сюда 004623F5 . EB 06 JMP SHORT More.004623FD } Вот примерно так это выглядит на чем-то, что отдаленно напоминает си и паскать одновременно ![]() П.С.: перепроверь, я могу ошибаться ![]() |
|
Создано: 01 января 2012 17:02 · Поправил: dimka_new · Личное сообщение · #6 MSoft Да действительно по поводу Call - моя ошибка там формируется значение 4A Пробежался еще раз под отладчиком, получил Code:
Твой код сейчас проверю ![]() |
|
Создано: 01 января 2012 17:08 · Личное сообщение · #7 |
|
Создано: 01 января 2012 17:33 · Поправил: dimka_new · Личное сообщение · #8 Блин, проглядел - ниже ESI сравнивается с 64 и идет оператор jl - на 004623B2 То есть как я понимаю с таблицы берутся разные значения - 0x64 раз и если все правильно - зарег Не догоню только вот это 004623E5 > 885C35 9A MOV BYTE PTR SS:[EBP+ESI-66],BL 004623E9 . 3A9E 1F1C4700 CMP BL,BYTE PTR DS:[ESI+471C1F] и дальше я думаю, все попрет... ![]() |
|
Создано: 01 января 2012 18:38 · Личное сообщение · #9 Code:
это сохранение в локальную переменную. Видимо, где-то дальше используется полученная строка Code:
это сравнение с шаблонной строкой. ESI в обоих случаях выступает как счетчик байт (индекс байта в строке) П.С.: байт 4А - это символ J. Уверен, это прочитанный логин или че ты там куда вводишь ![]() |
|
Создано: 01 января 2012 18:51 · Поправил: dimka_new · Личное сообщение · #10 MSoft Не автор хитер - пункта регистрации нет - проверяется наличие файла в каталоге проги, 0046239B . E8 9407FAFF CALL More.00402B34 - здесь строка, причем код первого символа = 06, нашел прогу отображающую непечатные символы - все вкатило После этой строки добавил 1 - после расчета сдесь 004623E9 . 3A9E 1F1C4700 CMP BL,BYTE PTR DS:[ESI+471C1F] 8 сравнивается с нулем (скажем так с константой 4A) 5B сравнивается с нулем (скажем так с константой DD) ну и т.д. Код который ты разместил чет не могу вкурить... На всякий случай (да простят меня модераторы) - вот ссыль ~500Kb http://rghost.ru/35699079 ЗЫ сама прога не важна - главное опыт ![]() |
|
Создано: 01 января 2012 19:11 · Личное сообщение · #11 |
|
Создано: 01 января 2012 19:14 · Личное сообщение · #12 |
|
Создано: 01 января 2012 19:38 · Поправил: doctor_flasher · Личное сообщение · #13 dimka_new, код, что ты дал, - обертка. Возможно, там вообще только стандартные функции Дельфи. Грузишь все это в ИДУ, применяешь сигнатуры нормальные и уже начинаешь анализировать. Через минут двадцать начнешь привыкать к логике компилятора. А если потом еще и в HexRays, то вообще красота может получиться. ![]() |
|
Создано: 01 января 2012 19:49 · Поправил: Johnny Mnemonic · Личное сообщение · #14 Code:
вазъми idr ![]() |
|
Создано: 01 января 2012 19:51 · Поправил: dimka_new · Личное сообщение · #15 |
|
Создано: 01 января 2012 21:08 · Личное сообщение · #16 |
|
Создано: 03 января 2012 11:37 · Личное сообщение · #17 Вообщем допер как генерируется ключег - сначала формируется строка _SVGame (первый символ непечатаемый - 06), затем любой символ - этот символ умножается на i-значение из таблицы и добавляется E, удаляются два знака спереди - и сравниваются с 30+i символом файла key.reg И так 0x64 раз Сейчас пробую все это заавтоматизировать Прога нафиг не нужна - поспорил с одним товарищем на пузырь коньяка, который выпью с наглой мордой на рождество ![]() Всем спасибо за помощь ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Помощь в переводе асм кода |
Эта тема закрыта. Ответы больше не принимаются. |