| Сейчас на форуме: 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: 
   | Сообщение посчитали полезным: Dim77 | 
| 
 | 
Создано: 03 сентября 2012 02:17  · Личное сообщение · #9 Кажется понял. Завтра перепишу свой код. Без переписывания функций __thiscall sub_4018D6 __stdcall sub_561299, ибо мне нужно их использовать такими, какие они есть. Ну, вызовы-то я понятно изменю. Спасибо. А откуда этот код? Мой Нех версии 6.1 выдает то, что я привел выше. И там все было далеко все не так интересно... ![]()  | 
| 
 | 
Создано: 03 сентября 2012 10:39  · Личное сообщение · #10  | 
| 
 | 
Создано: 05 сентября 2012 23:58 · Поправил: Dim77  · Личное сообщение · #11 Сделал, заработало  . Вот вариант кода, если интересно. Если честно, то не заметил, где в реверсированном коде нужно использовать 2 структуры. Пока вполне хватило и одной. Они все равно идентичны. В компилированном коде получилась одна лишняя строчка (по сравнению с оригиналом), которая я не понял, откуда вылезла. ЗЫ Хмм, сейчас подумал, что она вылезла как раз из второй ненужной структуры... Но пока код работает и вроде бы правильно. Точнее можно будет сказать, когда всю функцию полностью реверсну. 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 —› Вопросы новичков —› Перевернутая функция | 




 Может быть... 
 Для печати