Поздравляю всех с 2012 Новым годом!Всем хорошего настроения и удачно отметить!!!:)
Общее·количество·просмотров·страницы
суббота, 31 декабря 2011 г.
понедельник, 26 декабря 2011 г.
сплайсинг апи
сегодня пойдет речь,я думаю,об одном из самых перспективынх методов перехвата АПИ в ring 3- сплайсинге.
И так не много теории.
Сплайсинг-метод перехвата API функций в режиме юзера (ring 3). Обычно изменяются первые 5 байт функции на длинный прыжок по адресу обработчика перехвата.В зависимости от ситуации может понадобится дизассемблер длин инструкций,однако M$ изменила пролог начиная с ХР SP2, позволяя при этом не анализировать длины.Длины в 5 байт будет достаточно(5байт- E9h- опкод прыжка jmp).Сплайсинг так же позволяет осуществлять глобальный перехват функций, тем самым охватывая все процессы в системе.
Применение:
Данный вид перехвата используется:
1)Десктопное ПО производящее операции с ОС (например мониторы)
2)Хуки
3)Малварь (руткиты и т.п.)
Инструменты:
1)ЯП (в данном случае Delphi)
2)музычка (kmfdm или rammstein сойдет)
3)руки.голова
И так начнем.
Как вы поняли наш код будет размещаться в dll-ке которая будет загружаться во все процессы и творить там свои темные дела.Чтобы не парится я буду извращаться с мэссэджбоксом.
код:
Создаем две записи-структуры
type
OC=packed record
frst:dword;
sec:word;
end;
fj= packed record
pusho:byte;
pushar:pointer;
reto:byte;
end;
1-я будет содержать запись на оригинал кода.2-я длинный прыжок
объявим переменные структур
var
jmpmw,jmpma:fj;
ocmw,ocma:oc;
mwadr,maadr:pointer;
я возьму функцию messageboxex- это считайте тот же messagebox только в нем присутствует идентификатор языка.
Теперь нам нужно описать функции на которые будет происходить прыжок.
Их будет две.Почему так?Мурка заключается в том что существуют две категории АПИ ansi и Unicode которые имеют соотв. окончание MessageBoxA или например MessageBoxW. Соль в том что анси является 8 битной кодировкой и может предоставлять только 256 уникальных символов, в то время как юникод обеспечивает 65535 уникальных символов,это было сделано с целью работы со всеми языками мира.
начнем описание функций:
function NMessageBoxExA(hWnd: HWND; lpText, lpCaption: PAnsiChar;
uType: UINT; wLanguageId: Word): Integer; stdcall;
var txt,cap:pwidechar;
txtl,capl:dword;
begin
txtl:=lstrlen(lptext)*sizeof(widechar)+2;
capl:=lstrlen(lpcaption)*sizeof(widechar)+2;
getmem(txt,txtl);
getmem(cap,capl);
stringtowidechar(lptext,txt,txtl);
stringtowidechar(lpcaption,cap,capl);
result:=MessageBoxExW(hWnd, txt, Cap, uType, wLanguageId);
freemem(txt);
freemem(cap);
end;
что к чему. новая функция имеет те же флаги что и обычная:
дескриптор окна, текст сообщения,заголовок окна,стиль окна и язык.
работаем с widechar выше разобрали почему(т.к. он поддерживает интернациональные символы).
напрямую со string мы не работаем,а работаем с памятью.
Получаем длину текста и длину заголовка.Выделяем кол-во динамической памяти= длине, получая данные в нужные переменные.Затем конвертируем строки и получаем готовые флаги ф-ии.вызываем ф-ю с нужными параметрами и освобождаем память.
Следующей определяем оригинал
function TrueMessageBoxExW(hWnd: HWND; lpText, lpCaption: PWideChar;
uType: UINT; wLanguageId: Word): Integer; stdcall;
var
Written: dword;
begin
writeProcessMemory(INVALID_HANDLE_VALUE, mwadr,@ocmw, SizeOf(OC), Written);
Result := MessageBoxExW(hWnd, lpText, lpCaption, uType, wLanguageId);
WriteProcessMemory(INVALID_HANDLE_VALUE, mwadr,@Jmpmw, SizeOf(fj), Written);
end;
За ней идет юникодный msgbox
function NMessageBoxExW(hWnd: HWND; lpText, lpCaption: PWideChar;
uType: UINT; wLanguageId: Word): Integer; stdcall;
var
Atxt: PWideChar;
ntxtt: PWideChar;
nlen: dword;
a:integer;
begin
a:=length('Happy new year asshole!');
Atxt := stringtopwide('Happy new year asshole!',a);
nlen := (lstrlenw(Atxt) + lstrlenw(lpText)) * SizeOf(WideChar) + 20;
GetMem(ntxtt, nlen);
lstrcpyw(ntxtt, lpText);
lstrcatw(ntxtt, #10#13#10#13);
lstrcatw(ntxtt, Atxt);
FreeMem(Atxt);
Result := TrueMessageBoxExW(hWnd, ntxtt, lpCaption, uType, wLanguageId);
FreeMem(ntxtt);
end;
по анологии с ansichar заполняем Unicode. Вы можете наблюдать строку.Эта строка будет выдаваться теперь при вызовах msgbox. Но в самом начале кода нам потребуется две вспомогательные функции.
вот они:
Function AllocMem(Size: Integer): Pointer;
asm
or EAX, EAX
JZ @@exit
PUSH EAX
CALL System.@GetMem
POP EDX
PUSH EAX
MOV CL, 0
CALL System.@FillChar
POP EAX
@@exit:
end;
*написано с целью не подключать модуль sysutils
эта функция выд-т область памяти,после чего мы применяем функцию конвертирования string строки в widechar
function stringtopwide(str:string;var a:integer):pwidechar;
var
pwc:pwidechar;
d:integer;
begin
d:=length(str)+1;
a:=d*2;
pwc:=allocmem(a);
multibytetowidechar(cp_acp,0,pchar(str),d,pwc,a);
result:=pwc;
end;
Дальге мы получаем адреса функций ,заполняем записи и устанавливаем прыжок.
procedure SetHook;
var
hwnd: dword;
Byte: dword;
begin
hwnd := GetModuleHandle('user32.dll');
mwadr := GetProcAddress(hwnd, 'MessageBoxExW');
maadr := GetProcAddress(hwnd, 'MessageBoxExA');
ReadProcessMemory(INVALID_HANDLE_VALUE, mwadr, @ocmw, SizeOf(OC), Byte);
ReadProcessMemory(INVALID_HANDLE_VALUE, maadr, @ocma, SizeOf(OC), Byte);
jmpmw.pusho := $68;
jmpmw.PushAr := @NMessageBoxExW;
jmpmw.RetO := $C3;
jmpma.pusho := $68;
jmpma.PushAr := @NMessageBoxExA;
jmpma.RetO := $C3;
WriteProcessMemory(INVALID_HANDLE_VALUE, mwadr, @jmpmw, SizeOf(fj), Byte);
WriteProcessMemory(INVALID_HANDLE_VALUE, maadr, @jmpma, SizeOf(fj), Byte);
end;
разбираем:
получаем дескриптор системной dll-ки в которой хранятся наши функции.
записываем их адркса в записи.
сохраняем оригинальные начала. Формирование новых начал функций в структурах jmpmw и jmpma идет так: опкод 68h -push, затем ее аргумент – адрес нашей функции, которая заменит оригинальную, в конце идет опкод c3h-ret.И переписываются оригинальные начала на наши.
когда надо подставить оригинал,возвращаем байты
Procedure Unhook;
var
Byte: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, maadr, @ocma, SizeOf(OC), Byte);
WriteProcessMemory(INVALID_HANDLE_VALUE, mwadr, @ocmw, SizeOf(OC), Byte);
end;
Далее следует процедура,которая поможет загрузить нашу dll-ку глобально
Function Msg(code : integer; wParam : word;
lParam : longint) : longint; stdcall;
begin
CallNextHookEx(0, Code, wParam, lparam);
Result := 0;
end;
собсно сама процедура
Procedure SetGlobalHookO;
begin
SetWindowsHookEx(WH_GETMESSAGE, @Msg, HInstance, 0);
Sleep(INFINITE);
end;
и оставляем в памяти.
Procedure SetGlobalHook;
var
hMutex: dword;
TrId: dword;
begin
hMutex := CreateMutex(nil, false, 'AdvareHook');
if GetLastError = 0 then
CreateThread(nil, 0, @SetGlobalHookO, nil, 0, TrId) else
CloseHandle(hMutex);
end;
устанавливаем глобальный хук. проверяем запущен ли файл.Только поток владеющий мьютексом имеет домтуп к области памяти.
procedure DLL(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
SetGlobalHook;
SetHook;
end;
DLL_PROCESS_DETACH: UnHook;
end;
end;
begin
DllProc := @DLL;
DLL(DLL_PROCESS_ATTACH);
end.
и смысл последней процедуры: при аттаче длл устанавливается хук. при детаче-хук соответственно снимается.
Остается лишь написать лоадер.
.386
.model flat,stdcall
option casemap:none
include include\windows.inc
include include\kernel32.inc
includelib lib\kernel32.lib
.data
libname db 'MSGSPLICE.dll',0
start:
invoke LoadLibrary,addr libname
invoke Sleep,INFINITE
end start
грузим dll-ку и висим в памяти.
и так алгоритм работы в кратце (итог типо)
1) получаем дескриптор библиотеки , в которой содержатся функции которые необходимо перехватить.
2) в соответствующие переменные записываем оригинальные адреса функций
3) сохраняются оригинальные начала функций
4) Формирование новых начал функций в структурах jmpmw и jmpma. В начале идет опкод команды push, затем ее аргумент – адрес нашей функции, которая заменит оригинальную, в конце идет оператор ret.
5) переписываются начала оригинальных API-функции данными из структур
Таким образом в начало оригинальных функций
будут вставлены переходы на их функции-заменители.
воскресенье, 25 декабря 2011 г.
понедельник, 5 декабря 2011 г.
воскресенье, 27 ноября 2011 г.
частенько на выездах приходится иметь дело с подменой либо вообще удалением хостса,в 7 (да и в других) проделывать все рутинные манипуляции с блокнотом и шарить по папкам в хп мне надоело,по этому я навоял махонькую,простенькую прогу размером в 2137 байт для коррекции хостса.
скачать http://splashed.ucoz.ru/hosts_restore.zip
скачать http://splashed.ucoz.ru/hosts_restore.zip
воскресенье, 20 ноября 2011 г.
Билдер на delphi
Всем доброго времени суток.На днях мне стукнуло пару тройку людей в асику с целью что бы я объяснил как делаются билдеры каких либо прог.На словах оно конечно не оч ясно,по этому я решил сделать микро-статейку.
Билдер будет простой, для наглядности с messagebox-ом.
Приступим.
Напишем для начала наш билд.Писать можно на любом языке,я буду на масме.
Билд есть.Суть билдера будет в том что бы изменять нужные данные (заголовок и сообщение) билда.Это будет делаться с помощью замены байтов.Как узнать нужные байты?Берем hiew или любой хекс редактор который Вам по душе и открываем в нем наш билд.Ищем выводимые строки.
записываем нужные байты.Теперь нам нужно сделать ресурс.Создаем новый текстовый файл с расширением *.rс в нем пишем например:FILE1 EXEFILE NEW.EXE
где new.exe- наш билд.Теперь нужно скомпилировать ресурс.Это можно сделать любым компилятором ресурсов,можно взять тот что в delphi brcc32.exe.
кидаем на него файл rс и получаем файл *.res. Данный ресурс мы прилинкуем в наш билдер (билдер пишем на делфи) таким образом:
{$R Res.res} вписав это перед implementation, где res.res- имя вашего файла ресурсов.Далее следует код билдера.Алгоритм создания билда таков:
1)Извлечь из ресурсов наш первоначальный билд
2)Пропатчить необходимые байты
3)Переименовать билд в заданное имя.
Итак код билдера:
Вот собсно и все.Простенький билдер готов.Сильно не пинайте.Взять все готовое мона тута: http://splashed.ucoz.ru/builder.rar спс за внимание.
Билдер будет простой, для наглядности с messagebox-ом.
Приступим.
Напишем для начала наш билд.Писать можно на любом языке,я буду на масме.
.386
.model flat, stdcall
option casemap:none
include include\windows.inc
include include\kernel32.inc
include include\user32.inc
include include\shell32.inc
includelib lib\shell32.lib
includelib lib\user32.lib
includelib lib\kernel32.lib
.data
cap db 'MSG',0
msg db 'Hello!',0
start:
invoke MessageBox,0,addr msg,addr cap,0
invoke ExitProcess,0
end start
Билд есть.Суть билдера будет в том что бы изменять нужные данные (заголовок и сообщение) билда.Это будет делаться с помощью замены байтов.Как узнать нужные байты?Берем hiew или любой хекс редактор который Вам по душе и открываем в нем наш билд.Ищем выводимые строки.
записываем нужные байты.Теперь нам нужно сделать ресурс.Создаем новый текстовый файл с расширением *.rс в нем пишем например:FILE1 EXEFILE NEW.EXE
где new.exe- наш билд.Теперь нужно скомпилировать ресурс.Это можно сделать любым компилятором ресурсов,можно взять тот что в delphi brcc32.exe.
кидаем на него файл rс и получаем файл *.res. Данный ресурс мы прилинкуем в наш билдер (билдер пишем на делфи) таким образом:
{$R Res.res} вписав это перед implementation, где res.res- имя вашего файла ресурсов.Далее следует код билдера.Алгоритм создания билда таков:
1)Извлечь из ресурсов наш первоначальный билд
2)Пропатчить необходимые байты
3)Переименовать билд в заданное имя.
Итак код билдера:
var
Form1: TForm1;
m:array[1..6]of integer; // массив байтов сообщения
c:array[1..3]of integer; // массив байтов заголовка
implementation
{$R *.dfm}
{$R res.res} // прилинкованный файл ресурсов
procedure TForm1.Button1Click(Sender: TObject);
var fn,msg,cap:string;
ch:byte;
BR:dword;
h:Thandle;
Res:TResourceStream;
begin
m[1]:=$404; // массив байтов заполняем нужными байтами
m[2]:=$405;
m[3]:=$406;
m[4]:=$407;
m[5]:=$408;
m[6]:=$409;
c[1]:=$400;
c[2]:=$401;
c[3]:=$402;
fn:=edit1.Text; //тут имя билда
msg:=edit2.Text; //тут сообщение
cap:=edit3.Text; // заголовок
Res:=TResourceStream.Create(HInstance,'FILE1','EXEFILE');
Res.SaveToFile(ExtractFilePath(Application.ExeName)+'new.exe');
Res.Free; // извлекаем файл из ресурсов
h:=fileopen('new.exe',fmopenwrite); // открываем на запись
ch:=ord(char(pchar(msg[1]))); // берем первый символ, преобразовавши его в его код.
setfilepointer(h,m[1],nil,0); // указываем позицию в файле
writefile(h,ch,sizeof(ch),br,nil); // заменяем байт. т.д.
ch:=ord(char(pchar(msg[2])));
setfilepointer(h,m[2],nil,0);
writefile(h,ch,sizeof(ch),br,nil);
ch:=ord(char(pchar(msg[3])));
setfilepointer(h,m[3],nil,0);
writefile(h,ch,sizeof(ch),br,nil);
ch:=ord(char(pchar(msg[4])));
setfilepointer(h,m[4],nil,0);
writefile(h,ch,sizeof(ch),br,nil);
ch:=ord(char(pchar(msg[5])));
setfilepointer(h,m[5],nil,0);
writefile(h,ch,sizeof(ch),br,nil);
ch:=ord(char(pchar(msg[6])));
setfilepointer(h,m[6],nil,0);
writefile(h,ch,sizeof(ch),br,nil);
ch:=ord(char(pchar(cap[1])));
setfilepointer(h,c[1],nil,0);
writefile(h,ch,sizeof(ch),br,nil);
ch:=ord(char(pchar(cap[2])));
setfilepointer(h,c[2],nil,0);
writefile(h,ch,sizeof(ch),br,nil);
ch:=ord(char(pchar(cap[3])));
setfilepointer(h,c[3],nil,0);
writefile(h,ch,sizeof(ch),br,nil);
closehandle(h);
renamefile('new.exe',fn); // переименовуем файл.
end;
end.
Вот собсно и все.Простенький билдер готов.Сильно не пинайте.Взять все готовое мона тута: http://splashed.ucoz.ru/builder.rar спс за внимание.
пятница, 11 ноября 2011 г.
пятница, 4 ноября 2011 г.
Похоже что способ получать бесконечно лицензию на каспер 2012 закрыли.На официальном сайте автора программы сказано что он прекращает работу над программой.В следствии чего советую всем кто не хочет возиться с поиском ключей-переходить на drweb или avast. ключи для платных версий можно взять тут
http://bezvirusoff.ru/
http://bezvirusoff.ru/
понедельник, 24 октября 2011 г.
четверг, 13 октября 2011 г.
Сегодня начинаю делать многостраничность в assembler editor, что значит придется не маленькую часть кода перелопатить,но я верю что оно того стоит)
15.10.2011; 00:20;
Многостраничность уже сделана,ведется тестирование.Осталось сделать не большие изменения в обработчиках событий некоторых кнопок,возможно добавить еще один компилятор,сделать справку.
15.10.2011; 00:20;
Многостраничность уже сделана,ведется тестирование.Осталось сделать не большие изменения в обработчиках событий некоторых кнопок,возможно добавить еще один компилятор,сделать справку.
вторник, 20 сентября 2011 г.
Небольшая украшалка для рабочего стола.
Прога позволяет заменять скучные виндовские обои на другие скучные обои по интервалу времени.Запиливание и выпиливание в\из автозапуск(а).
Сворачивание в трэй.Фильтры bmp, jpeg, JPG. Удобный переход по папкам.Исключения проработаны.Обои заполняются на весь экран.
скриншот:
скочать http://splashed.ucoz.ru/Wallpapers_Changer.zip
Перепилина прога,теперь:
1)Ставит рандомную картинку из папки
2)после автозагрузки каталог выбранный ранее уже сразу отображается, остается лишь включить программу.
Прога позволяет заменять скучные виндовские обои на другие скучные обои по интервалу времени.Запиливание и выпиливание в\из автозапуск(а).
Сворачивание в трэй.Фильтры bmp, jpeg, JPG. Удобный переход по папкам.Исключения проработаны.Обои заполняются на весь экран.
скриншот:
скочать http://splashed.ucoz.ru/Wallpapers_Changer.zip
Перепилина прога,теперь:
1)Ставит рандомную картинку из папки
2)после автозагрузки каталог выбранный ранее уже сразу отображается, остается лишь включить программу.
понедельник, 12 сентября 2011 г.
Вечный kis 12.0.0.374
Хочу представить тем кто еще не знает способ бесконечно юзать kis 2012 версии 12.0.0.374.
Что к чему:
нам понадобится лишь 2 программы.
И так 1-е:
качаем прогу Kaspersky 2012 Trial Reset 1.1c by GANJiN
запускаем(антивир будет ругаться,предупреждаю сразу)
видим такое окошко:
Сразу отключим самозащиту каспера вот здесь:
после чего нажмем правой кнопкой мышки на значок касперского в трее и нажмем выход,в окне программы все поля должны стать зелеными.Только после этого жмем reset.
И так резет мы произвели,но мы ведь не хотим мучаться и искать ключи?Для этого качаем прогу №2 называется она d1g1tal x-aktivator .
в ней делаем все последовательно,в принципе там все понятно:
1)жмем синхронизация с базой
2)получить ключ
3)активировать.
получаем ключ(который кстати не забанивается при обновлении)-юзаем.По окончанию ключа повторяем все действия.ПРОФИТ
Что к чему:
нам понадобится лишь 2 программы.
И так 1-е:
качаем прогу Kaspersky 2012 Trial Reset 1.1c by GANJiN
запускаем(антивир будет ругаться,предупреждаю сразу)
видим такое окошко:
Сразу отключим самозащиту каспера вот здесь:
после чего нажмем правой кнопкой мышки на значок касперского в трее и нажмем выход,в окне программы все поля должны стать зелеными.Только после этого жмем reset.
И так резет мы произвели,но мы ведь не хотим мучаться и искать ключи?Для этого качаем прогу №2 называется она d1g1tal x-aktivator .
в ней делаем все последовательно,в принципе там все понятно:
1)жмем синхронизация с базой
2)получить ключ
3)активировать.
получаем ключ(который кстати не забанивается при обновлении)-юзаем.По окончанию ключа повторяем все действия.ПРОФИТ
вторник, 30 августа 2011 г.
Обновление
Вот пересматривал тут все,перечитывал,на днях обновлю некоторые программы,исправлю грамматические ошибки в тексте.
пятница, 29 июля 2011 г.
суббота, 23 июля 2011 г.
Создание Установочного пакета.INF+ASSEMBLER
Приветствую господа.
Недавно наткнулся на статью где описывалось создание инсталла для WIN 9X.
Заинтересовавшись я решил сделать свой для NT систем.
Суть заключается в написании просто inf файла который установит нашу маленькую программу.Почему не взять нормальные программы для создания инсталл пакетов?Да они хороши,но для больших программ,для маленькой не оправдает средства.
Ближе к делу.
Что понадобится (инструменты)
1)Любой текстовый редактор.Я юзаю notepad++
2)Файлы установки.Подопытной взял Одну интересную прогу SLESH'a, ссылка на топ https://forum.antichat.ru/showthread.php?p=2199120
3)Любой компилируемый язык программирования работающий с api функциями.(я использовал assembler)
начнем
Итак я буду писать код inf файла и раскоментирую все подробно.
Создаем заголовок
[Version]
[BeginUPromptSection]
Недавно наткнулся на статью где описывалось создание инсталла для WIN 9X.
Заинтересовавшись я решил сделать свой для NT систем.
Суть заключается в написании просто inf файла который установит нашу маленькую программу.Почему не взять нормальные программы для создания инсталл пакетов?Да они хороши,но для больших программ,для маленькой не оправдает средства.
Ближе к делу.
Что понадобится (инструменты)
1)Любой текстовый редактор.Я юзаю notepad++
2)Файлы установки.Подопытной взял Одну интересную прогу SLESH'a, ссылка на топ https://forum.antichat.ru/showthread.php?p=2199120
3)Любой компилируемый язык программирования работающий с api функциями.(я использовал assembler)
начнем
Итак я буду писать код inf файла и раскоментирую все подробно.
Создаем заголовок
[Version]
Signature=$Chicago$
сигнатура $chicago$ говорит о том что установка может проводиться на всей линейке ос MS WIN
[strings]
сигнатура $chicago$ говорит о том что установка может проводиться на всей линейке ос MS WIN
[strings]
APP_NAME="Slil_ru_file_uploader" DIR="Progra~1\slil"
Эта секция зарезервирована и должна только так называться.Она содержит название приложения и путь для установки.
[SourceDisksNames]
Эта секция зарезервирована и должна только так называться.Она содержит название приложения и путь для установки.
[SourceDisksNames]
1 = %APP_NAME%,"",1
Имя диска установки.
Читается из секции [strings]
Имя диска установки.
Читается из секции [strings]
[SourceDisksFiles]
install.inf=1
slil.exe=1
help.txt=1
Это файлы которые будут копироваться.
Это файлы которые будут копироваться.
[Optional Components]
DefaultInstall
стандартная установка (не обяз.)
описуем секцию установки
[DefaultInstall]
стандартная установка (не обяз.)
описуем секцию установки
[DefaultInstall]
CopyFiles = CopyINFfiles,mainfiles
UpdateInis = AddShortcuts
AddReg = AddUninstall
ProfileItems =AddShortcut
CopyFiles- файлы для копирования
UpdateInis = AddShortcuts- создание ярлыков
AddReg = AddUninstall- внесение информации в реестр (удаление будет происходить через апплет установка и удаления программ)
ProfileItems =AddShortcut - также создание/удаление ярлыков,только в разных группах
CopyFiles- файлы для копирования
UpdateInis = AddShortcuts- создание ярлыков
AddReg = AddUninstall- внесение информации в реестр (удаление будет происходить через апплет установка и удаления программ)
ProfileItems =AddShortcut - также создание/удаление ярлыков,только в разных группах
[DefaultUninstall]
BeginPrompt = BeginUPromptSection
DelFiles = CopyINFfiles,mainfiles
UpdateInis = DelShortcuts
DelReg = DelUninstall
EndPrompt = UninstallEndPrompt
ProfileItems =DelShortcut
а это у нас секция удаления.
BeginPrompt = BeginUPromptSection тут мы выводим сообщение о подтверждении удаления программы
DelFiles = CopyINFfiles,mainfiles -собсна,удаляем скопированные файлы
UpdateInis = DelShortcuts,ProfileItems =DelShortcut -удаляем ярлыки
DelReg = DelUninstall -удаляем ключи
EndPrompt = UninstallEndPrompt выводим конечное сообщение.
[AddShortcut]
а это у нас секция удаления.
BeginPrompt = BeginUPromptSection тут мы выводим сообщение о подтверждении удаления программы
DelFiles = CopyINFfiles,mainfiles -собсна,удаляем скопированные файлы
UpdateInis = DelShortcuts,ProfileItems =DelShortcut -удаляем ярлыки
DelReg = DelUninstall -удаляем ключи
EndPrompt = UninstallEndPrompt выводим конечное сообщение.
[AddShortcut]
Name = "zalil",0x00000008,9
CmdLine = 16422,"slil",slil.exe
[DelShortcut] Name = "Zalil",0x0000000A,9
Вот отличительное свойство.В своем треде Slesh писал что было бы удобно кинуть файл в send_to чтобы отправлять быстрее было.Установщик сделает это сам.
Что тут что значит:
name= "zalil" -что будет отображаться
,0x00000008,9="%UserProfile%\SendTo" то-бишь создаем ярлык там.
CmdLine = 16422,"slil",slil.exe Cmdline -путь к исполняемому файлу с парам. ProgramFiles.+ имя экзэшника.Соотв.и удаляем его же.
[DestinationDirs]
Вот отличительное свойство.В своем треде Slesh писал что было бы удобно кинуть файл в send_to чтобы отправлять быстрее было.Установщик сделает это сам.
Что тут что значит:
name= "zalil" -что будет отображаться
,0x00000008,9="%UserProfile%\SendTo" то-бишь создаем ярлык там.
CmdLine = 16422,"slil",slil.exe Cmdline -путь к исполняемому файлу с парам. ProgramFiles.+ имя экзэшника.Соотв.и удаляем его же.
[DestinationDirs]
mainfiles=24,%DIR%
CopyINFfiles =17
Каталог назначения (что куда копировать)
в секции главных файлов (будет дальше) копируем в програм файлс. Путь как в ДОС 8 символов два последних ~1
CopyINFfiles =17 каждая директория диска имеет номер 17- C:\windows\inf
помещаем туда наш установочный файл,который будет использован апллетом для удаления файлов и инф.
[CopyINFfiles]
Каталог назначения (что куда копировать)
в секции главных файлов (будет дальше) копируем в програм файлс. Путь как в ДОС 8 символов два последних ~1
CopyINFfiles =17 каждая директория диска имеет номер 17- C:\windows\inf
помещаем туда наш установочный файл,который будет использован апллетом для удаления файлов и инф.
[CopyINFfiles]
install.inf,,,1
[mainfiles]
slil.exe
help.txt
секции с файлами
секции с файлами
[AddShortcuts]
setup.ini, progman.groups,, "group1=""%APP_NAME%"""
setup.ini, group1,, """SlilFU"",""""""%24%\Progra~1\slil\slil.exe"""""",,,,""%24%\Progra~1\slil"",""slil.exe"""
Создаем ярлык в программной группе в пуск
[DelShortcuts]
Создаем ярлык в программной группе в пуск
[DelShortcuts]
setup.ini, progman.groups,, "group1=""%APP_NAME%"""
setup.ini, group1,, """SlilFU"""
удаляем.
Код: [AddUninstall]
удаляем.
Код: [AddUninstall]
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%APP_NAME%","DisplayName",,"slil_ru_FU" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%APP_NAME%","UninstallString",,"RunDll32 advpack.dll,LaunchINFSection %17%\install.inf, DefaultUninstall"
Вносим инфу в реестр.1)Сдесь будет отображаться текст в апллете.
2)Запускается секция [DefaultUninstall]
дело в том что в венде имеется два интерпретатора inf файлов это setupapi и advpack оба находятся в динамических библиотеках,каждый имеет свои параметры,подробнее можно прочитать по ссылке в конце статьи,
%17%...ю я описывал выше,тут запустится наш инсталл файл из C:\windows\inf
[DelUninstall]
Вносим инфу в реестр.1)Сдесь будет отображаться текст в апллете.
2)Запускается секция [DefaultUninstall]
дело в том что в венде имеется два интерпретатора inf файлов это setupapi и advpack оба находятся в динамических библиотеках,каждый имеет свои параметры,подробнее можно прочитать по ссылке в конце статьи,
%17%...ю я описывал выше,тут запустится наш инсталл файл из C:\windows\inf
[DelUninstall]
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstal l\%APP_NAME%"
удаление ключа.
удаление ключа.
[BeginUPromptSection]
Prompt = "Вы действительно хотите удалить программу?"
ButtonType = YESNO
Title = Удаление...
[UninstallEndPrompt]
Prompt = "Программа успешно удалена!"
Сообщения при деинсталяции.
Вот собсно и все.
Только вот по дефолту инф файлы открываются блокнотом,по этому не помешало бы написать микро-лаунчер.я буду делать на ассемблере
пояснения(хах,там вызов 3-4 функций)в коментах
Код: ;This program was created in assembler editor
Сообщения при деинсталяции.
Вот собсно и все.
Только вот по дефолту инф файлы открываются блокнотом,по этому не помешало бы написать микро-лаунчер.я буду делать на ассемблере
пояснения(хах,там вызов 3-4 функций)в коментах
Код: ;This program was created in assembler editor
.386 .model flat,stdcall
option casemap:none
include include\windows.inc
include include\shell32.inc
include include\kernel32.inc
include include\user32.inc
include macros\macros.asm
includelib lib\kernel32.lib
includelib lib\shell32.lib
includelib lib\user32.lib
.code
start:
invoke GetFileAttributes,CTXT("setup\install.inf") ; проверяем наличие установочного файла
.IF eax==INVALID_FILE_ATTRIBUTES ; если возврат INVALID_FILE_ATTRIBUTES то файла не существует
invoke MessageBox,0,CTXT("Файл установки отсутствует!"),0,0 ; известим об этом
.ELSE
invoke ShellExecute,0,CTXT("install"),CTXT("setup\install.inf"),0,0,SW_SHOW ; иначе устанавливаем наш файл
.ENDIF
invoke ExitProcess,0
end start
после компиляции с сжатия FSG получаем ланчер в 877 байт.
помещаем инстал файлы в папку setup, а install.exe снаружи.
Программа Slesh'a весит 7,5 кб
inf файл 1,85 кб
help.txt 943 байта
install.exe 877 байт
размер дистрибутива > устанавливаемой программы на 3707 байт.
кладем все через hamster в 7Z и получаем установочник весом 5,03 кб то есть даже меньше чем исходная программа.
Также inf файлы широко применяются у мелкомягких в установке программ и драйверов.
после компиляции с сжатия FSG получаем ланчер в 877 байт.
помещаем инстал файлы в папку setup, а install.exe снаружи.
Программа Slesh'a весит 7,5 кб
inf файл 1,85 кб
help.txt 943 байта
install.exe 877 байт
размер дистрибутива > устанавливаемой программы на 3707 байт.
кладем все через hamster в 7Z и получаем установочник весом 5,03 кб то есть даже меньше чем исходная программа.
Также inf файлы широко применяются у мелкомягких в установке программ и драйверов.
среда, 6 июля 2011 г.
Ремонт флешки.
Произошла вот такая херня-взяла и перестала открываться флэха.Что только с ней не делал:форматировал,низкоуровнево форматировал,запускал в разных режимах.Нет и все тут.Пришлось лезть внутрь.По лечению флешек я тогда вообще ничего не знал.Но как гр-тся все познается на личном опыте.вскрыв корпус я увидел чип.На чипе важно знать имя контроллера на первом фото показан красной стрелкой.Узнать имя контроллера можно по надписи на нем.Второе что важно знать это имя микросхемы памяти,как правило также написано на микросхеме.Если надписей нет(китайская флешка вероятнее всего) узнать можно с помощью специальной утилиты (utlite).Также нужно определить VID и PID идентификаторы.У каждого USB устройства существуют уникальные идентификаторы: VID - идентификатор производителя и PID - идентификатор устройства.По VID и PID можно определить тип контроллера установленного во флэшке.
Когда определили все выше указанное по названиям ищется спец утилита.То есть на примере моей флешки:
контроллер Alcor 6987
VID 058F
PID 6387
производство TRANSCEND
на микросхеме памяти надписи отсутствуют (:))
Берем для начала утилиту для alcor 698X то есть для любого alcor 6987 6989 и т.д.Если сразу все прошло успешно-можно радоваться.но у меня все не как у людей и утилита отказалась работать.По фотке видно что память флешки оказалась специфичной (5T2F) тогда ищем утилиту по памяти.Как раз подошла эта AlcorMP AU698x UFD 5T2F.После ремонта желательно (хотя и не обязательно) отформатировать флешку.Да кстати,советую проводить все манипуляции на ХР СП2 ибо другие системы могут не дать сработать утилите.
Контроллер
Когда определили все выше указанное по названиям ищется спец утилита.То есть на примере моей флешки:
контроллер Alcor 6987
VID 058F
PID 6387
производство TRANSCEND
на микросхеме памяти надписи отсутствуют (:))
Берем для начала утилиту для alcor 698X то есть для любого alcor 6987 6989 и т.д.Если сразу все прошло успешно-можно радоваться.но у меня все не как у людей и утилита отказалась работать.По фотке видно что память флешки оказалась специфичной (5T2F) тогда ищем утилиту по памяти.Как раз подошла эта AlcorMP AU698x UFD 5T2F.После ремонта желательно (хотя и не обязательно) отформатировать флешку.Да кстати,советую проводить все манипуляции на ХР СП2 ибо другие системы могут не дать сработать утилите.
Контроллер
Микросхема памяти(кстати посмотрите сверху надпись-имя контроллера)
Овалом обведена память.
вторник, 28 июня 2011 г.
Простой Драйвер режима ядра.
Решил тут немного дрова подучить, поэтому думаю кому то пригодится.
Драйвер простенький и скорее нужен для микро-защиты,или просто поглумиться.
В общем драйвер работает в нулевом кольце защиты(проверял только на 32-битных ХРюшах-все работает).Смысл заключается в том что бы создать крах системы,поскольку в Ring3 программно этого не сделать.
Получается в ring0 на нуль делить нельзя,это я и воссоздал в драйвере,всего 3 ассемблерных инструкции.
Код самого драйвера(masm)
.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
Драйвер простенький и скорее нужен для микро-защиты,или просто поглумиться.
В общем драйвер работает в нулевом кольце защиты(проверял только на 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).
Юзать можно для шифрования строк,доков...для создание мальварей, внутренней защиты строк (кракми и т.п.)и т.п.
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 Исправлены мелкие баги и недочеты.
Скачать тута http://splashed.ucoz.ru/Shutdown_Timer.zip
03.09.11 Исправлены мелкие баги и недочеты.
суббота, 11 июня 2011 г.
Планы на будущие разработки.
Пришла мне в голову дурная мысль создать свою ОС.
Это будет клон всем нам раньше известной DOS.
Потолковав с умными людьми,я собрал информацию о том что же по-минимуму будет называться ОС,что она должна уметь:
1)Конечно же загрузка,предполагается создание двух загрузчиков- первичного и вторичного,хотя может быть и одного.
2)Исполнение пользовательских программ
3)Выводить символы (то есть работа с монитором)
4)Работа с файлами-создать,записать,удалить,показать директорию
5)Работа с клавиатурой
Вот это и есть необходимый минимум. Предполагается написание полностью на TASM.
Работать будет для начала под фс FAT 12 и com программами,а дальше уже посмотрим.
Только вот пока времени нету,сессия:)
Это будет клон всем нам раньше известной 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)
Инструкции условных прыжков используют один или несколько флагов состояния для проверки условия.
Итак теория закончена можно приступить к практической части.
Первое и несложное что можно написать: модуль для простейших арифметических операций: +-*/ с целыми числами
|
использование модуля( 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/
Спасибо за внимание. Я особо не имею журналистских наклонностей, так что не пинайте ежели что.
Подписаться на:
Сообщения (Atom)