Здравствуйте. Я аспирант кафедры электроники одного из ВУЗов. Передо мной стоит задача русифицировать программу моделирования электрических цепей “Electronics Workbench v5.12” для студентов. С ассемблером никогда не работал, но знаю архитектуру и базовые инструкции на уровне теоретического институтского курса системного программирования. О реверсинге читал в статьях с вашего сайта. Этих знаний вполне достаточно, чтобы справиться с этим заданием, но у меня возникли некоторые проблемы (из-за отсутствия опыта), поэтому прошу вашей помощи. Мой инструментарий: 1. Отладчик – OllyDbg; 2. HEX-редактор – WinHex; 3. Редактор ресурсов – Resource Hacker; Все названия диалогов, менюшек и элементов находятся в файле «WEWBMSG.RES», поэтому редактор ресурсов ничего по этому поводу не сказал, его я использовал только для правки меню «About» и нескольких иконок. HEX-редактором подправил название одного (для проверки) меню – программа не запустилась (Ошибка: «No env file message located»), вернул изменения обратно – все работает нормально. Правил файл WEWBMSG.RES: с 4C5C Frequency на 4C5C Quequency С помощью отладчика быстро нашел место, где вызывается эта ошибка (после строки 529FDC программа уже не работает): Picture.1 Первое, что сделал – поменял условный переход в строке 529FD5 на безусловный, но тогда программа вылетает с другой ошибкой «Unable to locate file wewb.msg». Далее, я запустил программу два раза: первый раз с исходным файлом WEWBMSG.RES, второй раз с отредактированным и запомнил состояния регистров после процедуры по адресу 529FC3 (слева – запуск успешный, справа – с ошибкой): Picture.2 После этого вручную изменил значения регистров на те, что были при успешном запуске, но программа опять вылетает с ошибкой. Единственный вариант, при котором у меня получилось запустить программу с измененным WEWBMSG.RES – это пройти процедуру по адресу 529FC3 с исходным файлом, а после нее сразу внести изменения в файл вручную, тогда программа загружается с нужным мне текстом. Я понимаю, что проблема именно в этой процедуре и что там, скорее всего, проверяется CRC этого файла (если он не запускается даже при изменении одного символа), но я никак не могу найти это место. Мне необходимо получить программу нечувствительную к изменениям в файле WEWBMSG.RES. Очень прошу помочь. Дистрибутив программы находится здесь: http://fast-help.narod.ru/Program/files/EWB.rar (установка не требуется, 3.7Мб). С уважением, Максим.
этого может не прийдётся делать и в последнюю очередь. Тебе надо изменить надписи, а не поменять логику программы. Берёшь Resourse Hacker и проходишся по все интересующим *.exe & *.dll. Тебя должны интересовать группы ресурсов Menu, String Table, Dialog что получилось у тебя при правке WEWBMSG.RES я не совсемь понял но для подобных тыков лучне сохраняй размер строки
aspirant Сошласен со spencer в том, что логику лучше не трогать, иначе потом могут возникнуть странные баги. С narod.ru качается со скоростью 100 б/с, блин У меня где-то должен быть этот WB 5.12. Если найду, посмотрю что там с ресурсами.
WEWBMSG.RES это не файл с скомпиленными ресурсами, это файл с какимито специфичными для программы данными в её формате о чем говорит строка Electronics Workbench Resource File занимающая в файле самоё почётное место. попытка изменения этого файла приводит к тому что приложение не запускается, согласен - проверка крк. Если так то да, нужно реверсить.
aspirant Реверсить нужно только логику работы с ресурсами, чтобы понять структуру файла WEWBMSG.RES и написать для него компилятор. Работенка неизвестной сложности.
Проблема в том и состоит, что редакторы ресурсов тут категорически не подходят, они просто-напросто ничего не видят, кроме курсоров и иконок (об этом я писал в первом сообщении). Естественно, что этот файл имеет какой-то свой определенный формат, это я понял. Поэтому редактировал его HEX-редактором (в первом моем сообщении написано по какому смещению я редактировал текст с "Frequency" на "Quequency"). Да. В этом файле находятся ВСЕ текстовые надписи, используемые в данной программе (Меню, Диалоги, элементы и т.д.) и действительно, любая попытка отредактировать заканчивается ошибкой запуска. Та процедура, о которой я писал в первом сообщении, отвечает за некую проверку этого файла, в этом я абсолютно уверен, т.к. запуская из под отладчика программу с неотредактированным файлом (ставлю брейкпоинт на эту процедуру), после ее успешного прохода, правлю файл WEWBMSG.RES WinHex'ом и программа отлично запускается, отображая внесенные изменения. Если же исправления сделать до прохождения процедуры - ошибка запуска. Поэтому сомнений нет, что за проверку отвечает именно она и тот код, что находится после нее значения уже не имеет. Я уже сутки копаюсь в этой процедуре, пытаюсь понять логику программы, сравниваю при разных запусках - при измененном файле WEWBMSG.RES и исходном. Но, честно говоря, получается пока не очень хорошо. Я впервые сталкиваюсь с отладчиками/hex-редакторами, поэтому может быть не знаю каких-то методик. Сейчас просто выписываю на бумагу в какие процедуры я зашел, сколько RETов нужно, чтобы вернуться обратно в корневую процедуру и смотрю, где в качестве аргумента передается путь к файлу WEWBMSG.RES и т.д. Но, честно говоря, пока не достиг никаких результатов, кроме как нашел то место, где считывается имя этого файла из EWB.ini и переносится из регистра в регистр Но это можно сделать и без отладчика. Вообще, внутри нее еще десятки процедур - глаза уже пухнут. Надеюсь на помощь знающего человека.
Структура файла ясна - все надписи там никак не скрыты и интуитивно понятны. Это подтверждается тем, что я редактировал их и запускал программу уже с отредактированными надписями (из под отладчика). Но запуск из под отладчика не приемлем ни в каких проявлениях. Нужен обычный, стандартный запуск программы, а для этого нужно отучить программу обращать внимание на изменения в этом файле. А структура файла, я думаю, что важна будет только в том случае, если размер надписи исходной не будет соответствовать размеру надписи желаемой. Но в моем случае, те надписи, которые будут длиннее исходных - будут сокращены до нужных размеров.
Кстати, программа 1998 года. Я не думаю, что там используются средства защиты описанные на вашем сайте - упаковщики, крипторы и т.д. Поэтому врядли это "работенка неизвестной сложности".
Есть подозрение, что "Frequency" можно поменять на, скажем, "Frequenyс", т.е. поменять местами буквы. Если это так, то можно заключить, что используется очень примитивный чексум. ЗЫ: Подозрение возникло при прочтении этой статьи, а EWB я у себя так и не нашёл чтобы проверить.
в таком случае можно было бы просто изменить значение eax на выходе, чтоб программа думала что функция вернула положительный результат однако это не приводит к желаемому... прийдётся немного покопатся...
aspirant Вот как раз структура файла не ясна - он бинарный, хотя в него и вкраплены текстовые строки.
spencer Господин спенсер, не сочтите за хамство, но по-моему вы вообще не читали мое первое сообщение, т.к. все ваши последующие три ответа полностью содержаться в первом посте. Вот, например, ответ на ваше последнее сообщение: а это из моего описания проблемы: Я подумал, может быть внутри этой процедуры заменить несколько команд так, чтобы было все наоборот, т.е. если файл изменен - то он правильный, а если нет, то он неправильный. Мне кажется, это будет легче сделать, чем править логику каких-то процедур. Но, опять же, у меня проблема с поиском этого куска. Quantum Да, действительно, все именно так, как вы пишите. Поменял местами несколько знаков и программа запустилась без ошибки. reverser, Quantum Архив доступен отсюда: http://slil.ru/23484233
Для тех, кто подключился... Похоже с адреса 51E535 как-раз идет загрузка файлов wewb.res, wewbmsg.res в память.
Точно, последние 10 байт каждого файлов хранят информацию о ресурсах (в частности, env.msg и wewb.msg) которые в них находятся. Offset Size Meaning +0 dw количество записей о ресурсах +2 dd смещение первой записи +6 db 2 (некий признак) +7 db CRC +8 dw 0xAAAA - magic
Вот здесь проверка CRC: 0051E5B6 368 push 0 ; whence 0051E5B8 36C push dword ptr [ebx+16h] ; offset 0051E5BB 370 push dword ptr [ebx+4] ; stream 0051E5BE 374 call _fseek 0051E5C3 374 add esp, 0Ch 0051E5C6 368 push edi ; int 0051E5C7 36C push dword ptr [ebx+4] ; stream 0051E5CA 370 call sub_51E2C7 ;подсчет CRC 0051E5CF 370 add esp, 8 0051E5D2 368 cmp al, [ebx+13h] 0051E5D5 368 jnz loc_51E6DB ;здесь мы похоже и вылетаем 0051E5DB 0051E5DB loc_51E5DB: aspirant Попробуй jnz loc_51E6DB заменить на nop.
У меня тут тоже под рукой оказался EWB. loc_51E6DB - это действительно выход. Но вот после отключения CRC вылез месседжбокс: 'An internal error has occurred. Contact ITT. _gb_init.809'
afybc Интересно, но это сообщение появляется при открытии ресурса dither в wewb.res. Ты просто заменил jnz на nop? Если это так, то вывод один - где-то проверяется CRC в самой программе...