Сейчас на форуме: asfa, _MBK_, Adler, bartolomeo (+9 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Перевернутая функция |
Посл.ответ | Сообщение |
|
Создано: 02 сентября 2012 23:36 · Личное сообщение · #1 Имеется следующий код: Code:
Я его переписал следующим образом: Code:
Но получается все наоборот. У меня начало массива там, где должен быть конец и наоборот. [ebp-14] - аргумент sub_00561299 должен быть равен 0, у меня там адрес... Указатель *р должен смотреть в конец массива - EBP -20, у меня в начало - LEA EDI,[ESI+4] (см ниже) Вот вариант моего кода после компиляции: Code:
Как можно заметить массивы похожи, с несколькими отличиями: 1. Мой массив сохраняется в ESI, оригинальный в EBP. 2. ESI+14 - четвертый элемент моего массива должен быть равен нулю, но это не так. Элемент по адресу [EBP-14]=0 в оригинале. 3. P* - находится по адресу 0х00, и запись массива начинается по этой причине с 0х04, что обрубает первое слово из строки, которая там должна быть записана. В общем, был бы благодарен за правильный пример реверснутого кода выше. Спасибо. ![]() |
|
Создано: 02 сентября 2012 23:52 · Личное сообщение · #2 нифига не понял Code:
вызов Game::sub_004018D6(&Game::offset_006CC64C); а нафига тогда sc инициализировать если вы его не используете, да и вообще. если смысл заменить функцию начинающуюся с "sub esp, 0x18" так и сделайте ее в IDA как функцию, и запустив HexRays увидите как ее заменить ![]() |
|
Создано: 03 сентября 2012 00:42 · Личное сообщение · #3 reversecode пишет: если смысл заменить функцию начинающуюся с "sub esp, 0x18" так и сделайте ее в IDA как функцию, и запустив HexRays увидите как ее заменить Да, смысл в этом. И как раз где-то с ее реверсингом я и накосячил. И кажется уже подозреваю где - у меня в sub_561299 передается адрес, а нужно - значение. Это по поводу пункта 2 в моем первом посте: ESI+14 - четвертый элемент моего массива должен быть равен нулю, но это не так. Элемент по адресу [EBP-14]=0 в оригинале. В Hex получается следующее: Code:
Sc нужно просто для использования структуры Struct_0040BBB6. Можно и без нее, но так удобнее ИМХО. ![]() |
|
Создано: 03 сентября 2012 00:46 · Личное сообщение · #4 |
|
Создано: 03 сентября 2012 00:54 · Личное сообщение · #5 reversecode пишет: ecx передается - разве не видно??? Так и есть, прошу прощения. Таким образом, в моем варианте первые два вызова: Game::sub_004018D6(&Game::offset_006CC64C); и Game::sub_004018D6(Source); проходят нормально, только в первом случае со смещением на 4 по сравнению с оригиналом. Что есть неудобство номер раз. А вот вызов (DWORD)(Game::sub_00561299(sc->UnknownA[4]) + 4); не проходит вообще. Похоже, что это из-за того, что я с передаваемым аргументом накосячил. ![]() |
|
Создано: 03 сентября 2012 00:59 · Поправил: reversecode · Личное сообщение · #6 |
|
Создано: 03 сентября 2012 01:08 · Поправил: Dim77 · Личное сообщение · #7 reversecode пишет: опять запутались с stdcall/cdecl ? ![]() ![]() Hex определяет sub_00561299 как stdcall. Я ее так и определил. Кстати, в IDA это функция near, не подскажете чему она соответствует? Определение: #define FUNC( name, address, ret_type, call_convention, args ) ret_type(call_convention * const name)args = (ret_type(call_convention *)args) address; FUNC( sub_00561299, 0x00561299, DWORD, __stdcall, ( int) ); Странно, мне казалось, что этот ФО был указан в правилах сайта... К тому же у меня он бесплатный. Но не суть. Вот тоже самое, но на rghost ![]() |
|
Создано: 03 сентября 2012 01:59 · Личное сообщение · #8 __thiscall sub_4018D6 __stdcall sub_561299 Code:
Code:
Code:
![]() |
|
Создано: 03 сентября 2012 02:17 · Личное сообщение · #9 Кажется понял. Завтра перепишу свой код. Без переписывания функций __thiscall sub_4018D6 __stdcall sub_561299, ибо мне нужно их использовать такими, какие они есть. Ну, вызовы-то я понятно изменю. Спасибо. А откуда этот код? Мой Нех версии 6.1 выдает то, что я привел выше. И там все было далеко все не так интересно... ![]() |
|
Создано: 03 сентября 2012 10:39 · Личное сообщение · #10 |
|
Создано: 05 сентября 2012 23:58 · Поправил: Dim77 · Личное сообщение · #11 Сделал, заработало ![]() В компилированном коде получилась одна лишняя строчка (по сравнению с оригиналом), которая я не понял, откуда вылезла. ЗЫ Хмм, сейчас подумал, что она вылезла как раз из второй ненужной структуры... Но пока код работает и вроде бы правильно. Точнее можно будет сказать, когда всю функцию полностью реверсну. Code:
reversecode пишет: уметь работать надо, а не просто F5 жать Ну, так учишься обычно постепенно. А если не знать, что там такая функциональность есть, то и искать ее не будешь ![]() ![]() |
|
Создано: 06 сентября 2012 00:04 · Личное сообщение · #12 |
|
Создано: 10 сентября 2012 12:29 · Личное сообщение · #13 |
|
Создано: 10 сентября 2012 13:47 · Личное сообщение · #14 |
|
Создано: 19 сентября 2012 20:18 · Поправил: Dim77 · Личное сообщение · #15 Посмотрел материалы. Пока что не добрался до того же уровня детализации, что приведен выше у reversecode Например, вычислить используемую структуру и то что их две а не одна, пока не удалось. Подредактировал код. Даже в коде, приведенном reversecode не все до конца разобрано. Это не критицизм, а так оно и дoлжно быть, ибо все равно нужно проверять в дебагере, каким бы хорошим авто диссасемблинг ни был. Например, строчка Code:
Code:
![]() |
|
Создано: 20 сентября 2012 00:11 · Личное сообщение · #16 |
![]() |
eXeL@B —› Вопросы новичков —› Перевернутая функция |