Добрый день господа! Сушествует следующая проблема: у меня есть библиотека, которая обеспечивает доступ к видеопамяти граф. карты. Lib - небесплатная, в ней в виде баннера при первом выводе на экран вместе с изображением выводится табличка с номером версии библиотеки. Вопрос ->можно как-нить избавиться от этого баннерного сообщения(без покупки библ-ки). Всё это дело немного осложняется тем, что либа построена под WindowsCE + для ARM-процессоров ( КПК ).
вообщем я под MS VS2005-дебаггером прошелся, нашел функцию, в которой идет проверка - нужно ли рисовать баннер. Теоретически ( я в асме - 0 ) можно подправить код, условия, или в начале функции сделать что-то типа ret, чтоб выйти из зло-функции. НО! как я могу сохранить изменения в lib-е? Я так думаю, что простой win32-дизассемблер несможет мне распотрошить либу... есть мысль в hex-редакторе попробовать переписать код в 16-тиричном виде в нужном месте... но как найти это нужное место?! под дизассемблерным кодом я еще более-менее ориентируюсь, но вот HEX-вид либы мне совершенно непонятен... Воины дзена! помогите!!!
так, скачал IDA 4.9. Открыл lib-файл (мне ида навыбор предложила список *.obj - файлов, из которых либа состоит.) Нашел свою функцию, нашел команду, в которой вызывается отрисовка баннера. Теперь можно попробовать занопить это команду, это можно какнить сделать в ИДЕ ? и как мне можно впоследствии сохранить измененную lib'у ?
в Иде посмотри file offset, потом в любом хекс редакторе, например WinHEX правь в Иде тоже можно, она создает diff файл, который обрабатывают сторонние тулзы, т.е. патчат файл основываясь на данных этого файла
в IDA показывается оффсет относительно *.obj - файла. По крайней мере я через Hex workshop нашел этот оффсет, но там совершенно другой код...
так, у меня в окне примерно следующее: .text:00000764 MOV R1, R4 .text:00000768 MOV R0, R5 .text:0000076C BL PHAL::Watermark:raw(PHAL::Surface *,int) .text:00000770 MOV R0, R6 .text:00000774 LDMFD SP!, {R4-R6,PC} могу ли я вместо BL <имя функции> написать BL 00000770 , чтоб просто перепрыгнуть через вызов... ?
блин, я совсем тупой... я немогу найти - КАК их вытащить! можно сделать "produce file", но там нету *.obj
это лучше в bat файл оформить типа Код (Text): @echo off %masm32%\bin\lib libv2.lib /EXTRACT:Release\synth.obj /OUT:synth.obj echo. pause cls
guest123 IDA - продвинутый дизассемблер, но не патчер! Для сохранения изменений и для доставания объектников из либы нужны сторонние утилиты. Asterix уже подробно описал как достать объектник из либы с помощью утилиты lib.exe, которая поставляется вместе с Visual Studio. Исправленный объектник можно обратно засунуть в либу с помощью lib.exe. Полное описание параметров командной строки для архиватора можно найти на msdn.
вау, я его вытащил!!! люди, спасибо вам за помошь! сильно неудивляйтесь, просто мне такими вещами никогда не приходилось заниматься... туплю вот... так, а насчет изменения кода - BL 00000770 вот так вот пойдет? или нужно занопить?
guest123 В оригинале там бранч на какую-то функцию, так? Если метка этой функции определена фиксированно, т.е. код не позиционно-независимый, то просто пропатчить этот бранч нельзя, т.к. его потом затрёт фиксап (релок). Попробуйте. Если не выйдет, будем искать обходные пути.
я поправил 4 байта по нужному смещению в *.obj на 4 нопа 9090 9090. Открываю заново в IDA - на месте бывшей инструкции -> UMULLLSS R9, R0, R3, R0 отсюда вопрос: как выхлядит "nop" в 16-м виде? полазил, нашел FAQ по взлому . Там говорится, что nop - это байт 90h...