Волк-1024
|
Дата: Среда, 28.12.2011, 20:48 | Сообщение # 1
|
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 467
Статус: Offline
|
Вот решил выложить некоторые из самописных функций. Все написаны с использованием только API. Может кому и пригодится...
1. GetCurrentFileName(): string
Функция для получения текущего имени файла. Аналог ParamStr(0); Только короче.
Code
function GetCurrentFileName(): string;
var
FBuff: array[0..255] of char;
begin
GetModuleFileName(0, FBuff, (SizeOf(FBuff)));
Result:=(FBuff);
end;
2. GetCurrentFileParam(): PChar
Функция для получения текущих параметров запуска. Аналог ParamStr(1). Все действия прокомментированы.
Code
function GetCurrentFileParam(): PChar; assembler;
asm
mov eax, 0h {Обнуляем eax}
call GetCommandLine {Получаем текущие параметры запуска}
mov edi, eax {Результат работы записываем в edi}
mov al, 20h {В al помещаем код пробела}
mov ecx, -1
repne scasb {Ищем пробел}
cmp byte ptr [edi], bl {Проверяем наличе его}
jne @_OK {Если нашли, прыгаем на метку @_OK}
jmp @@_E {Если не нашли, прыгаем на выход}
@_OK:
repe scasb
dec edi {Удаляем пробел}
mov result, edi {Записываем результат функции}
xor edi, edi {Обнуляем edi}
@@_E:
nop {Ничего не делаем. Выходим из функции}
end;
3. GetFilePointer(hFile: Cardinal): integer;
Функция для получения текущей позиции в файле. Аналог какой-то большой компонентной функции.
Code
function GetFilePointer(hFile: Cardinal): integer;
begin
Result:=SetFilePointer(hFile, 0, nil, FILE_CURRENT);
end;
4. FileEx(FileName: string): Boolean;
Функция для проверки наличия файла. Аналог FileExists.
Code
function FileEx(FileName: string): Boolean;
var
H: DWORD;
FD: TWin32FindData;
begin
H:=FindFirstFile(PChar(FileName), FD);
if H<>INVALID_HANDLE_VALUE then
Result:=true
else
Result:=false;
end;
5. StrToHex(Str: string): string;
Функция конвертирует сроку в HEX значения.
Code
function StrToHex(Str: string): string;
var
i, ls: integer;
s: string;
begin
ls:=(Length(Str));
for i:=1 to (ls) do
s:=s+(inttohex(ord(Str[i]), 2));
Result:=s
end;
6. ExtractByte(FName: string; fbegin, fend, byteread: integer; Exfile: string): integer;
Функция извлекает опеределённое количество байтов из файла и записывает куда-нибудь. После её написания очень часто её использовал для извлечения полезноя нагрузки из файла носителя. Например dll библиотеку с функциями перехвата API и т.д. Полезная вобщем...
Code
function ExtractByte(FName: string; fbegin, fend, byteread: integer; Exfile:
string): integer;
var
F1, F2: DWORD;
ofs: _OfStruct;
RD, WR: Cardinal;
FBuff: array[1..1024] of byte;
begin
F2:=0;
Result:=0;
F1:=OpenFile(PChar(FName), OFS, 0);
if F1<>INVALID_HANDLE_VALUE then
begin
F2:=CreateFile(PChar(Exfile), GENERIC_WRITE, FILE_SHARE_WRITE, nil,
OPEN_ALWAYS, 0, 0);
if F2<>INVALID_HANDLE_VALUE then
begin
SetFilePointer(F1, fbegin, nil, 0);
repeat
ReadFile(F1, FBuff, byteread, RD, nil);
WriteFile(F2, FBuff, RD, WR, nil);
until (RD=0)or(GetFilePointer(F1)>=fend);
end;
end;
CloseHandle(F1);
CloseHandle(F2);
end;
Пример использования: ExtractByte('1.exe', $0002F530, $005C9FF, 1024, '2.exe'); 1-й параметр это файл из которого нужно извлекать. 2-й парам. это адрес начало считавания. 0 - для начала файла. 3-й адрес конца считавания. 4-й по скольку байт считывать из файла. 5-й куда записать. В итоге функция скопирует все что находится между $0002F530 и $005C9FF адресом.
7. GetRegValue(RKey: HKey; Key, N: PChar; var Res: string): integer;
Функция для получения значение ключа реестра. Аналог функции из компонента Registry.
Code
function GetRegValue(RKey: HKey; Key, N: PChar; var Res: string): integer;
var
HK: HKey;
DT, DS: DWORD;
begin
Result:=0;
if RegOpenKeyEx(RKey, Key, 0, $0001, HK)<>0 then exit;
if (RegQueryValueEx(HK, N, nil, @DT, nil, @DS)<>0)or(DT<>1) then
begin
RegCloseKey(HK);
Exit;
end;
SetString(RES, nil, (DS-1));
RegQueryValueEx(HK, N, nil, @DT, (PByte(@RES[1])), @DS);
RegCloseKey(HK);
Result:=(length(RES));
end;
8. RegAdd(Root: HKEY; KeyPath: PChar; Key_Type: cardinal; KeyName, Value: PChar): boolean;
Функция для добавления кл. реестра. Аналог функция из кмп. Registry
Code
function RegAdd(Root: HKEY; KeyPath: PChar; Key_Type: cardinal; KeyName, Value: PChar): boolean;
var
Key: HKEY;
begin
RegAdd:=false;
if RegOpenKeyEx(Root, KeyPath, 0, $0004 or $0002, Key)=0 then
begin
if RegSetValueEx(Key, KeyName, 0, Key_Type, Value,
lstrlen(PChar(Value))+Length(Value))>0 then
result:=true;
RegCloseKey(Key);
end;
end;
Пример использования: RegAdd(HKEY_LOCAL_MACHINE, 'Путь до ключа', REG_SZ, 'Имя ключа', 'Его значение') вернёт true если всё хорошо.
9. Patch_Byte(FN: string; B: array of integer; T: array of char);
Кривая функция для патчинга файлов.
Code
procedure Patch_Byte(FN: string; B: array of integer; T: array of char);
var
c: byte;
F: THandle;
i, bl: integer;
BytesRead: DWORD;
begin
i:=0;
BL:=(Length(T));
F:=(FileOpen(FN, $0002));
repeat
c:=(ord(char(pchar(T[i]))));
SetFilePointer(F, B[i], nil, 0);
WriteFile(F, c, (SizeOf(c)), BytesRead, nil);
i:=i+1;
until (i>=(bl));
FileClose(F);
Пример: Patch_Byte('Имя файла', Массив из адресов для патча, Массив из значений);
10. InjectDLL(DllPath: string; ProcID: Cardinal): boolean;
Функция для ижекта dll библиотек в процесс.
Code
function InjectDLL(DllPath: string; ProcID: Cardinal): boolean;
var
L, R: Pointer;
P, LN, TID, TH: Cardinal;
begin
Result:=False;
P:=OpenProcess(($000F0000 or $00100000 or $FFF), False, ProcID);
if P<>0 then
begin
L:=GetProcAddress(GetModuleHandle('kernel32.dll'), ('LoadLibraryA'));
if L<>nil then
begin
R:=VirtualAllocEx(P, nil, (Length(DllPath)), $1000, 4);
if R<>nil then
begin
if WriteProcessMemory(P, R, (@DllPath[1]), (Length(DllPath)), LN)
then
begin
TH:=CreateRemoteThread(P, nil, 0, L, R, 0, Tid);
if TH>0 then
begin
WaitForSingleObject(TH, (DWORD($FFFFFFFF)));
VirtualFreeEx(P, R, 0, $8000);
CloseHandle(P);
Result:=True;
end;
end;
end;
end;
end;
end;
11. GetValFromWrd(W: string; var Wrd_B: array of string);
Функция разделит слово по буквам и загрузит в массив. (Вроде. =) )
Code
procedure GetValFromWrd(W: string; var Wrd_B: array of string);
var
i, lw: integer;
begin
lw:=(Length(W));
for i:=0 to ((lw)-1) do
Wrd_B[i]:=(Copy(W, i+1, 1));
end;
12. UsbEx(const Dir: string): Boolean;
Функция для проверки наличия диска или флешки.
Code
function Usbex(const Dir: string): Boolean;
var
Code: Integer;
begin
Code:=GetFileAttributes(PChar(Dir));
Result:=(Code<>-1)and(FILE_ATTRIBUTE_DIRECTORY and Code<>0);
end;
13. Несколько не API функций для работы со строками.
ReadStr - Прочтет указанный номер сроки в файле.
ChekStr - Покажет сколько строк в файле.
LoadStr - Загрузит все строки из файла в массив.
Code
function ReadStr(tfile: string; num: integer): string;
var
t: textfile;
a: array[0..32] of string;
i: integer;
begin
AssignFile(t, tfile);
reset(t);
for i:=0 to num do
begin
readln(t, a[num]);
end;
result:=a[num];
closefile(t);
end;
function ChekStr(path: string): integer;
var
f: textfile;
i: integer;
b: array[0..0] of string;
begin
i:=0;
result:=(i);
AssignFile(f, path);
Reset(f);
while not SeekEof(f) do
begin
ReadLn(f, b[0]);
inc(i);
result:=(i);
end;
CloseFile(f);
end;
procedure LoadStr(tf: string; var txb: array of string);
var
t: textfile;
i, i2: integer;
tx: array of string;
begin
i2:=ChekStr(tf);
Setlength(tx, (i2+1));
AssignFile(t, tf);
reset(t);
for i:=0 to i2 do
begin
readln(t, tx[i]);
end;
closefile(t);
for i:=0 to i2 do
begin
txb[i]:=tx[i];
if (txb[i]=(''))or(tx[i]=('')) then
break;
end;
end;
14. GetFuncAvailable(LibN, FuncN: string): integer;
Проверит наличие функции в библиотеке.
Code
function GetFuncAvailable(LibN, FuncN: string): integer;
var
LH: THandle;
FA: Pointer;
begin
Result:=0;
if LoadLibrary(PChar(LibN))=0 then exit;
LH:=(GetModuleHandle(PChar(LibN)));
if LH<>0 then
begin
FA:=(GetProcAddress(LH, PChar(FuncN)));
if FA<>nil then
Result:=(integer(FA));
end;
end;
15. CreateSvc(ExPath: PChar): boolean
Функция создаёт сервис.
Code
function CreateSvc(ExPath: PChar): boolean;
var
Svc, SCMgr: integer;
begin
Result:=False;
SCMgr:=OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
if (SCMgr<>0) then
begin
Svc:=CreateService(SCMgr, (PChar(D(svcn))), (PChar(D(svcn))),
STANDARD_RIGHTS_REQUIRED, SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
ExPath, nil, nil, nil, nil, nil);
CloseServiceHandle(SCMgr);
if (svc<>0) then
Result:=true
else
Result:=false;
end;
CreateSvc:=Result;
end;
16. DeleteSvc(SvcName: PChar): integer;
Удаляет сервис по имени.
Code
function DeleteSvc(SvcName: PChar): integer;
var
Svc, SCMgr: cardinal;
begin
Result:=0;
SCMgr:=OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCMgr=0 then
Result:=-1;
Svc:=OpenService(SCMgr, SvcName, SERVICE_ALL_ACCESS);
if Svc=0 then
Result:=Result-1;
if not DeleteService(Svc) then
Result:=Result-1;
CloseServiceHandle(Svc);
end;
Фуух устал. Потом еще добавлю.
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Четверг, 29.12.2011, 13:37
|
|
|
|