Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Внизперехват Найти похожие ветки
← →
Powerland © (2004-08-26 00:35) [0]необходимо было реализовать перехват вызова некоторых системных функции. в процесс внедряется dll, а затем из неё производится замена адреса перехода на нужную фунцию. но это почему-то не работает. кто-нить встречался с этой проблемой?
← →
Гаврила © (2004-08-26 00:57) [1]А ты приведи код, как ты это делаешь - тогда может и можно что-то определенное сказать
← →
Powerland © (2004-08-26 01:04) [2]вот так внедряем длл:
procedure AttachDllToProcess(pID: integer; LibName: string);
var
ThreadID: Cardinal;
ThreadHndl: THandle;
AllocBuffer: Pointer;
BytesWritten: Cardinal;
ProcAddr: Pointer;
ExitCode: Cardinal;
hProcess: integer;
begin
hProcess:=OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE, false, pID);
if (hProcess=0) then
Exit;
AllocBuffer:=VirtualAllocEx(hProcess, nil, length(LibName)+1, MEM_COMMIT, PAGE_READWRITE);
if (AllocBuffer<>nil) then
WriteProcessMemory(hProcess, AllocBuffer, PChar(LibName), length(LibName)+1, BytesWritten)
else
Exit;
ProcAddr:=GetProcAddress(LoadLibrary(PChar("Kernel32.dll")), PChar("LoadLibraryA"));
ThreadHndl:=CreateRemoteThread(hProcess, nil, 0, ProcAddr, AllocBuffer, 0, ThreadID);
WaitForSingleObject(ThreadHndl, INFINITE);
GetExitCodeThread(ThreadHndl, ExitCode);
CloseHandle(ThreadHndl);
VirtualFreeEx(hProcess, AllocBuffer, 0, MEM_RELEASE);
CloseHandle(hProcess);
end;
← →
Powerland © (2004-08-26 01:05) [3]а так производим замену:
function SetProc(hLocalModule: HModule; c_szDllName: Pchar; c_szApiName: PChar; pApiNew: Pointer; p_pApiOrg: PPointer; pApiToChange: Pointer): Boolean;
var
pDosHeader: PImageDosHeader;
pNtHeader: PImageNtHeaders;
PImportDesc: PImageImportDescriptor;
dwProtect: DWORD;
dwNewProtect: DWORD;
dwAddressToInterCept: DWORD;
pThunk: PImageThunkData;
begin
pDosHeader := PImageDosHeader(hLocalModule);
Result := False;
if (pApiToChange <> nil) then
dwAddressToIntercept := DWORD(pApiToChange)
else
dwAddressToIntercept := Dword(GetProcAddress(GetModuleHandle(c_szDllName),c_szApiName));
if IsBadReadPtr(Pointer(hLocalModule), sizeof(PImageNtHeaders)) then
Exit;
if pDosHeader.e_magic <> IMAGE_DOS_SIGNATURE then
Exit;
pNtHeader := PImageNtHeaders(MakePtr(DWord(pDOSHeader),DWord(pDOSHeader.e_lfanew)));
if pNTHeader.signature <> IMAGE_NT_SIGNATURE then
Exit;
pImportDesc := PImageImportDescriptor(MakePtr(hLocalModule,pNtHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Virtual Address));
if (PImportDesc = PImageImportDescriptor(pNtHeader)) then
Exit;
while (pImportDesc.Name > 0) do
begin
pThunk := PImageThunkData(MakePtr(DWord(hLocalModule),
Dword(pImportDesc.FirstThunk)));
while (pThunk.u1.Functionn <> nil) do
begin
if DWord(pThunk.u1.Functionn) = dwAddressToIntercept then
begin
if not IsBadWritePtr(Pointer(@pThunk.u1.Functionn), sizeof(DWORD)) then
begin
if (p_pApiOrg <> nil) then
p_pApiOrg^ := Pointer(pThunk.u1.Functionn);
pThunk.u1.Functionn := pApiNew;
Result := True;
end
else
begin
if VirtualProtect(Pointer(@pThunk.u1.Functionn), sizeof(DWORD),PAGE_EXECUTE_READWRITE, @dwProtect) then
begin
if (p_pApiOrg <> nil) then
p_pApiOrg^ := Pointer(pThunk.u1.Functionn);
pThunk.u1.Functionn := PDWORD(pApiNew);
Result := True;
dwNewProtect := dwProtect;
VirtualProtect(Pointer(@pThunk.u1.Functionn), sizeof(DWORD),dwNewProtect, @dwProtect);
end;
end;
end;
Inc(PThunk);
end;
Inc(pImportDEsc);
end;
end;
← →
Powerland © (2004-08-26 01:06) [4]причём если это производит внутри программы, т.е. SetProc внести в код программы из длл, то с в программе перехват работает успешно...
← →
Digitman © (2004-08-26 08:25) [5]покажи как, с какими параметрами и в каком месте текста ДЛЛ ты вызываешь ф-цию перехвата
p.s.
в общем случае замены элемента таблицы импорта недостаточно
нужно еще заменять соотв.элемент таблицы экспорта
← →
Powerland © (2004-08-26 09:37) [6]где-то в программе производим внедрение.
AttachDllToProcess(pID,"c:\hook.dll");
а далее уже в длл(после загрузки её в память) производим замену.
p - сюда будет помещён указатель на старую функцию(т.е. user32=>MessageBoxA).InterceptDllCall(Handle,"user32.dll", "MessageBoxA",@MyMessageBox, @MessageBoxA,p);
← →
Digitman © (2004-08-26 09:51) [7]
> после загрузки её в память
т.е. в ходе инициализации ?
> InterceptDllCall(Handle,"user32.dll", "MessageBoxA",@MyMessageBox,
> @MessageBoxA,p);
что такое в дан.случае Handle ?
← →
Powerland © (2004-08-26 10:16) [8]> после загрузки её в память
да.
> что такое в дан.случае Handle ?
хэндл, который получаем через GetCurrentProcess();
← →
Digitman © (2004-08-26 10:23) [9]
> хэндл, который получаем через GetCurrentProcess();
так это же неверно !
передаваемым хэндлом д.б. хэндл того модуля, таблица импорта которого подвергается правке
например, GetModuleHandle(0)
← →
Powerland © (2004-08-26 10:31) [10]всё равно не работает. я раньше перехват делал другим способом. а сейчас нужно сделать именно так.
← →
Digitman © (2004-08-26 10:43) [11]
> Powerland © (26.08.04 10:31) [10]
function SetProcAddress(hModule: THandle; lpProcName: PChar; pProcAddr: Pointer): Boolean;
var
Peb: PPeb;
hProcess, hImporter: THandle;
pOptHdr: PImageOptionalHeader;
pImpDir: PImageImportDescriptor;
pExpDir: PImageExportDirectory;
pIATEntry: PImageThunkData;
pOldProcAddr: Pointer;
pdwNamePtr, pdwEntryPoint: PDWord;
pName: PChar;
pwOrdinalPtr: PWord;
i, nOrdinal, dwNewProcAddrRVA, dwProtect: DWord;
pLdrData : PPEB_LDR_DATA;
pLoadOrderList : PPLIST_ENTRY;
pInLoadModuleEntry: PModuleEntry;
pModuleNfo: PModuleInfo;
pImpModuleNfo: PModuleInfo;
sModuleName: String;
dwDirSize: DWord;
begin
Result := False;
if (hModule = 0) or (lpProcName = nil) then Exit;
peb := GetCurrentPEB;
LockLoader(Peb);
try
pModuleNfo := FindModuleInfo(hModule);
if not Assigned(pModuleNfo) then Exit;
sModuleName := WideCharToString(pModuleNfo^.BaseDllName.Buffer);
pOptHdr := PImageOptionalHeader(hModule + PImageDosHeader(hModule)._lfanew + SIZE_OF_NT_SIGNATURE + IMAGE_SIZEOF_FILE_HEADER);
dwDirSize := pOptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
if (pOptHdr^.NumberOfRvaAndSizes < 16) or (dwDirSize = 0) then Exit;
pExpDir := PImageExportDirectory(hModule + pOptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
pdwEntryPoint := nil;
pwOrdinalPtr := PWord(hModule + DWord(pExpDir^.AddressOfNameOrdinals));
if HiWord(DWord(lpProcName)) = 0 then
begin
nOrdinal := LoWord(DWord(lpProcName)) - pExpDir^.Base;
if (nOrdinal < pExpDir^.NumberOfFunctions) then
pdwEntryPoint := PDWord(hModule + DWord(pExpDir^.AddressOfFunctions) + nOrdinal * SizeOf(PDWord));
end
else
begin
pdwNamePtr := PDWord(hModule + DWord(pExpDir^.AddressOfNames));
for i := 0 to pExpDir^.NumberOfNames - 1 do
begin
pName := PChar(PDWord(hModule + PDword(pdwNamePtr)^));
if lstrcmp(pName,lpProcName) = 0 then
begin
nOrdinal := pwOrdinalPtr^;
pdwEntryPoint := PDWord(hModule + DWord(pExpDir^.AddressOfFunctions) + nOrdinal * SizeOf(PDWord));
Inc(nOrdinal, pExpDir^.Base);
Break;
end
else
begin
Inc(pdwNamePtr);
Inc(pwOrdinalPtr);
end
end;
end;
if not Assigned(pdwEntryPoint) then Exit;
pOldProcAddr := Pointer(hModule + pdwEntryPoint^);
if pOldProcAddr = pProcAddr then
Result := True
else
try
dwNewProcAddrRVA := DWord(pProcAddr) - hModule;
hProcess := OpenProcess(PROCESS_VM_OPERATION, False, GetCurrentProcessId);
Win32Check(hProcess <> 0);
try
Win32Check(VirtualProtectEx(hProcess, pExpDir, dwDirSize, PAGE_WRITECOPY, dwProtect));
try
pdwEntryPoint^ := dwNewProcAddrRVA;
finally
VirtualProtectEx(hProcess, pExpDir, dwDirSize, dwProtect, dwProtect);
end;
pName := PChar(sModuleName);
pLdrData := Peb^.LdrData;
pLoadOrderList := @pLdrData.InLoadOrderModuleList;
pInLoadModuleEntry := PModuleEntry(pLoadOrderList^);
while PPListEntry(pInLoadModuleEntry) <> pLoadOrderList do
begin
pImpModuleNfo := @pInLoadModuleEntry.ModuleInfoData;
if pImpModuleNfo <> pModuleNfo then
begin
hImporter := THandle(pImpModuleNfo^.DllBase);
pOptHdr := PImageOptionalHeader(hImporter + PImageDosHeader(hImporter)._lfanew + SIZE_OF_NT_SIGNATURE + IMAGE_SIZEOF_FILE_HEADER);
if pOptHdr^.NumberOfRvaAndSizes = 16 then
begin
dwDirSize := pOptHdr^.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size;
if dwDirSize > 0 then
begin
pImpDir := PImageImportDescriptor(hImporter + pOptHdr^.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while Assigned(PChar(pImpDir^.RVAImportModuleName)) do
begin
if lstrcmpi(PChar(hImporter + pImpDir^.RVAImportModuleName), pName) = 0 then
begin
pIATEntry := PImageThunkData(hImporter + DWord(pImpDir^.RVAImportAddressTable));
while Assigned(pIATEntry^.Func) do
begin
if pIATEntry^.Func = pOldProcAddr then
begin
Win32Check(VirtualProtectEx(hProcess, pIATEntry, SizeOf(pIATEntry), PAGE_WRITECOPY, dwProtect));
try
pIATEntry^.Func := pProcAddr;
finally
VirtualProtectEx(hProcess, pIATEntry, SizeOf(pIATEntry), dwProtect, dwProtect);
end;
Break;
end;
Inc(pIATEntry);
end;
end;
Inc(pImpDir);
end;
end;
end;
end;
pInLoadModuleEntry := PModuleEntry(pInLoadModuleEntry.InLoadOrderLinks.Flink);
end;
finally
CloseHandle(hProcess);
end;
Result := True;
except
end;
finally
UnLockLoader(Peb);
end;
end;
← →
Powerland © (2004-08-26 10:49) [12]спасибо. а можно узнать откуда этот код? хочется узнать больше относительно этой темы...
← →
Digitman © (2004-08-26 10:49) [13]function SetApiHook(hModule: THandle; ProcName: PChar; ProcAddr: Pointer): Pointer;
begin
Result := GetProcAddress(hModule, ProcName);
if Assigned(Result) and not SetProcAddress(hModule, ProcName, ProcAddr) then Result := nil;
end;
..
//установка
pOldMessageBoxA := SetApiHook(GetModuleHandle("USER32.DLL"), "MessageBoxA", @MyMessageBox);
//снятие
SetApiHook(GetModuleHandle("USER32.DLL"), "MessageBoxA", pOldMessageBoxA);
← →
Powerland © (2004-08-26 10:52) [14]> [12]
← →
Digitman © (2004-08-26 10:52) [15]
> Powerland © (26.08.04 10:49) [12]
> откуда этот код? хочется узнать
> больше относительно этой темы...
код мой.
ориентирован только на НТ-совместимые системы
← →
Powerland © (2004-08-26 11:01) [16]ну а м.б. какие-то ссылки есть? может ещё чего полезного узнаю.
← →
N_O © (2004-08-29 10:20) [17]уважаемый Digitman. посмотрев вам код [11] япопробовал его использовать. при компиляции было найдено много ошибок. неизвестные типы и функции.
[Error] Lib.dpr(30): Undeclared identifier: "PPeb"
[Error] Lib.dpr(41): Undeclared identifier: "PPEB_LDR_DATA"
[Error] Lib.dpr(42): Undeclared identifier: "PPLIST_ENTRY"
[Error] Lib.dpr(43): Undeclared identifier: "PModuleEntry"
[Error] Lib.dpr(44): Undeclared identifier: "PModuleInfo"
[Error] Lib.dpr(51): Undeclared identifier: "GetCurrentPEB"
[Error] Lib.dpr(52): Undeclared identifier: "LockLoader"
[Error] Lib.dpr(54): Undeclared identifier: "FindModuleInfo"
и много других ошибок. объясните незнающему человеку что это за типы и функции...
← →
Digitman © (2004-08-29 11:56) [18]TUNICODE_STRING = packed record
Length: Word;
MaximumLength: Word;
Buffer: PWideChar;
end;
TNtUnicodeString = TUNICODE_STRING;
PNtUnicodeString = ^TNtUnicodeString;
PLIST_ENTRY = ^TLIST_ENTRY;
TLIST_ENTRY = packed record
Flink : PLIST_ENTRY;
Blink : PLIST_ENTRY;
end;
PPLIST_ENTRY = ^PLIST_ENTRY;
TListEntry = TLIST_ENTRY;
PListEntry = ^TListEntry;
PPListEntry = PPLIST_ENTRY;
TModuleInfo = packed record
DllBase : Pointer;
EntryPoint : Pointer;
SizeOfImage : Cardinal;
FullDllName : TUNICODE_STRING;
BaseDllName : TUNICODE_STRING;
Flags : Cardinal;
LoadCount : Word;
TlsIndex : Word;
HashLinks : TLIST_ENTRY;
SectionPointer : Pointer;
CheckSum : Cardinal;
TimeDateStamp : Cardinal;
LoadedImports : Pointer;
EntryPointActivationContext : Pointer;
end;
PModuleInfo = ^TModuleInfo;
TLDR_DATA_TABLE_ENTRY = packed record
InLoadOrderLinks : TLIST_ENTRY;
InMemoryOrderLinks : TLIST_ENTRY;
InInitializationOrderLinks : TLIST_ENTRY;
ModuleInfoData: TModuleInfo;
end;
PLDR_DATA_TABLE_ENTRY = ^TLDR_DATA_TABLE_ENTRY;
TModuleEntry = TLDR_DATA_TABLE_ENTRY;
PModuleEntry = ^TModuleEntry;
TPEB = packed record
{000} InheritedAddressSpace : ByteBool;
{001} ReadImageFileExecOptions : ByteBool;
{002} BeingDebugged : ByteBool;
{003} SpareBool : ByteBool;
{004} Mutant : Pointer;
{008} ImageBaseAddress : Pointer;
{00C} LdrData : Pointer; //PPEB_LDR_DATA; { Modules list }
{010} ProcessParameters : Pointer; //PRTL_USER_PROCESS_PARAMETERS; { _RTL_USER_PROCESS_PARAMETERS }
{014} SubSystemData : Pointer;
{018} ProcessHeap : Pointer;
{01C} FastPebLock : PRTLCriticalSection;
{020} FastPebLockRoutine : Pointer;
{024} FastPebUnlockRoutine : Pointer;
{028} EnvironmentUpdateCount : Cardinal;
{02C} KernelCallbackTable : Pointer;
{030} SystemReserved : Cardinal;
{034} ExecuteOptions : Cardinal; {Pos 0, 2 Bits, SpareBits : Pos 2, 30 Bits }
{038} FreeList : Pointer; { _PEB_FREE_BLOCK }
{03C} TlsExpansionCounter : Cardinal;
{040} TlsBitmap : Pointer;
{044} TlsBitmapBits : array[0..1] of Cardinal;
{04C} ReadOnlySharedMemoryBase : Pointer;
{050} ReadOnlySharedMemoryHeap : Pointer;
{054} ReadOnlyStaticServerData : Pointer;
{058} AnsiCodePageData : Pointer;
{05C} OemCodePageData : Pointer;
{060} UnicodeCaseTableData : Pointer;
{064} NumberOfProcessors : Cardinal;
{068} NtGlobalFlag : Cardinal;
{06C} Reserved0 : DWord;
{070} CriticalSectionTimeout : TLARGEINTEGER;
{078} HeapSegmentReserve : Cardinal;
{07C} HeapSegmentCommit : Cardinal;
{080} HeapDeCommitTotalFreeThreshold : Cardinal;
{084} HeapDeCommitFreeBlockThreshold : Cardinal;
{088} NumberOfHeaps : Cardinal;
{08C} MaximumNumberOfHeaps : Cardinal;
{090} ProcessHeaps : Pointer;
{094} GdiSharedHandleTable : Pointer;
{098} ProcessStarterHelper : Pointer;
{09C} GdiDCAttributeList : Cardinal;
{0A0} LoaderLock : PRTLCriticalSection;
{0A4} OSMajorVersion : Cardinal;
{0A8} OSMinorVersion : Cardinal;
{0AC} OSBuildNumber : Word;
{0AE} OSCSDVersion : Word;
{0B0} OSPlatformId : Cardinal;
{0B4} ImageSubsystem : Cardinal;
{0B8} ImageSubsystemMajorVersion : Cardinal;
{0BC} ImageSubsystemMinorVersion : Cardinal;
{0C0} ImageProcessAffinityMask : Cardinal;
{0C4} Reserved2 : array[0..34] of DWord;
{150} Reserved3 : DWord;
{154} Reserved4 : array[0..31] of DWord;
{1D4} Win32WindowStation : THandle;
{1D8} Reserved5 : DWord;
{1DC} Reserved6 : DWord;
{1E0} CSDVersion : PWord;
{1E4} Reserved7 : DWord;
{1E8}
end;
PPEB = ^TPEB;
function GetCurrentPEB: PPEB;
asm
mov eax, fs:[TTeb.Peb]
end;
procedure LockLoader(PEB: PPEB);
begin
RtlEnterCriticalSection(PEB.LoaderLock);
end;
procedure UnlockLoader(PEB: PPEB);
begin
RtlLeaveCriticalSection(PEB.LoaderLock);
end;
function FindModuleInfo(hModule: THandle): PModuleInfo;
var
Peb: PPeb;
pLdrData : PPEB_LDR_DATA;
pLoadOrderList : PPLIST_ENTRY;
pInLoadModuleEntry: PModuleEntry;
begin
Result := nil;
if hModule = 0 then Exit;
Peb := GetCurrentPeb;
LockLoader(Peb);
try
pLdrData := Peb^.LdrData;
pLoadOrderList := @pLdrData.InLoadOrderModuleList;
pInLoadModuleEntry := PModuleEntry(pLoadOrderList^);
while PPListEntry(pInLoadModuleEntry) <> pLoadOrderList do
begin
Result := @pInLoadModuleEntry.ModuleInfoData;
if Result^.DllBase = Pointer(hModule) then
Exit;
pInLoadModuleEntry := PModuleEntry(pInLoadModuleEntry.InLoadOrderLinks.Flink);
end;
Result := nil;
finally
UnLockLoader(Peb);
end;
end;
function GetModuleInfo(lpModule: PChar; out ModuleInfo: TModuleInfo): Boolean;
var
peb: PPeb;
hModule: THandle;
pLdrData : PPEB_LDR_DATA;
pLoadOrderList : PPLIST_ENTRY;
pInLoadModuleEntry: PModuleEntry;
pModuleNfo: PModuleInfo;
begin
Result := False;
if not Assigned(lpModule) then Exit;
peb := GetCurrentPeb;
LockLoader(Peb);
try
hModule := FindHInstance(lpModule);
if hModule = 0 then Exit;
if hModule <> THandle(lpModule) then
hModule := GetModuleHandle(lpModule);
if hModule = 0 then Exit;
pLdrData := peb^.LdrData;
pLoadOrderList := @pLdrData.InLoadOrderModuleList;
pInLoadModuleEntry := PModuleEntry(pLoadOrderList^);
while PPListEntry(pInLoadModuleEntry) <> pLoadOrderList do
begin
pModuleNfo := @pInLoadModuleEntry.ModuleInfoData;
if pModuleNfo^.DllBase = Pointer(hModule) then
begin
if Assigned(@ModuleInfo) then
ModuleInfo := pModuleNfo^;
Result := True;
Break;
end;
pInLoadModuleEntry := PModuleEntry(pInLoadModuleEntry.InLoadOrderLinks.Flink);
end;
finally
UnLockLoader(Peb);
end;
end;
← →
kaZaNoVa (2004-08-30 15:05) [19]нехватает определения PPEB_LDR_DATA;
RtlEnterCriticalSection(PEB.LoaderLock);
компилятор ругается на
function GetCurrentPEB: PPEB;
asm
mov eax, fs:[TTeb.Peb]
end;
Уважаемый Digitman, пожалуйста, дайте _полный_ код модуля со всеми определениями, + что дополнительно прописывать в uses ;)
- мне это крайне важно !
← →
Digitman © (2004-08-30 15:09) [20]PClientId = ^TClientId;
TClientId = record
UniqueProcess: THandle; // Process ID
UniqueThread: THandle; // Thread ID
end;
CLIENT_ID = TClientId;
TPEB_LDR_DATA = packed record
Length : Cardinal;
Initialized : Byte;
AlignmentBytes : array[1..3] of Byte;
SsHandle : THandle;
{ ?????? ????????? TLDR_DATA_TABLE_ENTRY }
InLoadOrderModuleList : PLIST_ENTRY;
InMemoryOrderModuleList : PLIST_ENTRY;
InInitializationOrderModuleList : PLIST_ENTRY;
EntryInProgress : Pointer;
end;
PPEB_LDR_DATA = ^TPEB_LDR_DATA;
PTeb = ^TTeb;
TTeb = packed record
Tib : TNtTib;
Environment : PWideChar;
ClientId : TClientId;
RpcHandle : THandle;
ThreadLocalStorage: Pointer; // PPointer
Peb : PPeb;
LastErrorValue : DWORD;
end;
_TEB = TTeb;
PNtTib = ^TNtTib;
_NT_TIB = record
ExceptionList : Pointer; // ^_EXCEPTION_REGISTRATION_RECORD
StackBase : Pointer;
StackLimit : Pointer;
SubSystemTib : Pointer;
case Integer of
0: (FiberData : Pointer);
1: (Version : ULONG;
{ end; }
ArbitraryUserPointer: Pointer;
Self : PNtTib);
end;
TNtTib = _NT_TIB;
> дайте _полный_ код модуля со всеми определениями
разбежался !
там несколько тысяч строк, многие из которых не имеют отношения к сабжу ...
MSDN + Коберниченко в зубы - и вперед !! ... До полного просветления !!
← →
kaZaNoVa (2004-08-30 18:39) [21][20] Digitman © (30.08.04 15:09)
спасибо, сейчас попробую ;)
> разбежался !
> там несколько тысяч строк, многие из которых не имеют отношения
> к сабжу ...
Извините, я не хотел Вас оскорбить, НО, "неполное знание несовершенно" (как сказал классик (*не помню кто*)), если Вы даёте полностью рабочий код, то, пожалуйста, будьте добры его дать в том виде, чтобы он работал (с необходимыми обьявлениями типов и т.д.)
По поводу моей просьбы о полном коде модуля - я извиняюсь, я не знал, что он такой большой и что там много того, что не имеет отношения к рассматриваемой задаче, просто поймите, иногда так бывает обидно, когда вот так найдёшь код, который когдато был так нужен, а он оказывается неполон, и , следовательно, не работает ... :(
про > Коберниченко
не слыхал, спасибо, поищу ...
P.S. Вы не первый раз давали это пример кода перехвата, и, каждый раз "кусочками", для понимания сложности и принципов перехвата этого может и достаточно, но для реальной работы с ним конечно же нет :)
P.P.S. я давно интересуюсь возможностими перехвата АПИ - функций, но пока у меня ничего "путного" не получалось, возможно из-за моей не очень большой квалификации . :(
← →
kaZaNoVa (2004-08-30 18:57) [22]осталась проблема с PImageImportDescriptor,PImageThunkData и SIZE_OF_NT_SIGNATURE, будьте добры, помогите :)
please !
и что-нить "дополнительное" нужно в uses ?
← →
noname © (2004-08-30 20:11) [23]Скачай HideModule:
http://dragonteam.nm.ru/Docs/F_HideModule.htm
Там в HideTypes я объявил (чуть-чуть по-другому) все необходимые мне типы. Также есть 2 Demo по перехвату API
1. Перехват модифицированнием первых байтов функции
2. Перехват изменением IAT
← →
kaZaNoVa (2004-08-30 23:47) [24][23] noname © (30.08.04 20:11)
ОГРОМНОЕ спасибо, СУПЕР модуль, как раз искал такой , ещё раз спасибо !
← →
Digitman © (2004-08-31 09:14) [25]
> noname © (30.08.04 20:11) [23]
> 2. Перехват изменением IAT
еще раз повторюсь - изменения только одной IAT недостаточно, в частном случае это будет работать, в общем же случае - далеко не всегда
если процесс создает доп.тред , который получает адрес перехватываемой ф-ции динамически, т.е. по GetProcAddress(), с целью дальнейшего ее вызова, то адрес этот берется не из IAT, а из EAT, которая не подверглась соотв.изменению, и, следовательно, будет вызвана оригинальная ф-ция, а не та которая должна вызываться в рез-те перехвата ... отсюда и вывод - для таких случаев (а они оч даже нередки) необходимо кроме модификации IAT модифицировать еще и ЕAT
← →
noname © (2004-08-31 09:37) [26]А в чём проблема - правим в IAT адрес GetProcAddress.
Хотя я согласен, что правка EAT надёжнее =) Есть один способ загрузки не через LoadLib+GetProcAddr. То есть через PEB+EAT.
← →
Digitman © (2004-08-31 13:06) [27]
> Хотя я согласен, что правка EAT надёжнее
не то слово
как раз это в вышеприведенном коде и реализовано - IAT + EAT
← →
noname © (2004-08-31 13:57) [28]Я заметил =)
← →
kaZaNoVa (2004-08-31 18:49) [29]Digitman , осталась проблема с PImageImportDescriptor,PImageThunkData и SIZE_OF_NT_SIGNATURE, будьте добры, помогите :)
please !
← →
Digitman © (2004-09-01 08:41) [30]SIZE_OF_NT_SIGNATURE = SizeOf(DWord);
IMAGE_MAX_SECTIONS = MAXWORD + 1; //Note that the Windows NT loader limits the Number of Sections to 96.
IMAGE_MAX_IMPORT_MODULES = MAXWORD + 1;
IMAGE_MAX_IMPORT_MODULE_ENTRIES = MAXWORD + 1;
type
PImageImportByName = ^TImageImportByName;
TImageImportByName = packed record
Hint: Word;
Name: packed array[0..0] of char;
end;
PImageThunkData = ^TImageThunkData;
TImageThunkData = packed record
case Byte of
0: (ForwarderString: PByte);
1: (Func: PLongWord);
2: (Ordinal: LongWord);
3: (AddressOfData: PImageImportByName);
end;
PImportLookupTable = ^TImportLookupTable;
TImportLookupTable = packed array[0..IMAGE_MAX_IMPORT_MODULE_ENTRIES - 1] of TImageThunkData;
PImportAddressTable = ^TImportAddressTable;
TImportAddressTable = packed array[0..IMAGE_MAX_IMPORT_MODULE_ENTRIES - 1] of TImageThunkData;
PImageImportDescriptor = ^TImageImportDescriptor;
TImageImportDescriptor = packed record
RVAImportLookupTable: PImportLookupTable;
TimeDateStamp: LongWord;
FowarderChain: LongWord;
RVAImportModuleName: LongWord;
RVAImportAddressTable: PImportAddressTable;
end;
← →
kaZaNoVa (2004-09-01 13:47) [31][30] Digitman © (01.09.04 08:41)
thanks, ;)
← →
kaZaNoVa (2004-09-02 14:32) [32]Digitman у меня получилось скомпилировать, и запустить ..
но есть проблема ...
при попытке вызова "перехваченной" функции процесс начинает дико потреблять память и зависает !
- подскажите, чем это может быть вызвано ?
← →
Digitman © (2004-09-02 14:34) [33]
> kaZaNoVa (02.09.04 14:32) [32]
> Digitman у меня получилось скомпилировать
> чем это может быть вызвано ?
да всем чем угодно
покажи как используешь ф-цию
← →
kaZaNoVa (2004-09-02 14:35) [34]function MyMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
begin
result:=MessageBoxA(0, PChar("Call intercepted"#$A#$D"Original text is :"+lpText),
"MessageBoxA intercepted", 0);
end;
begin
SetDebugPriv;
pOldMessageBoxA:= SetApiHook(GetModuleHandle("USER32.DLL"), "MessageBoxA", @MyMessageBoxA);
if pOldMessageBoxA<>nil then beep;
end.
← →
Digitman © (2004-09-02 14:43) [35]
> kaZaNoVa (02.09.04 14:35) [34]
дык ... еклмн! ... ты ж здесь влупил бесконечную рекурсию !
каждый вызов MessageBoxA приводит к вызову MyMessageBoxA, который , в свою очередь, вновь приводит к вызову MessageBoxA !
это из серии "У попа была собака .."(С)
← →
Digitman © (2004-09-02 14:45) [36]function MyMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
begin
result:=pOldMessageBoxA(0, PChar("Call intercepted"#$A#$D"Original text is :"+lpText),
"MessageBoxA intercepted", 0);
end;
← →
kaZaNoVa (2004-09-02 15:34) [37][35] Digitman © (02.09.04 14:43) Огромное спасибо !!!
всё получилось !
я правда немного "извратился" и сделал так:
function MyMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
begin
SetApiHook(GetModuleHandle("USER32.DLL"), "MessageBoxA", pOldMessageBoxA);
result:=MessageBoxA(0, PChar("Call intercepted"#$A#$D"Original text is :"+lpText),
"MessageBoxA intercepted", 0);
pOldMessageBoxA:= SetApiHook(GetModuleHandle("USER32.DLL"), "MessageBoxA", @MyMessageBoxA);
end;
- я сам удивился, как сделал такую глупую ошибку с рекурсией .. совсем забыл, что функцию, которую вызываю, уже перехватил !
теперь понятно, откуда зависание и безумное потребление памяти !!!
ещё раз спасибо :)
p.s. интересно, почему все в примерах перехватывают messagebox ??
я сперва хотел перехватить sleep() но показалось что слишком "смешная" функция .... :)))
← →
Digitman © (2004-09-02 15:40) [38]
> kaZaNoVa (02.09.04 15:34) [37]
работает ? ну так - ура ?! .. а куда оно денется !)
← →
хакер_новичок (2004-09-02 17:50) [39]Удалено модератором
← →
хакер_новичок (2004-09-02 17:53) [40]Удалено модератором
Страницы: 1 2 3 4 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.042 c