Опитът разглобяване голям
След това, преди година, аз се опитах да разглобите една проста програма, и беше ужасно изненадан, че Disassembler прави го обърка и програмата не работи, както трябва, когато отново asseblirovanii. В същото време аз бях в състояние да говоря с опитен човек, и въпреки че се чувствах наивно глупак, аз бях в състояние да намери важно: FULL, автоматично демонтаж НЕВЪЗМОЖНО върху текста, който дава Disassembler, трябва доста дълго време да работи преди сглобяване на текста даде работеща програма.
В бъдеще ще се опитам да ви разкажа за техниките, които правят "лош" текста в "добра". т.е. в текста, което не само дава правилната програма, работеща в събранието, но също така ви позволява да промените себе си за подобряване на първоначалната програма.
ЗАЩО DisDoc?
SOURSER - познато име сред всички, които поне смътно чувал dizasseblirovanii. Смята се, че това dizasseblera прекрасно, мощен, все още няма конкуренти. Мисля, че слуховете за огромни ползи SOURSERa силно преувеличени. Останах с впечатлението, че на Шри dizassemblirova малки програми (до 7 кб.) SOURSER предпочитане. Когато програмата е голям (в моя случай - 58 KB), SOURSER е много бавен и, по мое мнение, не е предимство.
Изборът Disassembler DisDoc 2.3 беше за мен по много поводи. От работа, получих текст за това как да използвате асемблер SOURSERa (версия 3.07), и с помощта на Disassembler DisDoc 2.3. След това, както текстът след премахването на очевидни грешки, бяха да се съберат. Така че, това, което е бил издаден SOURSERom, окачени наведнъж, и това даде DisDoc 2.3, преди да се мотае, доведени до екрана на няколко реда. Това определя избора. В този процес, много пъти съм имал възможност да се оцени основно предимство Disassembler DisDoc - интуитивен, neizoschrenny, удобен и компактен обява.
За да се разбере бъдещето, трябва да се запознае с преминаването на вписването, което дава DisDoc 2.3
Във всеки случай, не забравяйте да се срещнат
основните проблеми
1. OFFSETa проблем
Да предположим, че в текста, който е издал dizaccembler има фрагмент:
Може би там ще се появят много съмнения - дали да замени номер в съответното OFFSET необходимостта - в крайна сметка, изглежда, в това данните за повторно сглобена програма ще има същото компенсира? За съжаление, това не е така. На първо място, ние обикновено не знам какво е бил използван асемблер за излъчване на оригиналния текст, и кодовете, получени чрез различни монтажници ще имат различна дължина, които ще доведат до промяна в изместване. Например, екипа и CX, 0007h предаването MASMom TASMom 5.1 и 1.01, като 83E107 и отнема 3 bayta. Но същата тази команда може да се преведе като 81E10700 и заема 4 байта. Второ, дори ако офсет е да продължи, програмата няма да се поддаде на промяната, тъй като поставянето на част от кода ще се промени пристрастия и всички "се разпада." Така OFFSETy позволи програма лепило, което го прави подходящ за модификация. Подробен пример за това е по-скоро примитивен. Нека разгледаме една по-сложна ситуация и на първо място разглежда част от текст, издаден от Disassembler:
Помислете още един пример за непряка подпрограма разговор, в която стойност е маркирана в областта за данни.
За да разберете какво е 8792h, трябва да погледнем в района с компенсациите, които са близо до този номер. Тук е уместно фрагмент, издаден Disassembler:
Тя може да се види, че изместването на 08 792 съответства на думата 0d5,93. Сега остава да се отбележи, че изместването от 093d5 фрагмент висящи код започва в първоначалната програма
Следователно цялата разбор пример - това е хитра заучена подпрограма разговор. Коригирана фрагмент трябва да изглежда така:
Тук Предвиждам големи възражения. Аз ще кажа, че всичко това може да се тълкува по различен начин, че моята доказателства са неубедителни и т.н. С тази Напълно съм съгласен. Освен това, доказателства не са убедителни за мен. Много по-убедителен е, че след монтажа на програмата работи! Разглобяване, както и отстраняване на грешки програми - процес, интуитивно. Един опитен човек изпитва голямо удоволствие от това, че му не са мотивирани спекулации впоследствие потвърдена. Колко често си помисли, че дойде в автобуса, в сън, в компанията, в най-неподходящи обстоятелства - е правилно! В края на настоящия момент съвсем друго сложен пример. В текста, който издаде Disassembler срещнах този фрагмент:
Налице е един и същ въпрос - какво 4f71h - номер или компенсира? За да отговорим на този въпрос, ние трябва да разберем това, което прави този раздел на програмата. Нека се опитаме да го разбера. Очевидно е, че топчето се изтласква броят се сравнява с 4f71h и ако няма равенство, избута следващия брой. Ако номерът е 4f71h се отново вкарва на стека и връщане от подпрограма. Но къде? Ясно е, че на това място, което се компенсира в оригиналната програма все още 4f71h. Както се вижда от текста, на това място е предизвикателство s229 съчетания. Така че, по такъв странен начин подпрограма и 4f71h - тази промяна! Коригирана фрагмент трябва да изглежда така:
2. Как да се направи разграничение на данни от команди?
Всеки Disassembler объркващо данни и команди. Това важи особено за програми .com, където всичко се смесва. Помислете за един прост пример:
В този фрагмент се срещнахме два фантастични, висящи инструкции:
От по-горе, те са ограничени връщане на задържане инструкции от подпрограмата, а долната - Tagged m03e5c. Ясно е, че могат да се дават само тези инструкции. След промяната даден фрагмент трябва да изглежда така:
Това повдига друг въпрос: защо в един случай си струва да ст, а другият - ПБ? Отговорът се съдържа в текста, който издаде Disassembler. Можете да намерите тези инструкции:
Което означава, че d03e58 разглежда като една дума, и d03e5a - като един байт. Помислете малко по-сложно, но, въпреки това, много типичен пример.
В горния фрагмент от етикет текст b03f6b отсъства. В същото време, на етикета трябва да бъде "рязани" в две инструкции в добавка BYTE PTR [си], BH. който започва в оригиналната програма, за да бъдат подложени на разглобяване, с 03f6a пристрастия. Добив там може да бъде само един - 03f6a изместване отговаря на байтове данни и обучение започва с 03f6b офсет. Коригирана фрагмент трябва да изглежда така:
Объркване между данните и указанията там доста често. SOURSER способни да произвеждат цели метри безсмислени инструкции. DisDoc 2.3 в това отношение се държи по-добре.
3. Зависимост на преводача
Assembler програмисти са склонни да пренебрегват правилата на етикета, за да се прекъсне всички възможни табу, а това създава допълнителни трудности при демонтажа. Като пример кодов фрагмент, издаден Disassembler
Този фрагмент изглежда доста невинен, а всъщност, той се разглоби правилно. Проблемът е, че програмистът е планирано да се промени тази част, която се нарязва на живите. Оказва се, че в програмата има парче
Освен това трябва да се разбира, че това инструкции на фигура 1 с рутинна S25. Нека тази рутина asslemblirovana използване TASM 1.01. Издадена асемблер код ще бъде, както е показано на фигура 2.
Но проблемът е, че в първоначалната програма е да се съберат още асемблер и има формата показана на фигура 3. Както се вижда от сравнението на фигури 2 и 3, TASM 1.01 и инструкциите за неизвестни монтажен ADD излъчвани по различни начини, а това води до катастрофални последици. Наистина, погледнете как кода засяга частта, показана на фигура 1 (преди да го замени 086bh на OFFSET d0086b) на рутинна S25, излъчено TASMom (Фигура 4) и неизвестен асемблер (Фигура 5).
Сравнението на фигури 4 и 5 показва, че логиката на програмата е различна в зависимост от това какъв вид монтаж е бил използван. Как да се измъкнем от тази ситуация, ако желаете монтаж не е под ръка? Най-лесният, но не много приятен начин - да се сложи "кръпка". За да използвате TASM, podprogroamma S25 трябва да изглежда така:
Особености и грешка DisDoc 2.3 Disassembler
За съжаление, DisDoc 2.3 прави грешки, понякога редовни, а понякога и редки, коварни и дори страхливо. Най-неприятен бъг - случаен прескачане dannyhvstrechaetsya доста рядко. Да започнем с това, че е много общо помежду си.
1. EQU - кой си е измислил?
Кодът, издаде Disassembler, често се срещнете такива загадъчни парчета:
Какво е значението на задание d0046c тех 00046ch. За да разберете, че трябва да се намери d0046c в текста. В нашите данни случай d0046c елемент се намира много далеч от първата си поява - в подпрограмата s321
Така че, за да решите този проблем, трябва да:
- Махни от началото на подпрограма s12 задача d0046c тех 00046ch на
- Пренаписване показано на Фигура 6 фрагмента s321 следва:
Помислете за втори пример. Кодът, издадено въз Disassembler, се срещна такова парче:
Търсене на данни d0076a елемент не успя. А d00771 срещна в този фрагмент:
Налице е ясно код модификация s22 подпрограма. Затова е необходимо да се замени d00771 на b00771, маркирайте този етикет подходящо обучение в s22 и премахване на възлагане
Коригирана s22 фрагмент ще изглежда така:
Помислете още един пример. В началото на S32 се срещна запознат psevdooperatory:
Ако се вгледате в района с компенсации в близост до С1с, а след това ще има висящи част от код, който може да се прилага само:
Сега трябва да се търси идентификатори и d00c1c d00c1e текст, издаден Disassembler. Много бързо можете да намерите фрагменти от тип: Mov WORD PTR DS: d00c1c, брадва, MOV WORD PTR DS: d00c1e, брадва. Така Disassembler грешка е, че той е смесен данни и команди, и на тази основа прави две неправилно задача, тех, стигнал до върха на s32 съчетания.
Корекции ще бъдат, както следва:
- Махни от началото на подпрограмата S32 две psevdooperatora тех.
- Препишете кода на фигура 7, както следва:
В заключение, ние считаме, много просто парче код:
В заключение този раздел се обобщи. икони тех наричат vsevdooperatorami. Ако говорим за Disassembler DisDoc 2.3, тя е изненадващо точен име. Ако текстът ще се срещне с тех - грешка там. В същото време, понякога DisDoc 2.3 употреби тех съвсем вярна. Така че бъдете внимателни и не се заблуждавайте.
2. лоши грешки.
Понякога поведението на Disassembler е трудно да се обясни. Например, тя дава
загуба или нарушаване на битовете данни. За щастие, това се случва много рядко.