Сообщение от :
кусок кода
Procedure SetHook();
var
Khernel32: dword;
Bytes: dword;
begin
Khernel32 := GetModuleHandle('Kernel32.dll');
GltAdr := GetProcAddress(Khernel32, 'GetLocalTime');
ReadProcessMemory(INVALID_HANDLE_VALUE, GltAdr, @OldGlt, SizeOf(OldCode), Bytes);
JmpGlt.PuhsOp := $68;
JmpGlt.PushArg := @NewGetLocalTime;
JmpGlt.RetOp := $C3;
WriteProcessMemory(INVALID_HANDLE_VALUE, GltAdr, @JmpGlt, SizeOf(far_jmp), Bytes);
end;
Сообщение от :
JmpGlt.PuhsOp := $68;
JmpGlt.RetOp := $C3;
Сообщение от Dream Worker:
объявлена как процедура а не функция
Сообщение от Dream Worker:
во вторых мне не особо понятно смысл значений
Сообщение от Dream Worker:
множество примеров на C++
Сообщение от Part!zan:
В нете масса примеров, написанных без подобных извратов.
push <новый адрес обработчика> ret
Сообщение от dn2k4:
в момент между установкой первого и второго байта "патча" функция может понадобится другому процессу
Сообщение от MadFish:
чё кернел32 не на 0 кольце разве работает
Сообщение от Part!zan:
С какого перепугу? Этак каждое приложение юзермоды, подключившее kernel32.dll (а это практически любое виндовое приложение), получит реальную возможность завалить систему.
Сообщение от MadFish:
всегда считал что Kernel32.dll это свалка винапишных вызовов и менеджер памяти. Грузится и юзается ядром в том числе
Сообщение от MadFish:
скачать микрософтовский DDK
Сообщение от Part!zan:
Ты путаешь с ntdll.dll.
Сообщение от Part!zan:
о даже если программа юзермоды напрямую подключит ntdll.dll, это вовсе не значит, что она автоматически начнет работать в ring0.
Сообщение от Part!zan:
Длл сама по себе нигде не выполняется и лишь содержит код, который выполняется в других процессах
Сообщение от Part!zan:
microsoft.com
Сообщение от Part!zan:
автор предусмотрительно останавливает треды
Сообщение от MadFish:
А вот это неверное утверждение!!! Никто мне не помешает при инициализации dll запустить поток и будет он у меня шарашить как проклятый!!!
Сообщение от MadFish:
HeapAlloc
Сообщение от MadFish:
попытка записать в сегмент кода пошлет далеко и надолго вместе с GPF-ом
Сообщение от MadFish:
при инициализации dll запустить поток
Сообщение от dn2k4:
треды других процессов, использующих dll, тоже придется тормозить
Сообщение от dn2k4:
Вот только инициализация dll сама по себе, без процесса, который ее загружает, не происходит.
Сообщение от :
В результате "шарашить как проклятый" будет код, находящийся в адресном пространстве и с правами твоего процесса.
Сообщение от Part!zan:
С какой стати?
Сообщение от Part!zan:
Пардон, а какое этот поток будет отношение к длл? Он сам по себе, длл - сама по себе.
Сообщение от Part!zan:
Кстати, ты случаем, не вирус пишешь? ) .
Сообщение от :
library TimeShift;
uses
Windows,TLHelp32;
type
OldCode = packed record
One: dword;
two: word;
end;
far_jmp = packed record
PuhsOp: byte;
PushArg: pointer;
RetOp: byte;
end;
var
JmpGlt : far_jmp;
OldGlt : OldCode;
GltAdr : pointer;
JmpGst : far_jmp;
OldGst : OldCode;
GstAdr : pointer;
Function OpenThread(dwDesiredAccess: dword;
bInheritHandle: bool;
dwThreadId: dword): dword; stdcall;
external 'kernel32.dll';
Procedure StopThreads;
var
h, CurrTh, ThrHandle, CurrPr: dword;
Thread: TThreadEntry32;
begin
CurrTh := GetCurrentThreadId;
CurrPr := GetCurrentProcessId;
h := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if h <> INVALID_HANDLE_VALUE then
begin
Thread.dwSize := SizeOf(TThreadEntry32);
if Thread32First(h, Thread) then
repeat
if (Thread.th32ThreadID <> CurrTh) and (Thread.th32OwnerProcessID = CurrPr) then
begin
ThrHandle := OpenThread(0002, false, Thread.th32ThreadID);
if ThrHandle>0 then
begin
SuspendThread(ThrHandle);
CloseHandle(ThrHandle);
end;
end;
until not Thread32Next(h, Thread);
CloseHandle(h);
end;
end;
Procedure RunThreads;
var
h, CurrTh, ThrHandle, CurrPr: dword;
Thread: TThreadEntry32;
begin
CurrTh := GetCurrentThreadId;
CurrPr := GetCurrentProcessId;
h := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if h <> INVALID_HANDLE_VALUE then
begin
Thread.dwSize := SizeOf(TThreadEntry32);
if Thread32First(h, Thread) then
repeat
if (Thread.th32ThreadID <> CurrTh) and (Thread.th32OwnerProcessID = CurrPr) then
begin
ThrHandle := OpenThread(2, false, Thread.th32ThreadID);
if ThrHandle>0 then
begin
ResumeThread(ThrHandle);
CloseHandle(ThrHandle);
end;
end;
until not Thread32Next(h, Thread);
CloseHandle(h);
end;
end;
procedure TrueGetLocalTime(var lpSystemTime: TSystemTime); stdcall;
var
Written: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, GltAdr, @OldGlt, SizeOf(OldCode), Written);
GetLocalTime(lpSystemTime) ;
WriteProcessMemory(INVALID_HANDLE_VALUE, GltAdr,@JmpGlt, SizeOf(far_jmp), Written);
end;
procedure NewGetLocalTime(var lpSystemTime: TSystemTime); stdcall;
begin
TrueGetLocalTime(lpSystemTime) ;
lpSystemTime.wYear:=2008;
lpSystemTime.wDayOfWeek:=2;
end;
procedure TrueGetSystemTime(var lpSystemTime: TSystemTime); stdcall;
var
Written: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, GstAdr,@OldGst, SizeOf(OldCode), Written);
GetSystemTime(lpSystemTime) ;
WriteProcessMemory(INVALID_HANDLE_VALUE, GstAdr,@JmpGst, SizeOf(far_jmp), Written);
end;
procedure NewGetSystemTime(var lpSystemTime: TSystemTime); stdcall;
begin
TrueGetSystemTime(lpSystemTime) ;
lpSystemTime.wYear:=2008;
end;
Procedure SetHook();
var
Khernel32: dword;
Bytes: dword;
begin
Khernel32 := GetModuleHandle('Kernel32.dll');
GltAdr := GetProcAddress(Khernel32, 'GetLocalTime');
ReadProcessMemory(INVALID_HANDLE_VALUE, GltAdr, @OldGlt, SizeOf(OldCode), Bytes);
JmpGlt.PuhsOp := $68;
JmpGlt.PushArg := @NewGetLocalTime;
JmpGlt.RetOp := $C3;
WriteProcessMemory(INVALID_HANDLE_VALUE, GltAdr, @JmpGlt, SizeOf(far_jmp), Bytes);
GstAdr := GetProcAddress(Khernel32, 'GetSystemTime');
ReadProcessMemory(INVALID_HANDLE_VALUE, GstAdr, @OldGst, SizeOf(OldCode), Bytes);
JmpGst.PuhsOp := $68;
JmpGst.PushArg := @NewGetSystemTime;
JmpGst.RetOp := $C3;
WriteProcessMemory(INVALID_HANDLE_VALUE, GstAdr, @JmpGst, SizeOf(far_jmp), Bytes);
end;
Procedure Unhook();
var
Bytes: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, GltAdr, @OldGlt, SizeOf(OldCode), Bytes);
WriteProcessMemory(INVALID_HANDLE_VALUE, GstAdr, @OldGst, SizeOf(OldCode), Bytes);
end;
// залепа
Function MessageProc(code : integer; wParam : word;
lParam : longint) : longint; stdcall;
begin
CallNextHookEx(0, Code, wParam, lparam);
Result := 0;
end;
Procedure SetGlobalHookProc();
begin
SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, 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, @SetGlobalHookProc, nil, 0, TrId) else
CloseHandle(hMutex);
end;
procedure DLLEntryPoint(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH: begin
SetGlobalHook();
Randomize();
StopThreads;
SetHook();
RunThreads;
end;
DLL_PROCESS_DETACH: UnHook();
end;
end;
begin
DllProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Сообщение от Dream Worker:
добалении форматирование кода калечитсмя
#include <stdio.h> int nod(int a, int b){ if (a<2 || b<2) return 1; while(a!=b) if (a>b) a-=b; else b-=a; return a; } void main(int argc, char* argv[]){ printf("%d",nod(atoi(argv[1]),atoi(argv[2]))); }