Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Перехват API - окончание 22.10.01 07:13
Автор: NeuronViking Статус: Незарегистрированный пользователь
|
Вот оно, свершилось! После долгих и продолжительных родов с Божьей помощью и помощью умелых акушеров ;) удалось таки произвести на свет красивую(вроде бы!), универсальную и маленькую процедурку перехвата вызовов API:
typedef void (*tagAPIAddr)();
tagAPIAddr APIAddress;
BYTE pbOpcode[5]={0};
DWORD dwNumOfParams;
void Stub(void){
memcpy(APIAddress, pbOpcode, 5);
PDWORD dwParamPtr;
PDWORD dwEsp;
DWORD dwBeforeCall;
DWORD dwRetAddr;
DWORD dwEbpSaved;
DWORD dwNumParams=dwNumOfParams*4;
MessageBox(NULL,"Test","ExitProcess called!",0);
__asm{
mov dwEbpSaved,ebp
mov eax,[ebp]
mov eax,dwRetAddr
lea eax,[ebp+8]
mov [dwParamPtr],eax
mov eax, [ebp+12]
mov dwBeforeCall,eax
sub esp, dwNumParams
mov [dwEsp],esp
}
memcpy(dwEsp,dwParamPtr,dwNumParams);
__asm{
call APIAddress
mov esp, dwBeforeCall
mov ecx, dwRetAddr
mov ebp, dwEbpSaved
jmp ecx
}
}
int _cdecl main(int argc, char* argv[]){
PBYTE pbAPI=(PBYTE)trap002;GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitProcess");
APIAddress=(tagAPIAddr)pbAPI;
memcpy(pbOpcode,pbAPI,5);
SetMemoryRWAccess((LPVOID)pbAPI);
pbAPI[0] = 0xE9;
PDWORD pdwAPI = (DWORD *)&pbAPI[1];
pdwAPI[0] = (DWORD)Stub - (DWORD)pbAPI - 5;
dwNumOfParams=1;
return 0;
}
|
 |
[Win32] Перехват API - окончание 22.10.01 08:55
Автор: ggg <ggg> Статус: Elderman
|
1) всё-таки способ доступа к аргументам который я предложил более универсальный:
void Stub(unsigned arg)
{
unsigned* arg1 = &arg;
// unsigned* arg_i = arg1+i;
мало ли чего там компилятор навставляет вначале функции
а так компилятор сам всегда пропишет правильный адрес
2) а ты пробовал запустить точно то, что ты тут написал ?
может быть сказывается бессонная ночь и я просто не въезжаю в код :)
но по-моему некоторые вещи немного странные
> mov eax,[ebp] > mov eax,dwRetAddr > lea eax,[ebp+8]
3) в такой реализации ловушка будет вызвана только один раз,
а у меня ловушка снималась только когда нужно её снять
4) вот высплюсь и попробую родить ловушку на асме, как положено :)
тогда уж точно она будет работать под разными компиляторами и с разными функциями
если кто-нить до меня не родит :)
|
 |  |
Или я тупой или исчо что-то... 22.10.01 16:07
Автор: Heromantor Статус: Незарегистрированный пользователь
|
Что-то сомнительный код... А он работает?
|
 |  |
5) 22.10.01 08:58
Автор: ggg <ggg> Статус: Elderman
|
5) на мой вопрос про соглашение stdcall ты сам ответил, что должны сохраняться esi, edi, ebx, edx
так что нужно их сохранять и восстанавливать
а уж это сделать не на чистом асме не получится
|
 |  |  |
Перехват API - окончание 22.10.01 23:24
Автор: NeuronViking Статус: Незарегистрированный пользователь
|
> 5) на мой вопрос про соглашение stdcall ты сам ответил, что > должны сохраняться esi, edi, ebx, edx > так что нужно их сохранять и восстанавливать > а уж это сделать не на чистом асме не получится
это делает компиллер.
Вставить код прописывающий обратно код заглушки не проблема :))), я просто показал "сырец" .. минимум того что нужно... Код абсолютно рабочий и универсальный.. насчет извлечения параметров - ты прав, твой метод наверное лучше...
|
|
|