Как получить определенный адрес памяти с помощью C

вы можете сделать это с помощью XML следующим образом

<stroke android:width="3dp"
        android:color="#ff000000"/>

<padding android:left="1dp"
         android:top="1dp"
         android:right="1dp"
         android:bottom="1dp"/> 

<corners android:radius="30px"/> 

и прагматически вы можете создать округленное растровое изображение и установить его в ImageView.

public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
    bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);

final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = 12;

paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);

return output;
}

Для Универсальный ленивый загрузчик вы также можете использовать этот ват.

DisplayImageOptions options = new DisplayImageOptions.Builder()
        .displayer(new RoundedBitmapDisplayer(25)) // default
        .build();
9
задан tr9sh 7 June 2009 в 18:07
поделиться

6 ответов

Одна из ваших проблем заключается в том, что вы возвращаете виртуальный адрес, а не физический адрес, по которому находится память. В следующий раз, когда вы загрузитесь, отображение, вероятно, будет другим.

Это определенно можно сделать в модуле ядра в Linux, но я не думаю, что в пользовательском пространстве есть какой-либо API, который вы могли бы использовать.

] Если у вас есть разрешение (и я предполагаю, что вы можете иметь root-права на этой машине, если перезагружаете ее), вы можете заглянуть в / dev / mem, чтобы увидеть фактическую физическую структуру. Может быть, вам стоит попробовать выбрать значения, перезагрузиться и посмотреть, сколько из этих значений сохранилось.

20
ответ дан 4 December 2019 в 06:14
поделиться

Существует аналогичный проект , в котором демонстрируется атака с холодной перезагрузкой. Доступен исходный код , возможно, вы почерпнете там вдохновение.

Однако, AFAIR они считывают память без предварительной загрузки ОС и, следовательно, не должны возиться с защитой памяти ОС. Возможно, вам тоже стоит попробовать это, чтобы избежать перезаписи или очистки памяти ОС после загрузки.

12
ответ дан 4 December 2019 в 06:14
поделиться

В вопросе Прямой доступ к памяти в Linux мы разработали большую часть основ, необходимых для достижения этой цели. Обратите внимание, mmap () не является ответом на это по причинам, которые были заявлены другими ... вам нужен реальный адрес, а не виртуальный, который вы можете получить только внутри ядра (или написав драйвер, чтобы передать его в пользовательское пространство

Простейшим способом было бы написать драйвер символьного устройства, который можно было бы читать или записывать, с помощью ioctl, чтобы дать вам допустимый начальный или конечный адрес. Опять же, если вы хотите, чтобы указатели на функции управления памятью использовались в ядре, см. Вопрос, с которым я связался ... большая часть его была проработана в комментариях к первому (и принятому) ответу.

5
ответ дан 4 December 2019 в 06:14
поделиться

Ваш тестовый код выглядит нечетным

FILE * addr = (FILE *) 0x12346000;
fwrite ((ФАЙЛ *) fd_out, (size_t) 1, (size_t) lenna_size, (FILE *) addr);

Нельзя просто преобразовать целое число в указатель FILE и ожидать получить что-то разумное. Вы также переключили первый и последний аргумент на fwrite? Последним аргументом должен быть ФАЙЛ * для записи.

2
ответ дан 4 December 2019 в 06:14
поделиться

Вам, вероятно, понадобится как можно меньше ОС для этой цели; чем больше программного обеспечения вы загружаете, тем больше шансов перезаписать что-то, что вы хотите проверить.

DOS может быть хорошей ставкой; он использует <640 КБ памяти. Если вы не загружаете HIMEM и вместо этого напишете свою собственную процедуру (требуется сборка) для перехода в pmode, скопируйте блок верхней памяти в нижнюю память, а затем вернитесь в реальный режим, вы можете написать программу, работающую в основном в реальном режиме, которая может выгружать физическую оперативную память (за вычетом того, сколько BIOS, DOS и ваше приложение используют). Он может записать его на флэш-диск или что-то в этом роде.

Конечно, настоящая проблема может заключаться в том, что BIOS очищает память во время POST.

2
ответ дан 4 December 2019 в 06:14
поделиться

Я не знаком с Linux, но вам, вероятно, потребуется написать драйвер устройства. У драйверов устройств должен быть какой-то способ преобразования адресов виртуальной памяти в адреса физической памяти для целей DMA (контроллеры DMA имеют дело только с адресами физической памяти). Вы должны иметь возможность использовать эти интерфейсы для работы непосредственно с физической памятью.

1
ответ дан 4 December 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: