![]() |
eXeL@B —› Вопросы новичков —› Спецы PE-формата, объясните необъяснимое! |
Посл.ответ | Сообщение |
|
Создано: 28 марта 2007 10:55 · Личное сообщение · #1 |
|
Создано: 28 марта 2007 11:20 · Личное сообщение · #2 |
|
Создано: 28 марта 2007 11:33 · Личное сообщение · #3 sewell А ты подумай. У Касперского была статья "Ассемблерные головоломки" (или что-то в этом роде). Там составлялся файл, состоящий из одних ASCII-символов, принадлежащих к алфавитно-цифровой (+знаковой) области. Запускается он, так как система его интерпретирует, как COM-файл, скорее всего. По 100h грузится и гоняет "bugoga" как опкоды. Посмотри hiew-ом или чем-нибудь другим, в какой вид интерпретируется эта строка (какой ассемблерный код выходит). Скорее всего, если ты говоришь про принтер, происходит вызов к.-л. прерывания, или запись в порт происходит (что менее вероятно). Отладь, во всяком случае файл, и посмотри, какие инструкции выполняются. Может быть, вообще программа в разнос идет, так как нет инструкций int 20h или подобных (разумеется, для ExitProcess там места нет =), тогда на конкретной машине (или даже в конкретном случае загрузки) результат выполнения будет иным. ----- Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей. ![]() |
|
Создано: 28 марта 2007 11:52 · Личное сообщение · #4 |
|
Создано: 28 марта 2007 12:05 · Личное сообщение · #5 |
|
Создано: 28 марта 2007 12:12 · Личное сообщение · #6 |
|
Создано: 28 марта 2007 13:19 · Личное сообщение · #7 |
|
Создано: 28 марта 2007 13:33 · Поправил: sewell · Личное сообщение · #8 PE_Kill Чисто ради интереса, какое может быть объяснение? В чем прикол то? Как это работает? Кстати, менял и название файла - работало, и оставлял одну быкву b - работало, и три буквы и более, при первой b, и иные комбинации на b. Но остальные комбинации вызывали ошибку, что и должно было быть изначально. ![]() |
|
Создано: 28 марта 2007 17:29 · Личное сообщение · #9 |
|
Создано: 28 марта 2007 17:58 · Поправил: tundra37 · Личное сообщение · #10 В 98-м не работает. Если переименовать в bugoga.com вышибает виртуалку ! В ХП с СП2 работает так : курсор встает в начало окна(у меня буфер на 300 строк). Если кликнуть в окне мышой курсор начинает прыгать. На принтере действительно висит печать документа без имени ! debug показывает, что действительно выполнение начинается с буквы 'b' - это код 0х62 Т.е. все дело в том что за ней идет. IDA показывает такие команды: seg000:0100 bound si, [di+67h] seg000:0103 outsw seg000:0104 db 67h seg000:0104 popa Для одной буквы 'b' остальные байты в debug одинаковы. Вот результат. seg000:0100 bound sp, [bx+si] seg000:0102 stosb seg000:0103 mov al, ds:0A0E2h Кстати, мышка ни при чем. Просто надо немного подождать(5 сек.) и курсор начинает прыгать. Возможно, просто в ДОС, эмулируемой ntvdm есть какой-то кусок, на котором это все происходит. На другом ntvdm естественно происходит вылет. ![]() |
|
Создано: 28 марта 2007 18:09 · Поправил: lord_Phoenix · Личное сообщение · #11 хм.. если не работает - можно запустить 2 копии сразу и смотреть.. зы. это не ре.. зы2. все дело в bound :] зы3. русские в мс все жгут Кладем в файл вот такой код: #include <windows.h>bool f (GUID const &A, GUID const &B) { return IsEqualGUID (A, B);} Компилируем 64-разрядным кросс-компилятором (из x86_amd64) от VS 2005 (14.00.50727.762) с выдачей ассемблерного листинга: cl /c /FAs test.cpp Открываем ассемблерный файл, и видим там вот такую функцию: ?f@@YA_NAEBU_GUID@@0@Z PROC ; f Забавная фраза появляется только, если компилировать 64-разрядным компилятором зы4. имя неавжно..главное буква b внутри..а сталобыть и команда) ----- Тут не могла быть ваша реклама ![]() |
|
Создано: 28 марта 2007 18:25 · Личное сообщение · #12 sewell, в стародавние времена (ещё до MS-DOS) был такой элементарный формат программ. Машинные команды в нём шли прямо от нулевого байта. COM-формат в DOS вышел именно оттуда. И на удивление M$ получил народное признание. DOS (и, кстати, форточки) загружает программу не столько по расширению, сколько про содержанию. То есть если файл имеет расширение из списка запускаемых, то ОСь определяет его формат по сигнатурам. Если сигнатура PE или других форматов не найдена, то файл считается COM. Тогда DOS выделяет сегмент 64кб и грузит туда программу. Что значит грузит? Это значит, что всё содержимое файла байт за байтом помещается в область памяти с логическим адресом от "Сег:100" до "Ceг:Последний байт файла". А перед этим заполняется служебная часть "от Сег:0 до FF". Когда программа корректно завершается (в ДОС это делалось либо int 20 либо int 21 ah… забыл =) ось просто помечает данный сегмент как свободный. То есть до тех пор, пока кто-то что-то не запишет по адресам этого сегмента, в нём будут оставаться байты уже отработавшей программы. Таким образом, если создать некий файл с белибердой и назвать его *.EXE, система не найдя в нём сигнатуры известных форматов загрузит этот файл как COM и передаст управление белиберде от смещения 100h до кода завершения программы или ошибки прерывания или ещё какой-нибудь ошибки. А что было раньше в данном сегменте, зависит от конкретной системы и способа запуска. Господа чайники начинайте свой путь к самоварам с Чтивы 0: bitfry.narod.ru ;) Hellspawn пишет: у меня ничё не работает карма наверное... +1 =) ----- Всем привет, я вернулся ![]() |
|
Создано: 28 марта 2007 18:27 · Личное сообщение · #13 |
|
Создано: 28 марта 2007 18:38 · Личное сообщение · #14 Ну уж раз матерщина пошла - можно того же эффекта добится от слов 'ebu' 'ebi' или 'ebal' Пишем в файл ebu MS и наслаждаемся ![]() ========================== Решил доисследовать и построить фразу. 'I ebal MS' дает эксепшн, но мы же не лыком шиты - жмем "Пропустить" и получаем : Расширенная ошиЪка 516 W> Но I можно прекрасно заменить на Я +++++++++++++++++++++++++++ Похоже bound вызывает спецфункции ntvdm ??? ![]() |
|
Создано: 28 марта 2007 18:40 · Поправил: lord_Phoenix · Личное сообщение · #15 <lord_Phoenix> гг, бугагу на баше запретил. да..а вот lol.com c текстом "ebi mumu" без кавычек нет..хотя он дает такой же еффект ) tundra37 пишет: Похоже bound вызывает спецфункции ntvdm ??? BOUND - Array Index Bound Check (80188+) Usage: BOUND src,limit Modifies flags: None Array index in source register is checked against upper and lower bounds in memory source. The first word located at "limit" is the lower boundary and the word at "limit+2" is the upper array bound. Interrupt 5 occurs if the source value is less than or higher than the source. Clocks Size Operands 808x 286 386 486 Bytes reg16,mem32 - nj=13 nj=10 7 2 reg32,mem64 - nj=13 nj=10 7 2 - nj = no jump taken 62 / r BOUND r16,m16&16 62 / r BOUND r32,m32&32 ----- Тут не могла быть ваша реклама ![]() |
|
Создано: 29 марта 2007 07:54 · Личное сообщение · #16 |
|
Создано: 29 марта 2007 08:54 · Личное сообщение · #17 |
|
Создано: 29 марта 2007 09:26 · Поправил: sewell · Личное сообщение · #18 |
|
Создано: 29 марта 2007 17:23 · Личное сообщение · #19 lord_Phoenix пишет: но печать уже обьяснили ? Не нашел справочник по Интам в ДОС-е, но мой склероз подсказывает, что это PrintScreen. По крайней мере INT 5, INT 20 печатают документ на 2 кило=25х80 , но курсор не скачет. Решил посмотреть bugoga : там объем печати растет офигительно - за несколько секунд 2 Мб. Ну и на закуску : @1: INT 5 JMP @1 делает бугогу - печатает много и курсор скачет !!! Скорее всего в бугоге по какой-то причине происходит выход из прерывания опять на bound ? Интересно можно ли софтайсом это увидеть ? ![]() |
|
Создано: 30 марта 2007 06:09 · Личное сообщение · #20 |
|
Создано: 03 апреля 2007 19:01 · Личное сообщение · #21 PE_Kill пишет: Я про эту фишку уже давно узнал, только после апдэйта винды работать перестало. Я про эту фишку в 99 году узнал =) Я был прав. tundra37 В debug.exe/com протрейсить по t хорошо, и увидишь все, что надо. Только дебаг по прерыванию, падла, скачет, как укушенный, поскипать нельзя (?) ----- Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей. ![]() |
|
Создано: 08 апреля 2007 23:05 · Личное сообщение · #22 (сорри за второй пост подряд) Вот что я думаю, это, по сути, комментарии к моему первому посту: INT 05 - PRINT SCREEN; CPU-generated (80186+) - BOUND RANGE EXCEEDED bound esi, [ebp+67]; знаем_сами_что (bound шерстит массив, вызывается int5 n раз ( tundra37 прав), для понимания того, что происходит, читаем пост LordPhoenix про эту команду или opcodes.hlp из masm32) outsb edx, ds:esi; вывод_строки_в_порт (вот где все происходит), тут уж стоит посмотреть, куда именно Тут пояснения: в edx адрес порта, ds:esi - выводимое в порт (почитайте opcodes.hlp) popad; регистры восстанавливает, неважно ret; смотрите сами, куда идет. Идет, наверное, наверх, смотрите стек перед ret непосредственно. Учтите, что мы в прерывании 5-ом были перед этим. ----- Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей. ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Спецы PE-формата, объясните необъяснимое! |