Форум: "WinAPI";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
ВнизОсуществить перехват АПИ функции на Делфи Найти похожие ветки
← →
FireMan_Alexey © (2004-01-28 15:02) [0]Ув. Мастера помогите пожалуйста с перехватом АПИ функции на делфи
нужен какой-нибудь исходник для изучения(на Делфи)!
пожалуйста поделитесь опытом!!
Очень прошу!
← →
Digitman © (2004-01-28 17:16) [1]а теорию почитать - никак ?
← →
FireMan_Alexey © (2004-01-29 10:13) [2]Ув. Digitman пойми меня правильно, если будет рабочий исходник, то разобраться в нем будет, я думаю, не очень сложно!
Я нашел в сети два теоретических примера, исходники в которых не работают!
Тогда смысл в этой теории.
Я конечно примерно понял принцип действия подмены, т.е. создаешь свою DLL в которой подменяешь все функции, а затем из своей DLL вызываешь первоначальную. Но кто мне подскажет где есть полный список всех функций находящихся в той или иной DLL. Может есть какие-то другие примеры перехвата
поделитесь пожалуйста.
Может есть какой-нибудь другой способ (типа ДОС перехват прерывания, получив указатель на функцию и работай далее).
Просто я уже перелопатил все старые форумы на наличие ответа на данный вопрос, но ничего толком и не нашел!
← →
Digitman © (2004-01-29 10:43) [3]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;
← →
Digitman © (2004-01-29 10:44) [4]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;
← →
FireMan_Alexey © (2004-01-30 12:10) [5]Огромнейшее спасибо Digitman!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.031 c