Сейчас на форуме: bartolomeo, asfa, _MBK_, Adler (+7 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Компиляция файла ассемблера, созданного декомпилятором |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 12 ноября 2011 16:01 · Поправил: Dim77 · Личное сообщение · #1 Нужно скомпилить ассемплеровский файл, созданный декомпилятором, в данном случае IDA 6.1. FASM не берет, пишет в процессе, что у него закончилась память, MASM ругается на некоторые строчки, говоря что: : error A2066: incompatible CPU mode and segment size. В данном случае имеется в ввиду строка: _text segment para public 'CODE' use32 assume cs:_text Как лучше подойти к решению проблемы? Файл ассемплера залил ![]() |
|
Создано: 12 ноября 2011 16:09 · Личное сообщение · #2 |
|
Создано: 12 ноября 2011 16:18 · Личное сообщение · #3 32 мегабайта асма)) сильно это вы.. http://erfaren.narod.ru/Asm/Erfaren005.htm вот почитайте там вроде мучились, и даже скрипты какие то писали и даже вроде скомпилялось ![]() |
|
Создано: 12 ноября 2011 16:37 · Личное сообщение · #4 Править начал, но хотелось бы понять общие принципы, что IDA не так декомпилирует, на что следует обращать внимание, как декомпилятор настроить, чтобы поменьше править было... Так что руководство от reversecode очень кстати, спасибо. Буду изучать. Одновременно ![]() |
|
Создано: 12 ноября 2011 16:50 · Личное сообщение · #5 |
|
Создано: 02 декабря 2011 01:18 · Личное сообщение · #6 После прочтения статей erfaren(а), очень полезных! удалось устранить многие ошибки компиляции. Осталась одна большая ошибка (и несколько мелких), а именно: undefined symbol... Насколько я понимаю проблема вроде бы в отсутствующем .lib файле , но дело в том, что для всех библиотек программы я создал .lib файлы. И те функции, на которые компилятор ругается там точно есть. Вот пример ошибок и пример строки кода на которую ругается компилятор: Assembling: D2debug261111~.asm D2debug261111~.asm(197) : error A2179: structure improperly initialized D2debug261111~.asm(197) : error A2065: expected : ) D2debug261111~.asm(1166) : error A2008: syntax error : SubStr D2debug261111~.asm(18603) : error A2008: syntax error : SubStr D2debug261111~.asm(55008) : error A2008: syntax error : div D2debug261111~.asm(16233) : error A2008: syntax error : fabs D2debug261111~.asm(1537) : error A2088: END directive required at end of file D2debug261111~.asm(281) : error A2006: undefined symbol : loc_6866BC D2debug261111~.asm(282) : error A2006: undefined symbol : _EH_prolog D2debug261111~.asm(300) : error A2006: undefined symbol : aString1 D2debug261111~.asm(303) : error A2006: undefined symbol : strlen D2debug261111~.asm(309) : error A2006: undefined symbol : a00 D2debug261111~.asm(311) : error A2006: undefined symbol : strlen D2debug261111~.asm(317) : error A2006: undefined symbol : a6t D2debug261111~.asm(319) : error A2006: undefined symbol : strlen D2debug261111~.asm(325) : error A2006: undefined symbol : aA0 D2debug261111~.asm(327) : error A2006: undefined symbol : strlen D2debug261111~.asm(333) : error A2006: undefined symbol : a02 D2debug261111~.asm(335) : error A2006: undefined symbol : strlen D2debug261111~.asm(341) : error A2006: undefined symbol : a6_0 D2debug261111~.asm(343) : error A2006: undefined symbol : strlen D2debug261111~.asm(350) : error A2006: undefined symbol : _exit_0 D2debug261111~.asm(361) : error A2006: undefined symbol : byte_83B1EC D2debug261111~.asm(363) : error A2006: undefined symbol : byte_83B1EC D2debug261111~.asm(364) : error A2006: undefined symbol : byte_83B1ED D2debug261111~.asm(367) : error A2006: undefined symbol : byte_83B1ED D2debug261111~.asm(422) : error A2006: undefined symbol : unknown_libname_59 Строки с 281 по 301: mov eax, offset loc_6866BC ; .text:00401000 call _EH_prolog sub esp, 20h ; .text:0040100A push ebx ; .text:0040100D push esi ; .text:0040100E mov esi, ecx ; .text:0040100F xor ebx, ebx ; .text:00401011 push edi ; .text:00401013 mov [ebp+var_18], esi ; .text:00401014 mov [ebp+var_10], ebx ; .text:00401017 mov [esi], ebx ; .text:0040101A lea eax, [esi+4] ; .text:0040101C mov [ebp+var_4], ebx ; .text:0040101F push eax ; .text:00401022 call sub_530AE7 ; .text:00401023 mov [ebp+var_20], ebx ; .text:00401028 mov [ebp+var_24], ebx ; .text:0040102B mov [ebp+var_2C], ebx ; .text:0040102E mov [ebp+var_28], ebx ; .text:00401031 mov edi, offset aString1 ; "X" ; .text:00401034 mov byte ptr [ebp+var_4], 2 ; .text:00401039 ![]() |
|
Создано: 02 декабря 2011 01:24 · Поправил: reversecode · Личное сообщение · #7 Dim77 пишет: D2debug261111~.asm(282) : error A2006: undefined symbol : _EH_prolog _EH_prolog ну так проверте есть она в вашем lib или нет Dim77 пишет: D2debug261111~.asm(281) : error A2006: undefined symbol : loc_6866BC Dim77 пишет: mov eax, offset loc_6866BC ; .text:00401000 ну так проверте есть у вас леибл loc_6866BC или нет тоесть я так понимаю вы собираете asm не зная даже азов? ![]() |
|
Создано: 02 декабря 2011 01:37 · Поправил: Dim77 · Личное сообщение · #8 |
|
Создано: 02 декабря 2011 01:45 · Поправил: reversecode · Личное сообщение · #9 стоп что вы куда компилируете? Dim77 пишет: D2debug261111~.asm(282) : error A2006: undefined symbol : _EH_prolog на етапе компиляции оно ничего не должно вроде выдавать это extern функция должна быть, т.е. подключаемая а значит в .obj оно должно сначала собратся Dim77 пишет: леибл loc_6866BC это леибл тоесть функция на ссылающаяся на ___CxxFrameHandler с таблицей вообще разберитесь где и как что обьявлено может в области видимости не попадает или прототипа нет ![]() |
|
Создано: 02 декабря 2011 01:55 · Личное сообщение · #10 reversecode пишет: стоп что вы куда компилируете? Компилирую D2debug261111~.asm файл. В headers.inc прописал все lib файлы, которые могут понадобиться. В одном из них точно есть EH_Prolog. Этот lib файл я создал из соответствующего .def. reversecode пишет: на етапе компиляции оно ничего не должно вроде выдавать Да, это должно быть важно потом на этапе линковки, поэтому я и в недоумении, ибо не вижу патерна в ругательствах компилятора... reversecode пишет: это вообще насколько я помню seh таблица или хендлер, посмотрите есть она у вас вообще или нет Проверю. ![]() |
|
Создано: 02 декабря 2011 01:58 · Поправил: reversecode · Личное сообщение · #11 Dim77 пишет: Компилирую D2debug261111~.asm файл. В headers.inc прописал все lib файлы, которые могут понадобиться. В одном из них точно есть EH_Prolog. Этот lib файл я создал из соответствующего .def. фокус в подчеркиваниях в каком то из (или вызываемом или в екстерн) должно быть на одно меньше, я уже не помню точно т.е. к примеру в коде call _EH_Prolog а в екстерн должны быть __EH_Prolog или наоборот ![]() |
|
Создано: 02 декабря 2011 17:44 · Личное сообщение · #12 |
|
Создано: 03 декабря 2011 02:29 · Поправил: Dim77 · Личное сообщение · #13 call _EH_Prolog С этим разобрался. Я несколько раз сохранял асм файл и в одном из сохранений забыл раскрыть все процедуры... Спасибо за ответы, сие была ложная тревога. Теперь компилятор ругается на следующее: D2debug2.asm(3964) : fatal error A1010: unmatched block nesting : ?reserve_message@?$_Order_node_base@W4agent_status@Concurrency@@@Concurrency@@UAE_NH@Z_0 причем по этому адресу такого блока нет. Там есть следующее: sub_403166 proc near ; CODE XREF: sub_4028B6+8Ep ; .text:00403166 arg_0 = dword ptr 4 ; .text:00403166 mov ecx, [ecx+8] ; .text:00403166 push [esp+arg_0] ; .text:00403169 add ecx, 0Ch ; .text:0040316D call sub_404046 ; .text:00403170 retn 4 ; .text:00403175 sub_403166 endp ; .text:00403175 строка 3964: call sub_404046 ; .text:00403170 Hexxx пишет: http://rebl0g.wordpress.com/2011/09/08/реассемблирование-full-version/ на правах рекламы Спасибо. Читаю, просвещаюсь... До данного момента использовал метод Erfaren(a) (см. ссылку выше), все работает, включая большое количество скриптов, но с компилятором вот приходится возиться. ![]() |
|
Создано: 03 декабря 2011 02:40 · Личное сообщение · #14 Dim77 пишет: Теперь компилятор ругается на следующее: D2debug2.asm(3964) : fatal error A1010: unmatched block nesting : ?reserve_message@?$_Order_node_base@W4agent_status@Concurrency@@@Concurrency@@UAE_NH@Z_0 это IDA неправильно распознала поставте там простой безыменный sub_403166 или как он у вас там и вообще вы IDA после анализа смотрели редактировали? а то такое чуство что сразу прямым копипастом)) ![]() |
|
Создано: 03 декабря 2011 14:48 · Поправил: Dim77 · Личное сообщение · #15 reversecode пишет: это IDA неправильно распознала поставте там простой безыменный sub_403166 Не совсем понял, каким образом можно здесь подставить безымянную сабрутину, если существует явное определение процедуры с этим неудобоваримым именем? Кажется нашел в чем дело, хотя и не до конца разобрался. СкриптEfraren(a), который соединяет чанки и чунки почему-то разбил эту сабрутину ?reserve_message... так, что ее конец оказался посередине другого кода (line 200572 )) ), а начало я вообще пока не нашел. reversecode пишет: и вообще вы IDA после анализа смотрели редактировали? а то такое чуство что сразу прямым копипастом)) Руками поменял некоторые имена локальных переменных, чтобы а) они не повторялись, б) не были бы командами ассемблера. Хотя, я это сделал возможно зря, так как тогда у меня один из скриптов Erfaren(a) не работал, а он как раз заменяет имена локальных переменных на удобоваримые значения. Вообще же сейчас работать через компилятор легче, чем все сначала причесывать руками ибо в коде 1184790 строк и все их руками просматривать, это как-то не очень... )) ![]() |
|
Создано: 03 декабря 2011 14:53 · Личное сообщение · #16 |
|
Создано: 03 декабря 2011 16:07 · Поправил: Dim77 · Личное сообщение · #17 А можно на примере? Функция, как вы сказали, эта странная, ибо все что она делает это: .text:00475466 ?reserve_message@?$_Order_node_base@W4agent_status@Concurrency@@@Concurrency@@UAE_NH@Z_0 proc near .text:00475466 ; CODE XREF: sub_47542C+11j .text:00475466 ; sub_47542C+22j ... .text:00475466 xor al, al .text:00475468 .text:00475468 locret_475468: ; CODE XREF: sub_47542C+5Aj .text:00475468 retn 4 .text:00475468 ?reserve_message@?$_Order_node_base@W4agent_status@Concurrency@@@Concurrency@@UAE_NH@Z_0 endp Когда я по ней прохожу скриптом для убирания чанков и чунков, то этот скрипт куда-то переносит тело функции (или я глючу), а с концом не знает что делать и оставляет висеть ни к чему не прикрепленным. Теперь, чтобы перенаправить все вызовы этой функции, мне нужно знать, какой функцией ее заменить. И мне не очень понятно, как это определить? Сейчас взял и вставил определение этой функции (без переименования), как выше написано в код, ошибка исчезла, теперь ругается на следующую. Но меня терзают смутные сомнения, что вместо определения неправильных функций я должен перенаправить обращения к правильным функциям, но я не очень вижу, как их найти, эти правильные функции... ![]() |
|
Создано: 03 декабря 2011 16:17 · Личное сообщение · #18 функция определена не правильно в IDA подводим курсор под ее имя и удаляем этот прототип далее вообще нужно пересмотреть весь листинг в IDA может это и не функция а окончание ее а может это вообще виртуальный вызов прежде чем генерить asm файл в ida, нужно было все проверить и подредактировать дайте оригинал программы если она не большая ~2мб смогу стянуть глянуть ![]() |
|
Создано: 03 декабря 2011 16:31 · Поправил: Dim77 · Личное сообщение · #19 кажется разобрался. В коде есть комменты типа: ; public: unsigned int __thiscall Concurrency::details::SchedulerProxy::GetNumNestedThreadSubscriptions(void). Также в коде есть комменты с указанием на явное имя этой функции типа: ; int __thiscall sub_401506(int, int) Теперь вызовы первой (неправильной) функции заменяем на вызовы второй (sub_401506), а определение первой убираем, правильно? При этом sub_401506 не нужно делать явной (int __thiscall)? При этом правда не очень ясно, куда девать код, что был внутри неправильного определения.... Асм большой - около 54 МБ, что является частью проблемы )). Могу выложить... Или вы хотели ехе-шник? Ехе- 4.4МБ. Выложить? ![]() |
|
Создано: 03 декабря 2011 16:36 · Поправил: reversecode · Личное сообщение · #20 асм не нужен давайте оригинальный exe с которого генерился asm если екзе нет и вы это все правите только в asm, то тогда вас ждут много проблем и подводных камней Dim77 пишет: Теперь вызовы первой (неправильной) функции заменяем на вызовы второй (sub_401506), а определение первой убираем, да Dim77 пишет: При этом sub_401506 не нужно делать явной (int __thiscall)? и да и нет, thiscall итд нужно для hexrays или для того кто разбирает код или для языков высокого уровня компилятор же будет генерить код все равно по asm, ему конвершинал колл не нужны Dim77 пишет: Ехе- 4.4МБ. Выложить? давайте, хотя я вижу вы уже во всем разобрались вообще перед генерацией asm листинга, на етапе разбора exe в начале нужно было поубирать много опций которые IDA генерит в большей степени для анализа/разбора а для asm листинга они лишние и не нужны ![]() |
|
Создано: 03 декабря 2011 16:53 · Поправил: Hexxx · Личное сообщение · #21 Dim77 пишет: но с компилятором вот приходится возиться. Как я вас понимаю. (с) Но все ваши проблемы из-за того что вы оставили всякое распознавание типов, библиотечных функций и т.п. Голую базу гораздо лучше выгонять в ассемблер и потом пробовать скомпилировать. ----- Реверсивная инженерия - написание кода идентичного натуральному ![]() |
|
Создано: 03 декабря 2011 17:12 · Личное сообщение · #22 А что делать с кодом, который внутри неправильной функции - удалить вместе с определением? reversecode пишет: вообще перед генерацией asm листинга, на етапе разбора exe в начале нужно было поубирвать много опций которые IDA генерит в большей степени для анализа/разбора а для asm листинга они лишние и не нужны Возможно так и сделаю, просто было жаль времени, которое я потратил на переименование переменных, чтобы их компилятор понимал... ![]() |
|
Создано: 03 декабря 2011 17:15 · Поправил: reversecode · Личное сообщение · #23 msvcrt это стандартная либа)) Dim77 пишет: А что делать с кодом, который внутри неправильной функции - удалить вместе с определением? непойму вы о чем? Dim77 пишет: Возможно так и сделаю, просто было жаль времени, которое я потратил на переименование переменных, чтобы их компилятор понимал... автоматизируйте это что бы скрипты сами все за вас делали до генерации asm файла Dim77 пишет: text:00475466 ?reserve_message@?$_Order_node_base@W4agent_status@Concurrency@@@Concurrency@@UAE_NH@Z_0 proc near .text:00475466 ; CODE XREF: sub_47542C+11j да кстати это код с exe? что бы я правильно смотрел ![]() |
|
Создано: 03 декабря 2011 17:23 · Поправил: Dim77 · Личное сообщение · #24 Есть определение функции: .text:00475466 ?reserve_message@?$_Order_node_base@W4agent_status@Concurrency@@@Concurrency@@UAE_NH@Z_0 proc near .text:00475466 ; CODE XREF: sub_47542C+11j .text:00475466 ; sub_47542C+22j ... .text:00475466 xor al, al .text:00475468 .text:00475468 locret_475468: ; CODE XREF: sub_47542C+5Aj .text:00475468 retn 4 .text:00475468 ?reserve_message@?$_Order_node_base@W4agent_status@Concurrency@@@Concurrency@@UAE_NH@Z_0 endp Внутри есть код, который не будет использоваться ибо это определение я удаляю, а вызовы этой функции перенаправляю на __thiscall sub_401506(int, int). reversecode пишет: да кстати это код с exe? что бы я правильно смотрел Да, код с ехе. ![]() |
|
Создано: 03 декабря 2011 17:24 · Поправил: Dim77 · Личное сообщение · #25 |
|
Создано: 03 декабря 2011 17:27 · Поправил: reversecode · Личное сообщение · #26 вы удалятее определение поскольку оно фейк и перенаправляете на нормальное определение sub_475466 вообщем то кривое определение IDA вот нормальное ее содержимое Code:
говорюже перед генерацией asm нужно ручками поработать, на то IDA и интерактивная если вам нужно просто пытатся выхлоп компилировать использовали бы старый Sourcer а вообще хорошая C++ программа, с именами классов итд взяли бы и реверснули ее всю, больше бы скилов себе открыли чем банальное переганяние в asm в c++ много подводных камней, хз как вы там с ними в asm справитесь ... и натравите еще rtti4 скрипт что бы rtti разобралось чуствую оно у вас в асме вообще никакое Code:
вообще не правильный прототип вообщем там руками неменьше месяца работать, прежде чем asm генерить ![]() |
|
Создано: 03 декабря 2011 17:52 · Личное сообщение · #27 |
|
Создано: 03 декабря 2011 21:10 · Поправил: Dim77 · Личное сообщение · #28 reversecode пишет: говорюже перед генерацией asm нужно ручками поработать, на то IDA и интерактивная Думаю, что сгенерю по новой с рекомендациями по настройкам и посмотрим, что получится. Как править я понял, придется заняться. Кстати, а как найти правильную функцию для exit_0? В коде нет никаких подсказок, что это могло бы быть... reversecode пишет: а вообще хорошая C++ программа, с именами классов итд взяли бы и реверснули ее всю, больше бы скилов себе открыли чем банальное переганяние в asm Интересная мысль и действительно очень заманчиво... )) Хотелось бы правда еще иметь и асмовский вариант под рукой, так сказать short term solution. vden пишет: А какая конечная цель? Может будет проще прицепить свою длл и в ней уже сделать то что ты хочешь? Конечная цель раширить возможности программы путем вставления туда своего кода. На начальном этапе это можно было бы сделать по аналогии с тем, что уже есть, т.к. код, который нужно будет написать идентичен тому, что уже есть. А как такую длл подцеплять или предлагаете одну из известных длл расширить? ![]() |
|
Создано: 03 декабря 2011 21:14 · Поправил: reversecode · Личное сообщение · #29 Dim77 пишет: А как такую длл подцеплять dll inject function в гейм деве все так делают столько бабла тратится на всякие инжекты переинжекты я даже удивляюсь они бы за это время уже раза три полностью реверснули, но не хотят играть им побыстрее и уже завтра хочется))) Dim77 пишет: Кстати, а как найти правильную функцию для exit_0? В коде нет никаких подсказок, что это могло бы быть... никак это IDA ложно сработала там просто какойто sub_xxxxxxxxx PS как то изучал игруху в которую раза три инжектился всякий доп код и раза два дописывались доп секции .data .text .... это кошмар)) ![]() |
|
Создано: 03 декабря 2011 22:04 · Личное сообщение · #30 reversecode пишет: они бы за это время уже раза три полностью реверснули, но не хотят играть им побыстрее и уже завтра хочется))) Ну в данном случае дело не только в этом, а в том числе и в том, чтобы энтузиазм тех, кто параллельно делает графику и т.д. не угас )) reversecode пишет: это IDA ложно сработала там просто какойто sub_xxxxxxxxx Хмм, так без подсказок в коде найти нужный sub_xxxxxxxxx неполучается.. ) reversecode пишет: как то изучал игруху в которую раза три инжектился всякий доп код и раза два дописывались доп секции .data .text .... это кошмар)) Дык, я думаю оно все же быстрее инжектнуть, чем обратно реверсить. Вот народ и не заморачвается. Опять же нужно себя настроить на довольно долгий проект, хотя как вы и сказали можно многому научиться в процессе. ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Вопросы новичков —› Компиляция файла ассемблера, созданного декомпилятором |