информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetСтрашный баг в WindowsПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[win32] вот исходный код, он глючит :((( 22.10.01 03:20  Число просмотров: 920
Автор: NeuronViking Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Яб предложил прибавить к esp 4 после call и что-то слишком
> заумно получаеться... Я бы сделал так:
> void Stub(char *str)
> {
> char buf[16384];
>
> memcpy(APIAddress, pbOpcode, 5);
> _asm push str
> _asm call APIAddress
> _asm add esp,4
> }
>
> Компилятор включает проверку esp только в Debug версии(cmp
> esp,ebp _chkesp). Так что в Release баг есть но не виден

это то все понятно, все правильно конечно, но это верно ТОЛЬКО для одной конкретной функции, а если мне нужно произвольную функцию перехватить?!
<programming>
[Win32] Перехват API ! - продолжение 21.10.01 00:21  
Автор: NeuronViking Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Привет All!

1) Спасибо всем кто помогал мне постигать тайны программинга :)
вот теперь возникла несколько другая праблем....
Задача такая: после перехвата вызова и передачи управления на мою stub-функцию мне нужно внутри этой stub после некоторых действий опять вернуть управление действительной функции так, как будто бы никакого перехвата не было ... как это осуществлять(в общих словах если можно)?!
1)
2)
...
н)
[Win32] Перехват API ! - продолжение 21.10.01 01:06  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
если ты перехватываешь управление на первом же байте api, то на регистры кажется можно забить

т.е. нужно только стек в прежнее состояние вернуть

т.е. если ты перехватывал с помощью jmp, то и возвращаться нужно jmp на следующую команду
если call, то ret

не забудь только какие-нить переменные свои в стеке

чуть не забыл :)
ты же переписываешь несколько байт кода перехватываемой функции :)
т.е. тебе нужно както выполнить те действия, которые там делались без тебя :)
в общем случае это если и возможно сделать, то трудно
но для конкретной функции можно подумать...
(тут и на регистры нельзя забивать) :)

лучше придумать другой способ подмены функции
например (не для kernel32.dll):
используй \delayload:name.dll
и вставь свой обработчик загрузки (см. msdn)
вместо правильного адреса вернёшь свой адрес
так тебе не прийдётся переписывать код dll
[Win32] Перехват API ! - продолжение 21.10.01 01:41  
Автор: NeuronViking Статус: Незарегистрированный пользователь
<"чистая" ссылка>
насчет delayload:name.dll спасибо! я об этой фиче не знал ... нужно разобраться.
Но мне нужна именно таким способом который я указал...
т.е. делаем следующее:
1) пишем 5ть байт(call MyStubProc) на место первых 5и байт перехватываемой функции
2) когда эта перехватываемая функция фызывается, то вместо неё исполняется наша stub
3) внутри stub делаем свои дела
4) внутри stub продолжаем выполнение перехваченной функции
5) завершаем stub

трудности представляютЬ 4) и 5) пункты
4) ....... тут простым ret явно не отделаться...для того чтобы спокойно передать управление перехваченной функции нужно так откорректировать стек чтобы он был как до перехвата чтобы параметры не заглючили... даже если я вычислю адрес начала параметров в стеке и запихаю его в стек перед вызовом то все равно глючит :((( ..я ща здохну! ... как это мона сделать а?!

ЗЫ: странно зарегистрился а пароль не пришел
ЗЗЫ: СофтАйс сука падаетв 2000!
<без заголовка> 29.10.01 05:38  
Автор: hex.sex <Computer-Hitler> Статус: Elderman
<"чистая" ссылка>
>ЗЗЫ: СофтАйс сука падаетв 2000!
не он один
[Win32] Перехват API ! - продолжение 21.10.01 13:37  
Автор: Heromantor Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> 1) пишем 5ть байт(call MyStubProc) на место первых 5и байт
> перехватываемой функции
> 2) когда эта перехватываемая функция фызывается, то вместо
> неё исполняется наша stub
> 3) внутри stub делаем свои дела
> 4) внутри stub продолжаем выполнение перехваченной функции
> 5) завершаем stub
>
> трудности представляютЬ 4) и 5) пункты
> 4) ....... тут простым ret явно не отделаться...для того
> чтобы спокойно передать управление перехваченной функции
> нужно так откорректировать стек чтобы он был как до
> перехвата чтобы параметры не заглючили... даже если я
> вычислю адрес начала параметров в стеке и запихаю его в
> стек перед вызовом то все равно глючит :((( ..я ща здохну!
> ... как это мона сделать а?!

Predlagayu sdelat` tak: ti menyaesh 5 bait no sna4ala nado ih sohranit` => delaem global`nuy peremennuy BYTE oldopcode[5], zatem pered tem kak ti postavish svoi 5 bait skopiruy ih v etu peremennuy, a v stub pri vihode skopiruy ih obratno, kone4no togda polu4aetsya 4to stub vizivaet`sya odin raz. Plus sa4em delat` call? lu4she jmp na stub i essno jmp obratno na na4alo f-cii. Is4o lu4she postavit` tot kod kotoriy ti zamenyaesh k sebe no togda nado znat` dlinu komand kotorie ti zamenyaesh obi4no navernoe doljno bit` 4to-to vrode
55 push ebp
8BE5 mov esp,ebp
a dalshe hz 4to mojet bit`....
Esli nado dlya odnoy konkretnoy f-cii to mojno posmotrt` vru4nuy 4to-tam skajem tam mojet bit` 4to-to vrode
55 push ebp
8BE5 mov esp,ebp
BF0100000 mov eax,1
dlina 3-h komand = 1+2+5=8 bait sootvetsvenno zapominaem ih i v konce stub vipolnyaem(stek doljen bit` normal`niy ego nado sohranyat` esli ti delaesh call to nado izvle4` adres vozvrata a vosvrashat`sya iz f-cii 4erez jmp) potom delaem jmp mimo etih kommand i vse doljno bit` noraml`no.
[Win32] Перехват API ! - продолжение 21.10.01 03:13  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
delayload - только с 6 версии VC (в 5 кажется ещё не было)

ты используешь JMP, значит и возвращаться ты должен по JMP (или сам пихай нужный адрес в стек, а потом RET)

посмотри какие команды ты переписываешь, тогда поймёшь почему после возврата не работает старая функция (может быть ты даже не целое количество команд переписываешь - тогда там дальше вообще бред будет)
[Win32] Перехват API ! - продолжение 21.10.01 03:35  
Автор: NeuronViking Статус: Незарегистрированный пользователь
<"чистая" ссылка>
слушай может посмотришь исходнрик а?! а то чёта у меня прога вылетает грит с esp какая то фигня.. хотя я вроде все сделал... там совсем немного кода...
[Win32] Перехват API ! - продолжение 21.10.01 03:49  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
если немного, то лучше напиши сюда
вообщето я не спец по асму :)
если я не смогу помочь - кто-нить ещё поможет
[win32] вот исходный код, он глючит :((( 22.10.01 00:23  
Автор: NeuronViking Статус: Незарегистрированный пользователь
<"чистая" ссылка>
typedef void (*tagAPIAddr)();
tagAPIAddr APIAddress;
BYTE pbOpcode[5]={0};

// функция которую мы хотим перехватить ...
void trap001(char* str){
MessageBox(NULL,str,"Trap",0);
}

int _cdecl main(int argc, char* argv[]){

char str1[]="Suxx";
DWORD dwOldFlags=0;
PBYTE pbAPI=(PBYTE)trap001;// берем адрес функции которую
// нам надо перехватить

// устанавливаем READWRITE на память...
SetMemoryRWAccess((LPVOID)pbAPI,4096,&dwOldFlags);
// сохраняем на потом...
APIAddress=(tagAPIAddr)pbAPI;
memcpy(pbOpcode,pbAPI,5);
// записываем вызов нашей заглушки ...
pbAPI[0] = 0xE9;
PDWORD pdwAPI;
pdwAPI = (DWORD *)&pbAPI[1];
pdwAPI[0] = (DWORD)Stub - (DWORD)pbAPI - 5;
// пытаемся вызвать trap001 но вызывается заглушка ...
trap001(str1);

return 0;
}

// функция заглушка ...
void Stub(void){
DWORD dwParamPtr;
DWORD dwReturnAddr;
__asm{
mov eax,[ebp+4]
mov dwReturnAddr,eax
mov eax,[ebp+8]
mov dwParamPtr,eax
push dwParamPtr
}
memcpy(APIAddress, pbOpcode, 5);
APIAddress();
__asm{
pop dwParamPtr
sub esp,8
}
// при выходе ывходит глюк с esp .. какой-то :((((
}
Работающий код (если оставишь мыло пришлю весь проект vc6.0) 22.10.01 03:22  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
// main.cpp

#ifndef STRICT
#define STRICT
#endif
#include <windows.h>

// çàùèòà äîñòóïà ê ïàìÿòè
DWORD g_StdProtect;
// óêàçàòåëü íà ôóíêèöþ, êîòîðóþ õîòèì ïåðåõâàòèòü
unsigned char* g_StdAPIFunc;
// ïåðâûå 5 áàéò êîäà ïðàâèëüíîé APIFunc()
unsigned char g_StdAPIFuncBytes[5];
// íàø êîä, êîòîðûé ìû ïðîïèñûâàåì â APIFunc()
unsigned char g_HookBytes[5];

// APIFunc() - êàêàÿ òî ñòàíäàðòíàÿ ôóíêöèÿ Win32;
// ìû õîòèì å¸ ïåðåõâàòèòü, ò.å. ñíà÷àëà ïîäñòàâèòü ñâîþ ôóíêöèþ (Hook),
// èç êîòîðîé ïîñëå îïðåäåë¸ííûõ äåéñòâèé âûçâàòü APIFunc (ïðè íåîáõîäèìîñòè)
// è âåðíóòü óïðàâëåíèå èñõîäíîé ïðîãðàììå òàê, ÷òîáû îíà íè÷åãî íå çàìåòèëà
unsigned WINAPI APIFunc(unsigned arg1, unsigned arg2, unsigned arg3, unsigned arg4)
{
::MessageBox(NULL, "Within APIFunc()", "apihook", MB_OK);
return ::MessageBox((HWND)arg1, (const char*)arg2, (const char*)arg3, arg4);
}

unsigned WINAPI Hook(unsigned arg)
{
// âûòàñêèâàåì èç ñòåêà âñ¸, ÷òî ìîæíî
unsigned* arg1 = &arg;
unsigned* arg2 = arg1+1;
unsigned* arg3 = arg2+1;
unsigned* arg4 = arg3+1;
unsigned retAddr = *(arg1-1);
unsigned espBeforeCall = unsigned(arg4+1);
unsigned ebpNow;
_asm mov ebpNow, ebp
unsigned ebpBeforeCall =(unsignedebpNow;

// äåëàåì ñâîè äåéñòâèÿ
unsigned result = 0;
if(::MessageBox(NULL, "Within Hook()\nCall the standard APIFunc() ?",
"apihook", MB_OKCANCEL)==IDOK)
{
// âîçâðàùàåì ñòàðûå 5 áàéò íà ìåñòî
// (Hook() îáÿçàòåëüíî íàõîäèòñÿ âíóòðè ïðîöåññà, ó êîòîðîãî
// ïåðåõâàòûâàåì ôóíêöèþ, òàê ÷òî ìîæíî íàïðÿìóþ ïèñàòü â ïàìÿòü áåç
// Read\WriteProcessMemory())
::CopyMemory(g_StdAPIFunc, g_StdAPIFuncBytes, 5);

// âûçûâàåì ïðàâèëüíóþ APIFunc()
result = APIFunc(*arg1, *arg2, *arg3, *arg4);

// ïðîïèñûâàåì îïÿòü ñâîè 5 áàéò
::CopyMemory(g_StdAPIFunc, g_HookBytes, 5);
};

// ïûòàåìñÿ ïðàâèëüíî âåðíóòü óïðàâëåíèå âûçûâàþùåé ïðîãðàììå :)
_asm
{
mov esp, espBeforeCall
mov eax, result
mov ecx, retAddr
mov ebp, ebpBeforeCall
jmp ecx
};

// ÷òîáû êîìïèëÿòîð íå ðóãàëñÿ :)
return 0;
}

static void CallAPIFunc(void)
{
unsigned result = APIFunc(NULL, (unsigned)"arg2 (text)",
(unsigned)"arg3 (title)", MB_OK | MB_ICONEXCLAMATION);

char buffer[] = "result = 00000000";
ultoa(result, buffer+9, 16);
::MessageBox(NULL, buffer, "apihook", MB_OK | MB_ICONINFORMATION);
}

static void Error(const char* comment, unsigned error)
{
unsigned length = ::lstrlen(comment);

char* text = new char[length+10];
if(!text) return;

::lstrcpy(text, comment);
text[length] = ' ';
ultoa(error, text+length+1, 16);

::MessageBox(NULL, text, "apihook", MB_OK | MB_ICONSTOP);
}

static void SetHook(HANDLE process)
{
// àäðåñ ïàìÿòè, ãäå íà÷èíàåòñÿ APIFunc
g_StdAPIFunc = (unsigned char*)APIFunc;

// çàïîìèíàåì ïåðâûå 5 áàéò APIFunc
DWORD read;
if(!::ReadProcessMemory(process, g_StdAPIFunc,
g_StdAPIFuncBytes, 5, &read))
{
Error("ReadProcessMemory() failed", ::GetLastError());
return;
};
if(read!=5)
{
::MessageBox(NULL, "Unable to read 5 bytes", "apihook",
MB_OK | MB_ICONSTOP);
return;
};

// ñîáèðàåì íàøè íîâûå 5 áàéò
g_HookBytes[0] = 0xe9;
// ïðè ïðåîáðàçîâàíèÿõ óêàçàòåëåé êîìïèëÿòîð ìîæåò ïîìåíÿòü èõ çíà÷åíèÿ
unsigned char* hookPtr = (unsigned char*)Hook;
(unsigned(g_HookBytes+1) = unsigned(hookPtr)-unsigned(g_StdAPIFunc)-5;

// ðàçðåøàåì çàïèñü ïî íóæíîìó íàì àäðåñó
if(!::VirtualProtectEx(process, g_StdAPIFunc, 5,
PAGE_EXECUTE_READWRITE, &g_StdProtect))
{
Error("VirtualProtectEx() failed", ::GetLastError());
return;
};

// ïîäñòàâëÿåì íàøó ëîâóøêó
DWORD written;
if(!::WriteProcessMemory(process, g_StdAPIFunc, g_HookBytes,
5, &written))
{
Error("WriteProcessMemory() failed", ::GetLastError());
return;
};
if(written!=5)
{
::MessageBox(NULL, "Unable to write 5 bytes", "apihook",
MB_OK | MB_ICONSTOP);
return;
};
}

static void RemoveHook(HANDLE process)
{
// óáèðàåì íàøó ëîâóøêó
DWORD written;
if(!::WriteProcessMemory(process, g_StdAPIFunc, g_StdAPIFuncBytes,
5, &written))
{
Error("WriteProcessMemory() failed", ::GetLastError());
return;
};
if(written!=5)
{
::MessageBox(NULL, "Unable to write 5 bytes", "apihook",
MB_OK | MB_ICONSTOP);
return;
};

// âîññòàíàâëèâàåì çàùèòó ïàìÿòè
DWORD oldProtect;
if(!::VirtualProtectEx(process, g_StdAPIFunc, 5,
g_StdProtect, &oldProtect))
{
Error("VirtualProtectEx() failed", ::GetLastError());
return;
};
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
// îáû÷íûé âûçîâ APIFunc() - âûçûâàåòñÿ ñòàíäàðòíàÿ ôóíêöèÿ
CallAPIFunc();

// òåïåðü ìû ïûòàåìñÿ ïîäìåíèòü ôóíêöèþ
SetHook(::GetCurrentProcess());

// âûçûâàåì APIFunc() íàäåÿñü, ÷òî âûçîâåòñÿ íàøà ëîâóøêà :)
CallAPIFunc();

// âîçâðàùàåì âñ¸ â ïðåæíåå ñîñòîÿíèå
RemoveHook(::GetCurrentProcess());

// âûçûâàåì APIFunc() - äîëæíà îïÿòü âûçâàòüñÿ ñòàíäàðòíàÿ ôóíêöèÿ
CallAPIFunc();

return 0;
}
упс :) русские комментарии кривые :) 22.10.01 03:23  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
вобщем мыло оставь
мыль сюда плиииииииииииииз! 22.10.01 04:23  
Автор: NeuronViking Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> вобщем мыло оставь

neuron_viking@yahoo.com

жду с нетерпением!!!
[win32] вот исходный код, он глючит :((( 22.10.01 01:59  
Автор: Heromantor Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Хмм плохая идея реализовывать Stub на C :(, лучше asm и подключить ее из obj. Вот сделал на сях но пример непригляден L(

int _cdecl main(int argc, char* argv[]){

char str1[]="Suxx";
DWORD dwOldFlags=0;
PBYTE pbAPI=(PBYTE)trap001;// берем адрес функции которую
// нам надо перехватить

goto JMP1;
//Пропускаем енто пока
Stub:
//Тут нам надо только лишь скопировать оригинальные байты и прыгнуть туда. Со стеком извращаться не надо....
MessageBox(NULL,"Now run original func","Trap",0);
memcpy(APIAddress, pbOpcode, 5);
_asm{
jmp APIAddress
}

JMP1:

APIAddress=(tagAPIAddr)pbAPI;
memcpy(pbOpcode,pbAPI,5);
// записываем вызов нашей заглушки ...

if(!VirtualProtect(pbAPI,4096,PAGE_READWRITE,&dwOldFlags))
{
MessageBox(NULL,"Error!","Error",MB_OK);
exit(-1);
}

_asm mov edi,pbAPI
_asm mov [BYTE PTR edi],0xE9
_asm lea eax,Stub
_asm sub eax,edi
_asm sub eax,5
_asm mov [DWORD PTR edi+1],eax

trap001(str1);

return 0;
}
[win32] вот исходный код, он глючит :((( 22.10.01 02:12  
Автор: NeuronViking Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Хмм плохая идея реализовывать Stub на C :(, лучше asm и
> подключить ее из obj. Вот сделал на сях но пример
> непригляден L(
>
> int _cdecl main(int argc, char* argv[]){
>
> char str1[]="Suxx";
> DWORD dwOldFlags=0;
> PBYTE pbAPI=(PBYTE)trap001;// берем адрес функции которую
> // нам надо перехватить
>
> goto JMP1;
> //Пропускаем енто пока
> Stub:
> //Тут нам надо только лишь скопировать оригинальные байты и
> прыгнуть туда. Со стеком извращаться не надо....
> MessageBox(NULL,"Now run original func","Trap",0);
> memcpy(APIAddress, pbOpcode, 5);
> _asm{
> jmp APIAddress
> }
>
> JMP1:
>
> APIAddress=(tagAPIAddr)pbAPI;
> memcpy(pbOpcode,pbAPI,5);
> // записываем вызов нашей заглушки ...
>
> if(!VirtualProtect(pbAPI,4096,PAGE_READWRITE,&dwOldFlags))
> {
> MessageBox(NULL,"Error!","Error",MB_OK);
> exit(-1);
> }
>
> _asm mov edi,pbAPI
> _asm mov [BYTE PTR edi],0xE9
> _asm lea eax,Stub
> _asm sub eax,edi
> _asm sub eax,5
> _asm mov [DWORD PTR edi+1],eax
>
> trap001(str1);
>
> return 0;
> }

хммм ... а куда деваться, именно на С нужно написать ... я конечно могбы использовать __declspec(naked) но мне нужно внутри Stub поработать с переменными ... так вот, в твоем примере тоже глюк со стеком, при выходе из Stub отладчик ругается кривой ESP, я переделал код функции Stub, теперь все ОК, но! при выходе из main отладчик серавно ругается на кривой ESP, но когда я компилю как релиз никаких глюков или это пока?! .. если релиз не выдает ошибок можно ли положить на эту проблему или всетаки дрючиться дальше?!

void Stub(void){
memcpy(APIAddress, pbOpcode, 5);
DWORD dwParamPtr;
DWORD dwReturnAddr;
DWORD dwESP;
__asm{
mov eax,[ebp+4]
mov dwReturnAddr,eax
mov eax,[ebp+8]
mov dwParamPtr,eax
push dwParamPtr
call APIAddress
pop dwParamPtr
}
}

int _cdecl main(int argc, char* argv[]){

char str1[]="Suxx";
DWORD dwOldFlags=0;
PBYTE pbAPI=(PBYTE)trap001;

SetMemoryRWAccess((LPVOID)pbAPI,4096,&dwOldFlags);

APIAddress=(tagAPIAddr)pbAPI;
memcpy(pbOpcode,pbAPI,5);

pbAPI[0] = 0xE9;
PDWORD pdwAPI;
pdwAPI = (DWORD *)&pbAPI[1];
pdwAPI[0] = (DWORD)Stub - (DWORD)pbAPI - 5;

trap001(str1);

return 0;
}
[win32] вот исходный код, он глючит :((( 22.10.01 02:55  
Автор: Heromantor Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Яб предложил прибавить к esp 4 после call и что-то слишком заумно получаеться... Я бы сделал так:
void Stub(char *str)
{
char buf[16384];

memcpy(APIAddress, pbOpcode, 5);
_asm push str
_asm call APIAddress
_asm add esp,4
}

Компилятор включает проверку esp только в Debug версии(cmp esp,ebp _chkesp). Так что в Release баг есть но не виден
[win32] вот исходный код, он глючит :((( 22.10.01 03:20  
Автор: NeuronViking Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Яб предложил прибавить к esp 4 после call и что-то слишком
> заумно получаеться... Я бы сделал так:
> void Stub(char *str)
> {
> char buf[16384];
>
> memcpy(APIAddress, pbOpcode, 5);
> _asm push str
> _asm call APIAddress
> _asm add esp,4
> }
>
> Компилятор включает проверку esp только в Debug версии(cmp
> esp,ebp _chkesp). Так что в Release баг есть но не виден

это то все понятно, все правильно конечно, но это верно ТОЛЬКО для одной конкретной функции, а если мне нужно произвольную функцию перехватить?!
[win32] вот исходный код, он глючит :((( 22.10.01 03:35  
Автор: Heromantor Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> это то все понятно, все правильно конечно, но это верно
> ТОЛЬКО для одной конкретной функции, а если мне нужно
> произвольную функцию перехватить?!

Надо знать параметры для этой ф-ции скажем для trap001 можно сделать так:
typedef void (*tagAPIAddr)(char *);

а в Stub вызывать не callом а просто
APIAddress(str);
тогда компилятор все сделает сам. Без прототипа никак :(

И все-же непонятно почему ESP поганится...
[Win32] вот так все работает... 22.10.01 04:21  
Автор: NeuronViking Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > это то все понятно, все правильно конечно, но это
> верно
> > ТОЛЬКО для одной конкретной функции, а если мне нужно
> > произвольную функцию перехватить?!
>
> Надо знать параметры для этой ф-ции скажем для trap001
> можно сделать так:
> typedef void (*tagAPIAddr)(char *);
>
> а в Stub вызывать не callом а просто
> APIAddress(str);
> тогда компилятор все сделает сам. Без прототипа никак :(
>
> И все-же непонятно почему ESP поганится...
это не то :(((( ... а ESP поганится из-за того что там навороченные переходы если в отладчике смотреть, но вот с такой корректировкой стека работает ...

void Stub(void){
memcpy(APIAddress, pbOpcode, 5);
DWORD dwParamPtr;
DWORD dwReturnAddr;
DWORD dwAfterCall;
__asm{
mov eax,[ebp+4]
mov dwAfterCall,eax
mov eax,[ebp+8]
mov dwReturnAddr,eax
mov eax,[ebp+8]
mov dwParamPtr,eax

push dwParamPtr
call APIAddress
}
}

int _cdecl main(int argc, char* argv[]){

PBYTE pbAPI=(PBYTE)trap001;
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;

DWORD dwESP;
__asm mov dwESP,esp

trap001("Suxx");

__asm mov esp,dwESP

return 0;
}

но все равно это отстой.. это не правильно :((( ... какой я ламер...@#$яяя!!!
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach