![]() |
eXeL@B —› Вопросы новичков —› Ollydbg поменять местами две вызываемые функии |
Посл.ответ | Сообщение |
|
Создано: 28 июня 2016 09:46 · Поправил: Dark_Ph0eNix · Личное сообщение · #1 Доброго времени суток. Пришлось в спешном порядке начать изучение реверс-инж. Имеется программа которая по нажатии первой кнопки из эдита переводит текст из анси в оем и выводит его в мемо, при нажатии второй соответственно из оем в анси. Программу писал сам на дельфине, предложение в исходнике поменять местами не устраивает, так как это реализация функций которые используются в другой программе с более большим кодом. Надеюсь понятно написал. Знаний ассемблера "0" Попробовал в оле поменять местами адреса вызова функций CharToOemW и OemToCharW Оригинал 004A7F11 E8 3237F6FF CALL <JMP.&user32.CharToOemW> ; Jump to USER32.CharToOemW 004A7F11 E8 3237F6FF CALL 0040B648 ; Jump to USER32.CharToOemW После подмены 004A7F11 E8 CA3AF6FF CALL 0040B9E0 ; Jump to USER32.CharToOemW Оригинал 004A7FA3 E8 383AF6FF CALL <JMP.&user32.OemToCharW> ; Jump to USER32.OemToCharW 004A7FA3 E8 383AF6FF CALL 0040B9E0 ; Jump to USER32.OemToCharW После подмены 004A7FA3 E8 A036F6FF CALL 0040B648 ; Jump to USER32.OemToCharW Но не получил нужный эффект если ввести больше 1 символа то в поле мемо выводится только первый символ. Подскажите в какие дебри мне окунаться. Конечно хочется простого решения, здесь поменяй 2 байта и там поменяй 2 байта, но адекватно понимаю что не все так просто. Если кто-то сможет реализовать замысел, огромная просьба дать исчерпывающие комментарии к измененному коду, что бы даже котэ смог понять ))) Спасибо заранее. P.S. если надо перезалить exe-шник или нужны исходники пишите. Буду рад конструктивной беседе. ![]() ![]() |
|
Создано: 28 июня 2016 13:44 · Поправил: dosprog · Личное сообщение · #2 Тупо не получится. Разный размер аргументов. CharW - 2 байта юникод OEM - 1 байт ASCII Можно попытаться поменять местами обработчики кнопок ![]() |
|
Создано: 28 июня 2016 14:17 · Поправил: Dark_Ph0eNix · Личное сообщение · #3 dosprog пишет: Тупо не получится. Разный размер аргументов. CharW - 2 байта юникод OEM - 1 байт ASCII Понял. Покопался параллельно в недрах интернета, наткнулся на "хук", пока изучаю и пытаюсь понять откуда ноги растут. Если не возможно произвести подмену местами функции, то возможно ли что бы при вызове функции исходный текст не изменялся. К примеру из этой же программы: Сейчас выполняется edit "йцу" -> button1 -> memo "©жг" Сделать edit "йцу" -> button1 -> memo "йцу" Поясню к чему такой аццкий изврат Есть программа неизвестно кем написанная и отсутствуют исходники. Точно известно что писалась на дельфине 6 В ней есть ряд функций, которые друг за другом выполняют следующее ф1. Вытащить из базы id в переменную ф2. Вытащить из базы город в переменную ф3. Вытащить из базы описание_города в переменную ф4. Преобразовать описание_города из ANSI(1251) в OEM(CP866) ф5. Вытащить из базы еще_что_нибудь в переменную ф6. Распечатать полученную информацию Вот у меня стоит задача: произвести подмену функции ansitooem или Потушить (оставить без изменений описание_города) Проблема в том что есть в описании специфические символы такие как "ӘІҢҒҮҰҚӨҺ"(Казахский алфавит) и вот они благодаря функции "ansitooem" преобразуются в символ "_" HEX:5F Зачем разработчик воткнул преобразование "ansitooem" не известно, но вот эту задачу мне и предстоит решить. Испробованы хитрости, замены кодировки при записи/чтения из базы Думал даже в сторону грузить описание_города в HEX в базу, но так как знаний ассемблера и отладки мало, понимаю что не смогу переписать функцию конвертирования HexToStr на ассемблере и вставить ее вместо "AnsiToOEM" Буду рад услышать все конструктивные предложения И по возможности если кто-то сможет дать какой-то код то с комментариями Заранее спасибо ![]() |
|
Создано: 28 июня 2016 16:07 · Поправил: dosprog · Личное сообщение · #4 Dark_Ph0eNix пишет: Вот у меня стоит задача: произвести подмену функции ansitooem ... ф4. Преобразовать описание_города из ANSI(1251) в OEM(CP866) A почему тогда используются функции с суффиксом "W"? ( Jump to USER32.CharToOemW ) Это юникод. Тогда как ANSI(1251) и OEM(CP866) - обе однобайтные кодировки. ![]() |
|
Создано: 29 июня 2016 06:23 · Личное сообщение · #5 dosprog пишет: A почему тогда используются функции с суффиксом "W"? ( Jump to USER32.CharToOemW ) Это юникод. Тогда как ANSI(1251) и OEM(CP866) - обе однобайтные кодировки. Так мне выдала оля, исходный код в дельфине, предполагаю что 2010 дельфин использует юникод, а дельфин 6 нет. Вот и получается что в моей программе используется юникодовые функции. Code:
Думаю в сторону хуков теперь копать, т.к. смотря на дизассемблированый код вижу что идет обращение к WinAPI функциям. что из (бес)платного можете посоветовать? И есть ли мониторинг/логер обращения к WinAPI фунциям с возможностью посмотреть какие параметры получает/отдает та или иная функция? параллельно ушел распрашивать гугл об этом, но хотелось бы узнать какие вы проверенные программы используете. ![]() |
|
Создано: 29 июня 2016 11:22 · Личное сообщение · #6 |
|
Создано: 29 июня 2016 12:46 · Личное сообщение · #7 DenCoder пишет: В ольке есть диалог Conditional Breakpoints, с его помощью можно логировать и вызовы и аргументы Спасибо буду знать Проанализировал работу программы через API Monitor, серьезный инструмент. Понравилась фишка реалтаймовского хука нужных функций. Читаю теперь материал по поводу хукинга WinAPI функций. Тему пока не закрываю. Как что-то вменяемое смогу организовать поделюсь сюда, ну или как обычно прибегу попрошайничить подсказки и пинки в нужную сторону ))) ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Ollydbg поменять местами две вызываемые функии |