10.2.2 32-разрядные расширения набора команд.
----------------------------------------------------------------
Набор команд процессоров 8086/80186/80286 расширен для
микропроцессора i486 в двух ортогональных направлениях:
добавлены 32-разрядные формы всех 16-разрядных команд для
поддержки работы с 32-разрядными типами данных и создана
возможность использования 32-разрядных режимов адресации для
всех команд, которые обращаются к памяти. Это ортогональное
расширение набора набора команд обеспечивается наличием бита
Умолчания (D) в дескрипторе сегмента кода и возможностью
использования 2 префиксов к командам набора.
Использование по умолчанию 16-разрядных или 32-разрядных команд
зависит от установки бита D в дескрипторе сегмента кода, который
определяет длину (32 и 16 разрядов) для обоих операндов и
эффективного адреса, принимаемую по умолчанию при выполнении
команд данного сегмента. При работе микропроцессора i486 в
режиме реальных адресов или в режиме виртуального 8086,
дескрипторы сегмента кода не используются, но предпологается,
что бит D установлен в 0 внутри процессора ( для использования
по умолчанию 16-разрядных размеров, совместимых с процессорами
8086/80186/80286 ).
Два возможных префикса - префикс размера операнда и префикс
размера эффективного адреса, позволяют переопределять для
конкретной команды принятые по умолчанию размеры операндов и
эффективного адреса. Эти префиксы могут предшествовать байтам
кода операции и оказывать влияние только на команду, с которой
они используются. Возможно помещение перед кодом операции одного
из указанных префиксов или обоих одновременно. Указание префикса
размера операнда или префикса размера эффективного адреса перед
командой обеспечит использование размеров операндов или
эффективного адреса, "противоположных" принятым по умолчанию.
Например, если по умолчанию установлен размер данных в 32
разряда, а команде предшествует префикс размера операнда,
данная команда будет использовать 16-разрядные данные. Если же
например, размер эффективного адреса принят по умолчанию равным
16 битам, а перед командой использован префикс размера
эффективного адреса, для команды вычислится 32-разрядный
эффективный адрес.
Если переопределение размеров не используется, команды с
8-разрядными и 16-разрядными операндами не оказывают влияние на
содержимое старших битов расширенных регистров.
> 1) e9 cw - jmp rel16 - переход близкий, смещение > относительно следующей команды > > 2) ea cd - jmp ptr16:16 - переход межсегментный, 4-байтный > непосредственный адрес
Соответсвенно для 32-х бит!!!
> 1) - близкий переход; аргумент команды - 2 байта - смещение > (не адрес!) Размер команды = 5 байт
> 2) - дальний переход; аргумент команды - 4 байта - адрес Размер команды = 7 байт EA + 'OFFSET32' + 'SEGMENT16'
Для 0xFF, это КОСВЕННЫЙ переход!!!
1) 11111111 11 100 reg - переход по регистру
2) 11111111 mod 100 r/m - память
Размер mod = 2 бита
Размер r\m = 3 бита
Размер reg = 3 бита
Кто знает УРЛы на инфу по сабжу? ... смыльте плz! Перерыл кучу всякого дерьма в инете,.. нихрена стОящего не нашел! Так же интересует инфа по восстановлению функицй из ассмовского кода...
мыльздесь: neuron_viking@yahoo.com
thnx!
ЗЫ: отладка не катит!
[Win32] Перехват API !14.10.01 12:47 Автор: SerpentFly <Vadim Smirnov> Статус: Member
Посмотри во первых http://home.od.ua/~blackw/reversfaq.htm. От себя могу добавить, что решение сильно зависит от операционной системы и от API которые ты собрался перехватывать. Кстати, соответствующая глава есть в последнем издании Рихтера. В общем прежде чем кричать читай библию ;))
link13.10.01 22:35 Автор: йцукенг <jcukeng> Статус: Member
API Spy пройденый этап, прикольно канешна но немнога не то что нада...
мне нужно не только перехватить вызов функции но и еще получить переметры и их содержимое при этом. А вот как это сделать никак не допру :(((
ежели есть инфа каккая или УРЛы поделитесь плиз!
link#214.10.01 01:27 Автор: йцукенг <jcukeng> Статус: Member
>А вот как это
> сделать никак не допру :((( > ежели есть инфа каккая или УРЛы поделитесь плиз!
посмотри на www.reversing.net
там есть МАССА статей на тему реверсинга.
кстати - я не понял, почему, собственно, ты не воспользуешься IDA или SoftICE?
SoftIce позволяет же поставить брейкпоинт на вызов функции...
> >А вот как это > > сделать никак не допру :((( > > ежели есть инфа каккая или УРЛы поделитесь плиз! > > посмотри на www.reversing.net > там есть МАССА статей на тему реверсинга. > кстати - я не понял, почему, собственно, ты не > воспользуешься IDA или SoftICE? > SoftIce позволяет же поставить брейкпоинт на вызов > функции...
потому как нужно мне програмно перехватить переданные параметры функции и подменить их(а может и нет)... как перехватывать сам вызов я прошарил а вот как перехватиь параметры еще нет :(((
[Win32] Здесь что одни ламеры собрались?!13.10.01 21:40 Автор: neuron_viking Статус: Незарегистрированный пользователь
Po-moemu eto ty voprosy zadavat' ne umeesh', vot nikto i ne reagiruet.
a vot eto :
"Так же интересует инфа по восстановлению функицй из ассмовского кода... " - menya povalilo na poval.
> > Крик души!!! > Ne ori !!! > > Po-moemu eto ty voprosy zadavat' ne umeesh', vot nikto i ne > reagiruet. > a vot eto : > "Так же интересует инфа по восстановлению функицй из > ассмовского кода... " - menya povalilo na poval. > > Tebe chego nado ???
Мне нада имея в наличии адрец функции узнать какие параметры ей переданы и узнать их содержимое. И еще мне нужно узнать где заканчивается эта функция т.е. я так полагаю нужно искать от стартовой точки до кода ret n ... я прав?
>И еще мне
> нужно узнать где заканчивается эта функция т.е. я так > полагаю нужно искать от стартовой точки до кода ret n ... я > прав?
Ну вааще-то ф-ция не ОБЯЗАНА иметь один ret. Скажем такой пример
mov eax,333
call Func1
...
...
...
Func1:
cmp eax,666
jge Label1
xor ebx,ebx
ret
Label1
mov ebx,1
ret
Но не знаю как в WinApi может там все и имеют один ret, хз
+Чтоб искать ret нужен хотя бы дизассемблер длин комманд т.е. просто поиск CAxxxx(retf xxxx) или C2xxxx(retn xxxx), а также есть просто C3(retn) CB(retf)
Xy}|{e :-), И что же мне теперь со всем этим делать?!15.10.01 05:23 Автор: neuron_viking Статус: Незарегистрированный пользователь
> Ну вааще-то ф-ция не ОБЯЗАНА иметь один ret. Скажем такой > пример > mov eax,333 > ... > xor ebx,ebx > ret > Label1 > mov ebx,1 > ret > > Но не знаю как в WinApi может там все и имеют один ret, хз > +Чтоб искать ret нужен хотя бы дизассемблер длин комманд > т.е. просто поиск CAxxxx(retf xxxx) или C2xxxx(retn xxxx), > а также есть просто C3(retn) CB(retf)
... повеситься чтоль?!
Каким образом можно решить два вопроса:
1) Как вычислить размер функции зная только её начало(адрес первой команды в памяти)?
2) Как получить параметры переданные этой функции если известно число параметров, в каком порядке они передаются и размер параметров(их тип)?
Xy}|{e :-), И что же мне теперь со всем этим делать?!15.10.01 13:15 Автор: SerpentFly <Vadim Smirnov> Статус: Member
> 1) Как вычислить размер функции зная только её начало(адрес > первой команды в памяти)? > 2) Как получить параметры переданные этой функции если > известно число параметров, в каком порядке они передаются и > размер параметров(их тип)?
1)Ну попробуй все таки искать те инструкции которые я написал с помощью дизасемблера длин команд можно написать самому можно взять отседа http://z0mbie.host.sk/index.html#down но там он глючит, с 32хбитным кодом так что придкться немного доделать... Ну и конечно 100% гарантии что ret который ты найдешь это истинный конец ф-ции нет.
2)Извлечь их из стека. Параметры помещаються в стек в обратном порядке т.е. сначала push xxx - последний, push yyy - предпоследний и т.д. + не надо забывать что call помещает в стек адрес возврата. Так что это проще всего, конечно надо знать кол-во параметров и их тип.
Тогда пачиму ЭТО не работает ?!15.10.01 19:12 Автор: neuron_viking Статус: Незарегистрированный пользователь
Вычисляю(к примеру) адрес MessageBox, записываю туда вместо первых 5и байт свои байты FF 0F 10 40 00 - это jmp MyStubFuncAddr, но вместо вызова моей функции(MyStubFunc) я получаю ошибку доступа к памяти в какое-то левое место; отладчик при этом дизассемблирет этот код как ДВЕ! отдельных инструкции:
FF 0F dec dword ptr [edi]
10 40 00 adc byte ptr [eax],al - и вот здесь эта хрень вылетает!!!
это совсем не то что я хотел, а я хотел, как уже сказал, чтобы выполнилась моя инструкция FF 0F 10 40 00. Что вообще происходит? С call таже самая фигня :(((. Атрибуты страницы ессно меняю на PAGE_EXECUTE_RW.
Тогда пачиму ЭТО не работает ?!16.10.01 09:16 Автор: z0 <z0> Статус: Member
> Вычисляю(к примеру) адрес MessageBox, записываю туда вместо > первых 5и байт свои байты FF 0F 10 40 00 - это jmp > MyStubFuncAddr, но вместо вызова моей функции(MyStubFunc) я > получаю ошибку доступа к памяти в какое-то левое место; > отладчик при этом дизассемблирет этот код как ДВЕ! > отдельных инструкции: > FF 0F dec dword ptr [edi] > 10 40 00 adc byte ptr [eax],al - и вот здесь > эта хрень вылетает!!! > это совсем не то что я хотел, а я хотел, как уже сказал, > чтобы выполнилась моя инструкция FF 0F 10 40 00. Что вообще > происходит? С call таже самая фигня :(((. Атрибуты страницы > ессно меняю на PAGE_EXECUTE_RW.
а почему тебе можно, понимаешь, байты в памяти менять а какой-нить другой проге нельзя. верни атрибут на PAGE_NOT_PRESENT и обрабатывай exception 0e с проверкой CRC на странице
а если серьезно, то по внешнему виду похоже ты нарвался на fuxup correction - адрес-то у тебя в косвенном джампе есть
как только я вижу адрес - первая мысля - а фиксапы как?
Тогда пачиму ЭТО не работает ?!15.10.01 20:15 Автор: SerpentFly <Vadim Smirnov> Статус: Member
Проверь стоит ли у тебя в системе драйвер ruky.sys. Если нет то поищи...
А вообще, что софтайс вообще не судьба воспользоваться? Пеньку ясно что что-то ты сделал криво, так поставь туда бреакпойнт. Или ты думаешь тут экстрасенсы организуют удаленную отладку по астральному каналу?
Тогда пачиму ЭТО не работает ?!15.10.01 21:42 Автор: neuron_viking Статус: Незарегистрированный пользователь
> Проверь стоит ли у тебя в системе драйвер ruky.sys. Если > нет то поищи... > > А вообще, что софтайс вообще не судьба воспользоваться? > Пеньку ясно что что-то ты сделал криво, так поставь туда > бреакпойнт. Или ты думаешь тут экстрасенсы организуют > удаленную отладку по астральному каналу?
Причина вот в чем, то что я пытался записать как jmp MyStubFuncAddr или FF 00 40 D0 10 но на самом деле превращается в FF 00 80 42 04 т.е. что то типа jmp неизвестно_куда, почему так получается?! Тогда я посмотрел дизасмом как будет выглядеть call MyStubFuncAddr, пусть MyStubFuncAddr = 0x004010D0, тогда по идее это должно быть: FF D0 10 40 00, НО! нифига подобного, почему-то это превращяется в FF 55 F8. Почему так??? И ккаким таким образом возникает подобное преобразование? А вот если я запишу FF 55 F8 то все пучком заработает!
Тогда пачиму ЭТО не работает ?!16.10.01 00:23 Автор: Heromantor Статус: Незарегистрированный пользователь
> Причина вот в чем, то что я пытался записать как jmp > MyStubFuncAddr или FF 00 40 D0 10 но на самом деле > превращается в FF 00 80 42 04 т.е. что то типа jmp > неизвестно_куда, почему так получается?! Тогда я посмотрел > дизасмом как будет выглядеть call MyStubFuncAddr, пусть > MyStubFuncAddr = 0x004010D0, тогда по идее это должно быть: > FF D0 10 40 00, НО! нифига подобного, почему-то это > превращяется в FF 55 F8. Почему так??? И ккаким таким > образом возникает подобное преобразование? А вот если я > запишу FF 55 F8 то все пучком заработает!
Ну вообще я ничего не стану утверждать но все же мне кажеться что jmp начинаеться с 0xE9, а FF вроде это либо inc хитрый либо jmp еще хитрее вроде что-то jmp по адресу регистр+число 0xE9 по крайней мере это 100% jmp :))
О точно то что ты написал будет как
0xFFD0104000=
call eax
adc [eax][0],al
В общем хрен знает но с FF00xxxx тебя похоже обманули... Делай E9xxxxxxxx
Тогда пачиму ЭТО не работает ?!16.10.01 02:03 Автор: neuron_viking Статус: Незарегистрированный пользователь
> > Причина вот в чем, то что я пытался записать как jmp > > MyStubFuncAddr или FF 00 40 D0 10 но на самом деле > > превращается в FF 00 80 42 04 т.е. что то типа jmp > > неизвестно_куда, почему так получается?! Тогда я > посмотрел > > дизасмом как будет выглядеть call MyStubFuncAddr, > пусть > > MyStubFuncAddr = 0x004010D0, тогда по идее это должно > быть: > > FF D0 10 40 00, НО! нифига подобного, почему-то это > > превращяется в FF 55 F8. Почему так??? И ккаким таким > > образом возникает подобное преобразование? А вот если > я > > запишу FF 55 F8 то все пучком заработает! > > Ну вообще я ничего не стану утверждать но все же мне > кажеться что jmp начинаеться с 0xE9, а FF вроде это либо > inc хитрый либо jmp еще хитрее вроде что-то jmp по адресу > регистр+число 0xE9 по крайней мере это 100% jmp :)) > О точно то что ты написал будет как > 0xFFD0104000= > call eax > adc [eax][0],al > > В общем хрен знает но с FF00xxxx тебя похоже обманули... > Делай E9xxxxxxxx
Делал, абсолютно тоже самое - т.е. адрес функции коверкается, т.е. как я уже говорил, мне нужо чтобы в памяти были E9(или E8, пофигу!)D0 10 40 00, а на самом деле почему то в памяти оказывается E9 55 F8, и еще раз говорю, что если именно эту штуку записать в память то все корректно срабатывает :((( ... откуда она берется и как осуществляется преобразование D0 10 40 00 -> 55 F8 ???? я в панике!
Тогда пачиму ЭТО не работает ?!16.10.01 19:34 Автор: Heromantor Статус: Незарегистрированный пользователь
> Делал, абсолютно тоже самое - т.е. адрес функции > коверкается, т.е. как я уже говорил, мне нужо чтобы в > памяти были E9(или E8, пофигу!)D0 10 40 00, а на самом деле > почему то в памяти оказывается E9 55 F8, и еще раз говорю, > что если именно эту штуку записать в память то все > корректно срабатывает :((( ... откуда она берется и как > осуществляется преобразование D0 10 40 00 -> 55 F8 ???? > я в панике!
Ну во первых когда меняеться значение? Ты пробовал просичитать его сразу после записи? И в конце концов поставь ты себе SoftIce и bpm там поставь на MessageBox тогда все станет ясно моментом.