У меня есть код в OllyDBG:
MOV DWORD PTR GS:[396FF4],EBX
Но OllyDBG показывает:
EBX=00000B07
GS:[00396FF4]=???
Так как же вычисляется конечный адрес, на который будет записан EBX? У меня есть свободная память по адресу $004B0000. Что я должен поместить в код вместо $ 396FF4, чтобы EBX был написан, например. по адресу $004B0000.
GS + 0x00396FF4
.GS
будет меняться, поэтому маловероятно, что вы сможете использовать его осмысленно для своих целей. Вы пытаетесь взломать какое-то программное обеспечение? - person Luaan   schedule 04.05.2015MOV DWORD PTR GS:[004B0000],EBX
. Но во время шага по коду операции я получаю нарушение прав доступа при чтении [FFFFFFFF] - используйте Shift+F7/F8/F9, чтобы передать исключение программе. Раздел 004B0000 имеет права на запись. Почему я получаю AV? - person testnameC04   schedule 04.05.2015004B0000
память? И вы используете 32-битное приложение в 64-битной системе? - person Luaan   schedule 04.05.2015GS
на самом деле является локальным сегментом потока. Вы находитесь в защищенной системе, поэтому вы не можете просто обращаться к памяти напрямую, вы всегда работаете с виртуальной памятью. Я серьезно путаю вещи, которые не применимы, что-то из реального режима старой школы, что-то из защищенного режима старой школы, что-то из смешанной системы пейджинга-сегмента Windows... Я не делал этого довольно давно. в то время как, и кажется, что я забыл большую часть материала :) Насколько мне известно, вы не можете выйти из сегментаGS
- он всегда будет указывать на локальное хранилище потока. - person Luaan   schedule 04.05.2015GS
(поэтому он локальный для потока). Или вы имеете в виду что-то вроде манипулирования самой информацией о сегменте? - person Luaan   schedule 04.05.2015MOV DWORD PTR GS:[396FF4],EBX
является кодом водителя, что это значит? Драйвер может напрямую обращаться к памяти. - person testnameC04   schedule 04.05.2015GS
, а базовый адрес, указанный в таблице дескрипторов сегмента для данного сегмента. - person Luaan   schedule 04.05.2015GS:[396FF4]
— идеальный адрес, если (текущий) сегментGS
достаточно велик. Исходный код, очевидно, использовал его - я предполагаю, что это может быть сегмент стека потока (он довольно близок к 4 МБ, что является размером стека по умолчанию для основного потока;4B0000
превышает 4 МБ, что объясняет доступ нарушение). Однако в обоих случаях он не имеет никакого отношения к физической памяти, в которой он расположен — это по-прежнему выгружаемая память. - person Luaan   schedule 04.05.2015GS
на0
, это на самом деле совершенно нормально — он просто указывает на дескриптор с нулевым сегментом. Но на самом деле вы не можете использовать это для адресации - тогда вы получаете segfault (или, может быть, GP или что-то в этом роде, я не уверен). Чтобы получить предполагаемое поведение, вам нужно было бы указать на дескриптор сегмента, который имеет0
в качестве базового адреса и достаточную длину. - person Luaan   schedule 04.05.2015