eXeL@B —› Программирование —› _PadLeft прототип функции |
Посл.ответ | Сообщение |
|
Создано: 29 апреля 2013 21:10 · Поправил: KingSise · Личное сообщение · #1 Возникла вот у меня сложность с одной функцией (dll в аттаче) Сама длл написана на борланд делфи, реверсю функцию ibe_PadLeft По идеи она должна принимать всего 2 параметра: строку и то, что к ней с лева нужно добавить, а она принимает аж 6(!) Может кто со свежей головой поможет с прототипом? Code:
в длл Code:
5236_29.04.2013_EXELAB.rU.tgz - BizerbaUDF.dll ----- -=истина где-то рядом=- |
|
Создано: 29 апреля 2013 22:01 · Личное сообщение · #2 |
|
Создано: 29 апреля 2013 22:36 · Личное сообщение · #3 ида ошиблась. int a1<ebx>, int a2<edi>, int a3<esi> - значения этих регистров не используются они сохраняются: # 00B8EACB PUSH EBX # 00B8EACC PUSH ESI # 00B8EACD PUSH EDI и затираются: # 00B8EACE MOV ESI, [ARG.1] # 00B8EADF MOV EDI, ESI # 00B8EB07 MOV EBX, [ARG.3] так что остаётся всего три параметра, передающихся через стэк что есть третий параметр - я так и не врубился вот приблизительный псевдокод: Code:
|
|
Создано: 29 апреля 2013 22:49 · Поправил: yagello · Личное сообщение · #4 Строки в ДЛЛ? Скорее всего PChar'ы с длинами, либо еще плюс счетчики ссылок. IBE,UDF - это не из библиотеки доступа к InterBase? Тогда можно и сорцы взять, они А вообще по логике - дополнить слева до длины ХХХ символом YYY |
|
Создано: 30 апреля 2013 02:14 · Поправил: KingSise · Личное сообщение · #5 -=AkaBOSS=-, спасибо, вроде разобрался, декларация выглядит вот так: Code:
или на С# Code:
Первый параметр - исходная строка, вторая - что будем дописывать слева. Третий параметр самый интересный, в нем у меня и была проблемко. Это вроде как указатель на конец первой строки, причем его значение по модулю должно быть больше длинны первой строки. Тогда функция вернет результат (строку) и заодно перезапишет значение в памяти где хранилась исходная строка заменяемым символом. Veliant пишет: Что мешает нажать Y и вбить Я немножко протупил, не спорю. Конечно же ничего не мешает. Сбил с толку последний параметр. В общем я подключил библиотеку и она вроде как надо работает, пример в аттаче. Далее можно смотреть в отладчике, однако для меня все еще остается загадкой назначения этой функции. Если последний параметр на 1 больше длинны первой строки, то функция допишет символ в начало строки, если вызвать ее несколько раз - заменит посимвольно исходную строку... 6f58_30.04.2013_EXELAB.rU.tgz - Release.rar ----- -=истина где-то рядом=- |
|
Создано: 30 апреля 2013 02:49 · Поправил: -=AkaBOSS=- · Личное сообщение · #6 хоть это и не проверяется явным образом, вторая строка, по-видимому, должна состоять из одного символа, которым и будет выполняться паддинг исходной строки. а третий параметр определяет, до какого размера эта строка должна быть расширена. за каким чёртом оно нужно - большой вопрос, но раз кто-то не поленился написать - значит, была необходимость... наверное ADD: а что за софт эту длл долбит? может, есть смысл поискать примеры использования функции в нём? |
|
Создано: 30 апреля 2013 02:55 · Поправил: KingSise · Личное сообщение · #7 yagello пишет: IBE,UDF - это не из библиотеки доступа к InterBase? В общем да, библиотека работает с фаерберт. Исходников ее нет. -=AkaBOSS=- пишет: за каким чёртом оно нужно - большой вопрос Вот и мне непонятно нах оно нужно. Но при каких то входных параметрах падает сервер фаерберт. Редко, но падает. Причем виновата именно эта функция, логи фаерберда это подтверждают. С отладчиком лезть на сам сервак пока что нельзя. Посему пока попытаюсь локально как то понять, что же такое нужно передать в эту функцию, что бы она рухнула. add -=AkaBOSS=- пишет: сть смысл поискать примеры использования функции в нём? Вряд ли есть примеры. Как видно из названия длл, кодила ее вот эта фирма: www.bizerba.de Причем походу в приватном порядке. И исходниками с примерами она вряд ли поделится. Ноль результатов в гугле: add Зато яндекс результаты уже выдает: add WIN!!!!! Если длинна строки более 525 символов, функция падает. Проблема кажись решена. ----- -=истина где-то рядом=- |
|
Создано: 30 апреля 2013 03:20 · Поправил: mysterio · Личное сообщение · #8 Догадка: Может оно должно так выглядеть ? Второй параметр до какой длины расширять Source. Просто в затирании строки нет смысла - если конечно это не делается специально. Code:
-=AkaBOSS=- Опередил ;) ----- Don_t hate the cracker - hate the code. | Сообщение посчитали полезным: KingSise |
|
Создано: 30 апреля 2013 03:26 · Поправил: -=AkaBOSS=- · Личное сообщение · #9 KingSise пишет: WIN!!!!! Если длинна строки более 525 символов, функция падает. Проблема кажись решена. только сам хотел это отпостить)) да, действительно, если общая длина строки больше 525 символов, после вызова StrPCopy затираются значения в стэке KingSise пишет: заменит посимвольно исходную строку она не заменяет символы, а дописывает их в начало. это при отображении почему-то не учитывается изменённая длина строки, и берутся только первые символы KingSise пишет: Вот и мне непонятно нах оно нужно ну, могу только предположить, что эта функция используется при форматированном выводе для выравнивания текста по правому краю. этим же можно объяснить отсутствие проверки на длину второй строки, а третий параметр - это общая ширина выходящей страницы. таким образом, текст может выравниваться как угодно: точками, пробелами, табуляцией, эскейп-последовательностями, и еще хрен знает чем | Сообщение посчитали полезным: KingSise |
|
Создано: 01 мая 2013 15:16 · Поправил: KingSise · Личное сообщение · #10 решил сделать что бы длл логировала параметры передаваемые в функцию, вроде бы все сделал, работает заебушечки, но только в отладчике. Как я понимаю это из за того, что длл грузится по разным адресам. в аттаче пропатченная длл, cmdlog.exe - просто пишет в текстопыал параметры командной строки, PadLeft.exe - для теста функции. сделал вроде все как положено: добавил секцию, в начале процедуры PadLeft сделал прыг на мой участок кода Code:
далее просто идет запуск логера с параметрами (упрошенный вариант) Code:
Можно сделать и вот так, но опять же, работает ь под отладчиком. Code:
как бы мне все-таки запилить логирование? 98fb_01.05.2013_EXELAB.rU.tgz - test.rar ----- -=истина где-то рядом=- |
|
Создано: 01 мая 2013 15:42 · Личное сообщение · #11 |
|
Создано: 01 мая 2013 16:38 · Личное сообщение · #12 |
|
Создано: 02 мая 2013 09:43 · Поправил: -=AkaBOSS=- · Личное сообщение · #13 KingSise у дллки же ведь есть в импорте GetModuleHandle\GetProcAddress нужно сначала получить адрес ShellExecute, а потом уже вызывать её.. а то у меня что под отладчиком, что без него, вызовы одинаково идут куда-то в ntdll.dll плюс ко всему - эти две константы счастья не добавляют: KingSise пишет: Code:
от них нужно избавиться KingSise пишет: Code:
LoadLibrary и так возвращает либо ноль, либо hModule. GetModuleHandle тут не нужен. и еще одно. вместо того, чтобы вставлять jmp в начало перехватываемой функции, было бы правильней и проще пофиксить её адрес в таблице экспорта, вписав туда адрес своей функции. таким образом, не нужно восстанавливать покоцанный код и можно контролировать состояние стэка после выхода из функции в общем, написал я свой вызов логгера. у меня, вроде бы, работает (разве что cmdlog.exe временами падает при вызове getCommandLineArg) в аттаче - исходник на фасме и пропатченная длл 28e6_02.05.2013_EXELAB.rU.tgz - dlltest.7z | Сообщение посчитали полезным: KingSise |
eXeL@B —› Программирование —› _PadLeft прототип функции |