PDA

View Full Version : آموزش Hook کردن توابع API از مبتدی



crackgns
شنبه 16 شهریور 1387, 13:22 عصر
از دوستان و اساتید عزیز لطفآ اگه کسی Hook کردن توابع API رو بلده تو این تاپیک از سطح مبتدی آموزش بده.
از دوستانی که همکاری میکنن خیلی ممنونم

Developer Programmer
شنبه 16 شهریور 1387, 15:09 عصر
بپر برو از CD فروش محله، CD های MSDN 2008 رو بخر و بیار نصب کن. بعد توابع Hook رو با حوصله بخون

crackgns
یک شنبه 17 شهریور 1387, 09:33 صبح
اگه نمیخواین آموزش بدید حداقل یه منبع فارسی معرفی کنین؟!

Nima NT
یک شنبه 17 شهریور 1387, 12:26 عصر
اگه بخوای دنبال منابع فارسی بری هیچی یاد نمیگیری ، این دوستمون ( افشین خان ) درست راهنمائی کردن.

Developer Programmer
دوشنبه 18 شهریور 1387, 20:18 عصر
اگه نمیخواین آموزش بدید حداقل یه منبع فارسی معرفی کنین؟!
بیا اینم آموزش...
http://delphi.about.com/od/kbwinshell/a/delphi_hook.htm

crackgns
پنج شنبه 21 شهریور 1387, 10:07 صبح
آقای Afshin _Zavar،من این صفحه رو قبلآ هم مطالعه کردم اما Hook کردن یه تابع API به سادگی جند تا دستور برای Hook کردن کیبورد و یا به سادگی به کار بردن چند تا دستور Hook ویندوز نیست.به همین دلیله که من از اونایی که بلدن خواستم آموزش بدن!؟(مثلآ فرض کنین بخوایم تابع CopyFile رو Hook کنیم حالا باید چیکار کنیم؟)

Developer Programmer
پنج شنبه 21 شهریور 1387, 12:52 عصر
مثلآ فرض کنین بخوایم تابع CopyFile رو Hook کنیم حالا باید چیکار کنیم؟
حالا ديدي خوب جستجو نمي كني ؟ :لبخندساده:
http://www.madshi.net

crackgns
جمعه 22 شهریور 1387, 11:12 صبح
آقا این رو هم دیدم.کدوم قسمتش رو می گی.فقط لینکشو دادی یا خودت ازش استفاده کردی.من اکثر منابع انگلیسی رو دیدم اما مشکل اینجاست که من یه منبع فارسی(کتاب)می خوام.کسی می تونه یه کتاب معرفی کنه؟!!

mohammad272005
جمعه 22 شهریور 1387, 11:20 صبح
والا من فارسیشو ندارم. ولی این انگلیسیش (http://kbalertz.com/318804/Windows-Visual.aspx). خداییش روون و با مثال واضح نوشته.

Developer Programmer
جمعه 22 شهریور 1387, 16:10 عصر
آقا این رو هم دیدم.کدوم قسمتش رو می گی.فقط لینکشو دادی یا خودت ازش استفاده کردی
بابا بيخيال؛
مي گيم MSDN رو بخون ميگي نه... ميگيم اين لينك رو بخون ميگي نه اين ساده است... كامپوننت ميديم كه بي دردسر استفاده كني ميگي همينطوري الكي لينك دادي.

joker
جمعه 22 شهریور 1387, 18:11 عصر
نتیجه گیری اخلاقی : اقا بگو چه برنامه ای میخوای تا برات بنویسیم :)

crackgns
جمعه 22 شهریور 1387, 21:20 عصر
آقا ببخشید؟!!بابا ما که نخواستیم بگیم همه چی رو بلدیم!!!میشه یه توضیحی در مورد این کامپوننتی بدی که توی Medshi .چیه و اصلآ چطوری باید ازش استفاده کرد.البته من دلفی بلد نیستم بیشتر C++ و VB بلدم.اما میدونید می خوام چی بنویسم برنامه ای که بتونه کل فراخوانی هایی که توسط تمام برنامه ها و حتی ویروس ها از چند تا API صورت می گیره رو Hook کنم.البته همزمان با فراخوانی شون می خوام بفهمم که اونا به چه پارامتر هایی اون تابع خاص رو فراخوانی کرده و جلوی بعضی از این فراخوانی ها رو بگیرم.بازم از همتون واقعآ ممنون میشم اگه بهم کمک کنین آخه واقعآ بهش نیاز دارم(بازم ببخشید)

crackgns
یک شنبه 24 شهریور 1387, 19:22 عصر
آقا فایده ای نداره خودم یه کم آموزش میدم!!!؟
اول یه مقدمه راجع به Hook کردن توابع API:
کردن توابع API یه ابزاری که شما میتونید با اون از برنامه ها جاسوسی کنید و جاسوسی کردن از برنامه ها هم این کاربرد ها رو داره:
1-نشان دادن اعمالی که دور از چشم کاربر اتفاق می افته و نوایش فراخوانی های توابع API
2-Debug کردن ومهندسی معکوس برنامه ها:Hook کردن توابع API یکی از قدرتمندترین راهایی یه که با اون می شه برنامه رو دیبگ کرد و فهمید که اون برنامه چی کار می کنه.
3-نگاه دقیقی به درون سیستم عامل
4-تغییر دادن اعمال یه برنامه کاربردی و اضافه کردن بعضی چیزها به اون
خووووب.حالا یه کم با فواید هوک کردن توابع API آشنا شدیم.اما چه طور باید این کار رو انجام داد.اولین مرحله اینه که با یه DLL رو توی process مربوطه Inject کرد.
من نمیدونم که این کار دقیقآ چه فایده ای داره و چه طور می تونه اعمال برنامه رو به انتقال بده به همین خاطر از دوستانی که واقعآ اینو فهمیدن می خوام به ما هم بگن.
Inject کردن راه های زیادی داره یکی از اونا Createrimotethread که بازم از دوستانی که نحوه ی Inject کردن با این تابع API رو واقعآ بلدن به ما هم توضیح بدن.Hook کردن یه مرحله ی دگه هم داره اما چون خودم اونو خوب نفهمیدم واگذار می کنم به دوستان دیگه؟
امیدوارم جواب های خوبی ازتون ببینم.ممنون.

Developer Programmer
یک شنبه 24 شهریور 1387, 20:46 عصر
رنامه ای که بتونه کل فراخوانی هایی که توسط تمام برنامه ها و حتی ویروس ها از چند تا API صورت می گیره رو Hook کنم
اگه فقط تا اين حده... اينترنت پر شده از برنامه هايي كه بتونن Hookهاي توابع رو نشونت بدن تا حتي بتوني بعضي RootKit ها رو هم شناسايي كني؛
يه Hooker قوي رو برديا گذاشته بود يه چند تا ابزار مفيد رو هم تو سايت SysInternals پيدا ميكني

Securebit
دوشنبه 25 شهریور 1387, 18:13 عصر
هوکری بسیار قدرتمند با کد ++C


#include <windows.h>
#include <stdio.h>
#pragma comment (linker, "/Filealign:0x200")
#pragma comment(linker, "/SECTION:.text,REW" )
#pragma comment(linker, "/MERGE:.data=.text")
#pragma comment(linker, "/MERGE:.rdata=.text")
#pragma comment(linker, "/subsystem:windows /entry:main")
boolean IsMe=false;
int GetOpCodeSize(PVOID Start);
boolean SetOnBefore(PCHAR DllName,PCHAR ApiName,PVOID HookProc);
boolean SetOnAfter(PCHAR DllName,PCHAR ApiName,PVOID HookProc);
void My_WriteProcessMemory(DWORD Eax,DWORD RetAddr,HANDLE hProcess, LPVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesWritten);
static unsigned long MaskTable[518]={
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000000, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000000, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000000, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000000, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000008, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000008, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000008, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000008, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00004000, 0x00004000,
0x00000008, 0x00000008, 0x00001008, 0x00000018,
0x00002000, 0x00006000, 0x00000100, 0x00004100,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00004100, 0x00006000, 0x00004100, 0x00004100,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00002002, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000020, 0x00000020, 0x00000020, 0x00000020,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000100, 0x00002000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00002000, 0x00002000, 0x00002000, 0x00002000,
0x00002000, 0x00002000, 0x00002000, 0x00002000,
0x00004100, 0x00004100, 0x00000200, 0x00000000,
0x00004000, 0x00004000, 0x00004100, 0x00006000,
0x00000300, 0x00000000, 0x00000200, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00000100, 0x00000100, 0x00000000, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00002000, 0x00002000, 0x00002002, 0x00000100,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000008, 0x00000000, 0x00000008, 0x00000008,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0x00002000, 0x00002000, 0x00002000, 0x00002000,
0x00002000, 0x00002000, 0x00002000, 0x00002000,
0x00002000, 0x00002000, 0x00002000, 0x00002000,
0x00002000, 0x00002000, 0x00002000, 0x00002000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00000000, 0x00000000, 0x00000000, 0x00004000,
0x00004100, 0x00004000, 0xFFFFFFFF, 0xFFFFFFFF,
0x00000000, 0x00000000, 0x00000000, 0x00004000,
0x00004100, 0x00004000, 0xFFFFFFFF, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0xFFFFFFFF, 0xFFFFFFFF, 0x00004100, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF
};
static BYTE JMPGate[5] = {
0xE9, 0x00, 0x00, 0x00, 0x00 // JMP XXXXXXXX
};
int GetOpCodeSize(PVOID Start)
{
DWORD* Tlb=(DWORD*)MaskTable;
PBYTE pOPCode;
DWORD t, c;
BYTE dh, dl, al;
int OpCodeSize =-1;
t = 0;
pOPCode = (PBYTE) Start;
c = 0;
do {
t &= 0x0F7;
c = *(BYTE *) pOPCode++;
t |= Tlb[c] ;
} while( ((t & 0x000000FF) & 8) != 0);
if ((c == 0x0F6) || (c == 0x0F7))
{
t |= 0x00004000;
if ( (0x38 & *(BYTE *) pOPCode++) == 0)
t |= 0x00008000;
}
else if (c == 0x0CD)
{
t |= 0x00000100;
if ( (*(BYTE *) pOPCode++) == 0x20)
t |= 0x00000400;
}
else if (c == 0x0F)
{
al = *(BYTE *) pOPCode++;
t |= Tlb[al + 0x100];
if (t == 0xFFFFFFFF)
return OpCodeSize;
}
if ((((t & 0x0000FF00) >> 8) & 0x80) != 0)
{
dh = (t & 0x0000FF00) >> 8;
dh ^= 0x20;
if ((c & 1) == 0)
dh ^= 0x21;
t &= 0xFFFF00FF;
t |= (dh << 8);
}
if ((((t & 0x0000FF00) >> 8) & 0x40) != 0 )
{
al = *(BYTE *) pOPCode++;
c = (DWORD)al;
c |= (al << 8);
c &= 0xC007;
if ( (c & 0x0000FF00) != 0xC000 )
{
if ( ((t & 0x000000FF) & 0x10) == 0)
{
if ((c & 0x000000FF) == 4)
{
al = *(BYTE *) pOPCode++;
al &= 7;
c &= 0x0000FF00;
c |= al;
}

if ((c & 0x0000FF00) != 0x4000)
{
if ((c & 0x0000FF00) == 0x8000) t |= 4;
else if (c==5) t |= 4;
}
else
t |= 1;
}
else
{
if (c != 6)
{
if((c & 0x0000FF00) == 0x4000)
t |= 1;
else if ((c & 0x0000FF00) == 0x8000)
t |= 2;
}
else
t |= 2;
}
}
}
if ((((t & 0x000000FF)) & 0x20) != 0)
{
dl = t & 0x000000FF;
dl ^= 2;
t &= 0xFFFFFF00;
t |= dl;
if ((dl & 0x10) == 0)
{
dl ^= 6;
t &= 0xFFFFFF00;
t |= dl;
}
}
if ((((t & 0x0000FF00) >> 8) & 0x20) != 0)
{
dh = (t & 0x0000FF00) >> 8;
dh ^= 2;
t &= 0xFFFF00FF;
t |= (dh << 8);
if ((dh & 0x10) == 0)
{
if (dh & 0x40)
dh ^= 1;
t &= 0xFFFFFF00;
t |= dh;
}
}
OpCodeSize = (DWORD) pOPCode - (DWORD) Start;
t &= 0x707;
OpCodeSize += t & 0x000000FF;
OpCodeSize += (t & 0x0000FF00) >> 8;
if (((*(char*)Start) & 0x000000FF) == 0x66)
if ( OpCodeSize >= 6)
OpCodeSize -= 2;
return OpCodeSize;
}

__declspec(naked) void HookBeforeStub()
{
Stub_Begin:
__asm
{
jmp Code_Begin
mov eax, offset Stub_Begin
mov eax, offset Stub_Data
mov eax, offset Stub_End
mov eax, offset SaveEntry
Code_Begin:
call next1
next1:
pop ecx
sub ecx, offset next1
lea ecx, [ecx + Stub_Data]
mov eax, [ecx + 4]
mov [ecx + eax * 4 + 0x8],esp
inc [ecx + 4]
call [ecx]
call next2
next2:
pop ecx
sub ecx, offset next2
lea ecx, [ecx + Stub_Data]
dec [ecx +4]
mov eax, [ecx + 4]
mov esp, [ecx + eax * 4 + 0x8]
SaveEntry:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop

_asm _emit 0xE9
int 3
int 3
int 3
int 3
Stub_Data:
HookProc:
int 3
int 3
int 3
int 3
pEsp:
_emit 0
_emit 0
_emit 0
_emit 0
SaveEsp:
int 3
int 3
int 3
int 3
Stub_end:
}
}
__declspec(naked) void HookAfterStub()
{
Stub_Begin:
__asm
{
jmp Code_Begin
mov eax, offset Stub_Begin
mov eax, offset Stub_Data
mov eax, offset Stub_End
mov eax, offset SaveEntry
mov eax, offset After_Code
Code_Begin:
call next1
next1:
pop ecx
sub ecx,offset next1
lea edx,[ecx + Stub_Data]
mov eax, [edx + 8]
mov [edx + eax * 8 + 0xC],esp
push [esp]
pop dword ptr [edx + eax * 8 + 0x10]
inc [edx + 8]
lea edx,[ecx + After_Code]
mov [esp],edx
SaveEntry:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop

_asm _emit 0xE9
int 3
int 3
int 3
int 3
After_Code:
sub esp,100
call next2
next2:
pop ecx
add esp,100
sub ecx,offset next2
lea edx,[ecx + Stub_Data]
mov [edx + 4] ,eax
dec [edx + 8]
mov eax, [edx + 8]
mov ecx, [edx + eax * 8 + 0xC]
mov [edx + eax * 8 + 0xC],esp
mov esp,ecx
mov ecx, [edx + eax * 8 + 0x10]
inc [edx + 8]
mov [esp],ecx
push [edx + 4]
call [edx]
call next3
next3:
pop ecx
sub ecx,offset next3
lea edx, [ecx + Stub_Data]
mov [edx + 4],eax
dec [edx + 8]
mov eax, [edx + 8]
mov esp, [edx + eax * 8 + 0xC]
push [edx + eax * 8 + 0x10]
mov eax,[edx + 4]
retn

Stub_Data:
HookProc:
int 3
int 3
int 3
int 3
SaveRetthing:
int 3
int 3
int 3
int 3
pEsp:
_emit 0
_emit 0
_emit 0
_emit 0
SaveEsp:
int 3
int 3
int 3
int 3 //SaveEsp
SaveRet:
int 3
int 3
int 3
int 3 //SaveRet

Stub_end:

}
}
boolean SetOnAfter(PCHAR DllName,PCHAR ApiName,PVOID HookProc)
{
PVOID ApiEntry;
HMODULE DllHandle;
int ReplaceCodeSize;
BYTE OpCode[16];
LPVOID StubPtr;
DWORD Addr;
DWORD RetSize=0;
DWORD SizeOfStub =0;
DWORD DeltaData = 0;
DWORD SaveEntry = 0;
DWORD AfterCode = 0;

DllHandle = GetModuleHandle(DllName);
if (DllHandle ==0)
{
DllHandle = LoadLibrary(DllName);
if (DllHandle ==0) return false;
}
ApiEntry = GetProcAddress(DllHandle,ApiName);
if (ApiEntry == NULL) return false;
ReplaceCodeSize = GetOpCodeSize(ApiEntry);
while (ReplaceCodeSize < 5)
ReplaceCodeSize += GetOpCodeSize((PVOID)((DWORD)ApiEntry + (DWORD)ReplaceCodeSize));
if (ReplaceCodeSize > 16) return false;
if (VirtualProtect(ApiEntry,ReplaceCodeSize,PAGE_READ WRITE,NULL))
return false;
CopyMemory(OpCode, ApiEntry, ReplaceCodeSize);

DeltaData = *(DWORD *)((DWORD)HookAfterStub + 0x8) - *(DWORD *) ((DWORD)HookAfterStub + 0x3);
SizeOfStub = *(DWORD *)((DWORD)HookAfterStub + 0x0D) - *(DWORD *) ((DWORD)HookAfterStub + 0x3);
SaveEntry = *(DWORD *)((DWORD)HookAfterStub + 0x12) - *(DWORD *) ((DWORD)HookAfterStub + 0x3);
AfterCode = *(DWORD *)((DWORD)HookAfterStub + 0x17) - *(DWORD *) ((DWORD)HookAfterStub + 0x3);

StubPtr = VirtualAlloc(NULL, SizeOfStub + 0x100*8, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (StubPtr == NULL) return false;
CopyMemory(StubPtr, HookAfterStub, SizeOfStub);

Addr = (DWORD)HookProc;
*(DWORD *) ((DWORD)StubPtr + DeltaData) = Addr;
Addr = (DWORD)ApiEntry + ReplaceCodeSize - (DWORD)StubPtr - AfterCode;
*(DWORD *) ((DWORD)StubPtr + AfterCode - 4) = Addr;
CopyMemory((LPVOID)((DWORD)StubPtr + SaveEntry), OpCode, ReplaceCodeSize);
Addr = (DWORD)StubPtr - (DWORD)ApiEntry - 5;
*(DWORD*)(JMPGate + 1) = Addr;
WriteProcessMemory(GetCurrentProcess(), ApiEntry, JMPGate, sizeof(JMPGate), (DWORD*)RetSize);
return true;
}

boolean SetOnBefore(PCHAR DllName,PCHAR ApiName,PVOID HookProc)
{
PVOID ApiEntry;
HMODULE DllHandle;
int ReplaceCodeSize;
BYTE OpCode[16];
LPVOID StubPtr;
DWORD Addr;
DWORD RetSize =0;
DWORD SizeOfStub =0;
DWORD DeltaData = 0;
DWORD SaveEntry = 0;
DllHandle = GetModuleHandle(DllName);
if (DllHandle ==0)
{
DllHandle = LoadLibrary(DllName);
if (DllHandle ==0) return false;
}
ApiEntry = GetProcAddress(DllHandle,ApiName);
if (ApiEntry == NULL) return false;
ReplaceCodeSize = GetOpCodeSize(ApiEntry);
while (ReplaceCodeSize < 5)
ReplaceCodeSize += GetOpCodeSize((PVOID)((DWORD)ApiEntry + (DWORD)ReplaceCodeSize));
if (ReplaceCodeSize > 16) return false;
if (VirtualProtect(ApiEntry,ReplaceCodeSize,PAGE_READ WRITE,NULL))
return false;
CopyMemory(OpCode, ApiEntry, ReplaceCodeSize);
DeltaData = *(DWORD *)((DWORD)HookBeforeStub + 0x8) - *(DWORD *) ((DWORD)HookBeforeStub + 0x3);
SizeOfStub = *(DWORD *)((DWORD)HookBeforeStub + 0x0D) - *(DWORD *) ((DWORD)HookBeforeStub + 0x3);
SaveEntry = *(DWORD *)((DWORD)HookBeforeStub + 0x12) - *(DWORD *) ((DWORD)HookBeforeStub + 0x3);

StubPtr = VirtualAlloc(NULL, SizeOfStub + 0x100*4, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (StubPtr == NULL) return false;
CopyMemory(StubPtr, HookBeforeStub, SizeOfStub);
Addr = (DWORD)HookProc;
*(DWORD *) ((DWORD)StubPtr + DeltaData) = Addr;
Addr = (DWORD)ApiEntry + ReplaceCodeSize - (DWORD)StubPtr - DeltaData;
*(DWORD *) ((DWORD)StubPtr + DeltaData - 4) = Addr;

CopyMemory((LPVOID)((DWORD)StubPtr + SaveEntry), OpCode, ReplaceCodeSize);
Addr = (DWORD)StubPtr - (DWORD)ApiEntry - 5;
*(DWORD*)(JMPGate + 1) = Addr;
WriteProcessMemory(GetCurrentProcess(), ApiEntry, JMPGate, sizeof(JMPGate), (DWORD*)RetSize);
return true;
}
void My_WriteProcessMemory(DWORD Eax,DWORD RetAddr,HANDLE hProcess, LPVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesWritten)
{
DWORD RetSize =0;
char Text [255] = {0};
if (!IsMe)
{
IsMe =true;
sprintf(Text,"EAX = %2X ,RetAddr = %2X",Eax,RetAddr);
MessageBox (NULL,Text,"RetAddr",NULL);
WriteProcessMemory(GetCurrentProcess(), (LPVOID)0x40108A, JMPGate, sizeof(JMPGate), (DWORD*)RetSize);
IsMe = false;
}
}

int main()
{
DWORD RetSize =0;
SetOnAfter("Kernel32.dll","WriteProcessMemory",My_WriteProcessMemory);
WriteProcessMemory(GetCurrentProcess(), (LPVOID)0x40108f, JMPGate, sizeof(JMPGate), (DWORD*)RetSize);
MessageBoxA(NULL,"Safe Here!!!","Very Good!!",NULL);
return 0;
}

crackgns
سه شنبه 26 شهریور 1387, 22:44 عصر
آقا خیلی ممنون،ولی این با کدوم کامپایلر کامپایل میشه من با کامپایلر Visual C++ 6 کامپایل کردم 3 تا Error داد اینم ٍ Error هاش:

error C2146: syntax error : missing ';' before identifier 'IsMe'
: error C2501: 'boolean' : missing storage-class or type specifiers
: fatal error C1004: unexpected end of file found

Securebit
چهارشنبه 27 شهریور 1387, 01:24 صبح
از این کد در Visual C++ 9 استفاده کردم.

Masoudxb
چهارشنبه 27 شهریور 1387, 10:14 صبح
آقا خیلی ممنون،ولی این با کدوم کامپایلر کامپایل میشه من با کامپایلر Visual C++ 6 کامپایل کردم 3 تا Error داد اینم ٍ Error هاش:

error C2146: syntax error : missing ';' before identifier 'IsMe'
: error C2501: 'boolean' : missing storage-class or type specifiers
: fatal error C1004: unexpected end of file found


boolean رو به BOOL تغییر بدید.

crackgns
چهارشنبه 27 شهریور 1387, 11:37 صبح
boolean رو به BOOL تغییر بدید.
فایده ای نداره بازم 3 تا Error میده؟!!!
در ضمن من توی Visual C++8 هم کامپایل کردم اما Error داره،چون اصلآ Visual C++ 9 یا Visual C++8 اصلآ هیدر windows رو نداره چون تمام توابع API که توی windows.h تعریف شدن در .net توی Class library ها و name space ها به صورت class های جداگانه تعریف شدن.

crackgns
جمعه 29 شهریور 1387, 18:58 عصر
هوکری بسیار قدرتمند با کد ++C


#include <windows.h>
#include <stdio.h>
#pragma comment (linker, "/Filealign:0x200")
#pragma comment(linker, "/SECTION:.text,REW" )
#pragma comment(linker, "/MERGE:.data=.text")
#pragma comment(linker, "/MERGE:.rdata=.text")
#pragma comment(linker, "/subsystem:windows /entry:main")
boolean IsMe=false;
int GetOpCodeSize(PVOID Start);
boolean SetOnBefore(PCHAR DllName,PCHAR ApiName,PVOID HookProc);
boolean SetOnAfter(PCHAR DllName,PCHAR ApiName,PVOID HookProc);
void My_WriteProcessMemory(DWORD Eax,DWORD RetAddr,HANDLE hProcess, LPVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesWritten);
static unsigned long MaskTable[518]={
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000000, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000000, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000000, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000000, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000008, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000008, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000008, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00008000, 0x00008000, 0x00000008, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00004000, 0x00004000,
0x00000008, 0x00000008, 0x00001008, 0x00000018,
0x00002000, 0x00006000, 0x00000100, 0x00004100,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00004100, 0x00006000, 0x00004100, 0x00004100,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00002002, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000020, 0x00000020, 0x00000020, 0x00000020,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000100, 0x00002000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00002000, 0x00002000, 0x00002000, 0x00002000,
0x00002000, 0x00002000, 0x00002000, 0x00002000,
0x00004100, 0x00004100, 0x00000200, 0x00000000,
0x00004000, 0x00004000, 0x00004100, 0x00006000,
0x00000300, 0x00000000, 0x00000200, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00000100, 0x00000100, 0x00000000, 0x00000000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00000100, 0x00000100, 0x00000100, 0x00000100,
0x00002000, 0x00002000, 0x00002002, 0x00000100,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000008, 0x00000000, 0x00000008, 0x00000008,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0x00002000, 0x00002000, 0x00002000, 0x00002000,
0x00002000, 0x00002000, 0x00002000, 0x00002000,
0x00002000, 0x00002000, 0x00002000, 0x00002000,
0x00002000, 0x00002000, 0x00002000, 0x00002000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00000000, 0x00000000, 0x00000000, 0x00004000,
0x00004100, 0x00004000, 0xFFFFFFFF, 0xFFFFFFFF,
0x00000000, 0x00000000, 0x00000000, 0x00004000,
0x00004100, 0x00004000, 0xFFFFFFFF, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0xFFFFFFFF, 0xFFFFFFFF, 0x00004100, 0x00004000,
0x00004000, 0x00004000, 0x00004000, 0x00004000,
0x00004000, 0x00004000, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF
};
static BYTE JMPGate[5] = {
0xE9, 0x00, 0x00, 0x00, 0x00 // JMP XXXXXXXX
};
int GetOpCodeSize(PVOID Start)
{
DWORD* Tlb=(DWORD*)MaskTable;
PBYTE pOPCode;
DWORD t, c;
BYTE dh, dl, al;
int OpCodeSize =-1;
t = 0;
pOPCode = (PBYTE) Start;
c = 0;
do {
t &= 0x0F7;
c = *(BYTE *) pOPCode++;
t |= Tlb[c] ;
} while( ((t & 0x000000FF) & 8) != 0);
if ((c == 0x0F6) || (c == 0x0F7))
{
t |= 0x00004000;
if ( (0x38 & *(BYTE *) pOPCode++) == 0)
t |= 0x00008000;
}
else if (c == 0x0CD)
{
t |= 0x00000100;
if ( (*(BYTE *) pOPCode++) == 0x20)
t |= 0x00000400;
}
else if (c == 0x0F)
{
al = *(BYTE *) pOPCode++;
t |= Tlb[al + 0x100];
if (t == 0xFFFFFFFF)
return OpCodeSize;
}
if ((((t & 0x0000FF00) >> 8) & 0x80) != 0)
{
dh = (t & 0x0000FF00) >> 8;
dh ^= 0x20;
if ((c & 1) == 0)
dh ^= 0x21;
t &= 0xFFFF00FF;
t |= (dh << 8);
}
if ((((t & 0x0000FF00) >> 8) & 0x40) != 0 )
{
al = *(BYTE *) pOPCode++;
c = (DWORD)al;
c |= (al << 8);
c &= 0xC007;
if ( (c & 0x0000FF00) != 0xC000 )
{
if ( ((t & 0x000000FF) & 0x10) == 0)
{
if ((c & 0x000000FF) == 4)
{
al = *(BYTE *) pOPCode++;
al &= 7;
c &= 0x0000FF00;
c |= al;
}

if ((c & 0x0000FF00) != 0x4000)
{
if ((c & 0x0000FF00) == 0x8000) t |= 4;
else if (c==5) t |= 4;
}
else
t |= 1;
}
else
{
if (c != 6)
{
if((c & 0x0000FF00) == 0x4000)
t |= 1;
else if ((c & 0x0000FF00) == 0x8000)
t |= 2;
}
else
t |= 2;
}
}
}
if ((((t & 0x000000FF)) & 0x20) != 0)
{
dl = t & 0x000000FF;
dl ^= 2;
t &= 0xFFFFFF00;
t |= dl;
if ((dl & 0x10) == 0)
{
dl ^= 6;
t &= 0xFFFFFF00;
t |= dl;
}
}
if ((((t & 0x0000FF00) >> 8) & 0x20) != 0)
{
dh = (t & 0x0000FF00) >> 8;
dh ^= 2;
t &= 0xFFFF00FF;
t |= (dh << 8);
if ((dh & 0x10) == 0)
{
if (dh & 0x40)
dh ^= 1;
t &= 0xFFFFFF00;
t |= dh;
}
}
OpCodeSize = (DWORD) pOPCode - (DWORD) Start;
t &= 0x707;
OpCodeSize += t & 0x000000FF;
OpCodeSize += (t & 0x0000FF00) >> 8;
if (((*(char*)Start) & 0x000000FF) == 0x66)
if ( OpCodeSize >= 6)
OpCodeSize -= 2;
return OpCodeSize;
}

__declspec(naked) void HookBeforeStub()
{
Stub_Begin:
__asm
{
jmp Code_Begin
mov eax, offset Stub_Begin
mov eax, offset Stub_Data
mov eax, offset Stub_End
mov eax, offset SaveEntry
Code_Begin:
call next1
next1:
pop ecx
sub ecx, offset next1
lea ecx, [ecx + Stub_Data]
mov eax, [ecx + 4]
mov [ecx + eax * 4 + 0x8],esp
inc [ecx + 4]
call [ecx]
call next2
next2:
pop ecx
sub ecx, offset next2
lea ecx, [ecx + Stub_Data]
dec [ecx +4]
mov eax, [ecx + 4]
mov esp, [ecx + eax * 4 + 0x8]
SaveEntry:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop

_asm _emit 0xE9
int 3
int 3
int 3
int 3
Stub_Data:
HookProc:
int 3
int 3
int 3
int 3
pEsp:
_emit 0
_emit 0
_emit 0
_emit 0
SaveEsp:
int 3
int 3
int 3
int 3
Stub_end:
}
}
__declspec(naked) void HookAfterStub()
{
Stub_Begin:
__asm
{
jmp Code_Begin
mov eax, offset Stub_Begin
mov eax, offset Stub_Data
mov eax, offset Stub_End
mov eax, offset SaveEntry
mov eax, offset After_Code
Code_Begin:
call next1
next1:
pop ecx
sub ecx,offset next1
lea edx,[ecx + Stub_Data]
mov eax, [edx + 8]
mov [edx + eax * 8 + 0xC],esp
push [esp]
pop dword ptr [edx + eax * 8 + 0x10]
inc [edx + 8]
lea edx,[ecx + After_Code]
mov [esp],edx
SaveEntry:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop

_asm _emit 0xE9
int 3
int 3
int 3
int 3
After_Code:
sub esp,100
call next2
next2:
pop ecx
add esp,100
sub ecx,offset next2
lea edx,[ecx + Stub_Data]
mov [edx + 4] ,eax
dec [edx + 8]
mov eax, [edx + 8]
mov ecx, [edx + eax * 8 + 0xC]
mov [edx + eax * 8 + 0xC],esp
mov esp,ecx
mov ecx, [edx + eax * 8 + 0x10]
inc [edx + 8]
mov [esp],ecx
push [edx + 4]
call [edx]
call next3
next3:
pop ecx
sub ecx,offset next3
lea edx, [ecx + Stub_Data]
mov [edx + 4],eax
dec [edx + 8]
mov eax, [edx + 8]
mov esp, [edx + eax * 8 + 0xC]
push [edx + eax * 8 + 0x10]
mov eax,[edx + 4]
retn

Stub_Data:
HookProc:
int 3
int 3
int 3
int 3
SaveRetthing:
int 3
int 3
int 3
int 3
pEsp:
_emit 0
_emit 0
_emit 0
_emit 0
SaveEsp:
int 3
int 3
int 3
int 3 //SaveEsp
SaveRet:
int 3
int 3
int 3
int 3 //SaveRet

Stub_end:

}
}
boolean SetOnAfter(PCHAR DllName,PCHAR ApiName,PVOID HookProc)
{
PVOID ApiEntry;
HMODULE DllHandle;
int ReplaceCodeSize;
BYTE OpCode[16];
LPVOID StubPtr;
DWORD Addr;
DWORD RetSize=0;
DWORD SizeOfStub =0;
DWORD DeltaData = 0;
DWORD SaveEntry = 0;
DWORD AfterCode = 0;

DllHandle = GetModuleHandle(DllName);
if (DllHandle ==0)
{
DllHandle = LoadLibrary(DllName);
if (DllHandle ==0) return false;
}
ApiEntry = GetProcAddress(DllHandle,ApiName);
if (ApiEntry == NULL) return false;
ReplaceCodeSize = GetOpCodeSize(ApiEntry);
while (ReplaceCodeSize < 5)
ReplaceCodeSize += GetOpCodeSize((PVOID)((DWORD)ApiEntry + (DWORD)ReplaceCodeSize));
if (ReplaceCodeSize > 16) return false;
if (VirtualProtect(ApiEntry,ReplaceCodeSize,PAGE_READ WRITE,NULL))
return false;
CopyMemory(OpCode, ApiEntry, ReplaceCodeSize);

DeltaData = *(DWORD *)((DWORD)HookAfterStub + 0x8) - *(DWORD *) ((DWORD)HookAfterStub + 0x3);
SizeOfStub = *(DWORD *)((DWORD)HookAfterStub + 0x0D) - *(DWORD *) ((DWORD)HookAfterStub + 0x3);
SaveEntry = *(DWORD *)((DWORD)HookAfterStub + 0x12) - *(DWORD *) ((DWORD)HookAfterStub + 0x3);
AfterCode = *(DWORD *)((DWORD)HookAfterStub + 0x17) - *(DWORD *) ((DWORD)HookAfterStub + 0x3);

StubPtr = VirtualAlloc(NULL, SizeOfStub + 0x100*8, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (StubPtr == NULL) return false;
CopyMemory(StubPtr, HookAfterStub, SizeOfStub);

Addr = (DWORD)HookProc;
*(DWORD *) ((DWORD)StubPtr + DeltaData) = Addr;
Addr = (DWORD)ApiEntry + ReplaceCodeSize - (DWORD)StubPtr - AfterCode;
*(DWORD *) ((DWORD)StubPtr + AfterCode - 4) = Addr;
CopyMemory((LPVOID)((DWORD)StubPtr + SaveEntry), OpCode, ReplaceCodeSize);
Addr = (DWORD)StubPtr - (DWORD)ApiEntry - 5;
*(DWORD*)(JMPGate + 1) = Addr;
WriteProcessMemory(GetCurrentProcess(), ApiEntry, JMPGate, sizeof(JMPGate), (DWORD*)RetSize);
return true;
}

boolean SetOnBefore(PCHAR DllName,PCHAR ApiName,PVOID HookProc)
{
PVOID ApiEntry;
HMODULE DllHandle;
int ReplaceCodeSize;
BYTE OpCode[16];
LPVOID StubPtr;
DWORD Addr;
DWORD RetSize =0;
DWORD SizeOfStub =0;
DWORD DeltaData = 0;
DWORD SaveEntry = 0;
DllHandle = GetModuleHandle(DllName);
if (DllHandle ==0)
{
DllHandle = LoadLibrary(DllName);
if (DllHandle ==0) return false;
}
ApiEntry = GetProcAddress(DllHandle,ApiName);
if (ApiEntry == NULL) return false;
ReplaceCodeSize = GetOpCodeSize(ApiEntry);
while (ReplaceCodeSize < 5)
ReplaceCodeSize += GetOpCodeSize((PVOID)((DWORD)ApiEntry + (DWORD)ReplaceCodeSize));
if (ReplaceCodeSize > 16) return false;
if (VirtualProtect(ApiEntry,ReplaceCodeSize,PAGE_READ WRITE,NULL))
return false;
CopyMemory(OpCode, ApiEntry, ReplaceCodeSize);
DeltaData = *(DWORD *)((DWORD)HookBeforeStub + 0x8) - *(DWORD *) ((DWORD)HookBeforeStub + 0x3);
SizeOfStub = *(DWORD *)((DWORD)HookBeforeStub + 0x0D) - *(DWORD *) ((DWORD)HookBeforeStub + 0x3);
SaveEntry = *(DWORD *)((DWORD)HookBeforeStub + 0x12) - *(DWORD *) ((DWORD)HookBeforeStub + 0x3);

StubPtr = VirtualAlloc(NULL, SizeOfStub + 0x100*4, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (StubPtr == NULL) return false;
CopyMemory(StubPtr, HookBeforeStub, SizeOfStub);
Addr = (DWORD)HookProc;
*(DWORD *) ((DWORD)StubPtr + DeltaData) = Addr;
Addr = (DWORD)ApiEntry + ReplaceCodeSize - (DWORD)StubPtr - DeltaData;
*(DWORD *) ((DWORD)StubPtr + DeltaData - 4) = Addr;

CopyMemory((LPVOID)((DWORD)StubPtr + SaveEntry), OpCode, ReplaceCodeSize);
Addr = (DWORD)StubPtr - (DWORD)ApiEntry - 5;
*(DWORD*)(JMPGate + 1) = Addr;
WriteProcessMemory(GetCurrentProcess(), ApiEntry, JMPGate, sizeof(JMPGate), (DWORD*)RetSize);
return true;
}
void My_WriteProcessMemory(DWORD Eax,DWORD RetAddr,HANDLE hProcess, LPVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesWritten)
{
DWORD RetSize =0;
char Text [255] = {0};
if (!IsMe)
{
IsMe =true;
sprintf(Text,"EAX = %2X ,RetAddr = %2X",Eax,RetAddr);
MessageBox (NULL,Text,"RetAddr",NULL);
WriteProcessMemory(GetCurrentProcess(), (LPVOID)0x40108A, JMPGate, sizeof(JMPGate), (DWORD*)RetSize);
IsMe = false;
}
}

int main()
{
DWORD RetSize =0;
SetOnAfter("Kernel32.dll","WriteProcessMemory",My_WriteProcessMemory);
WriteProcessMemory(GetCurrentProcess(), (LPVOID)0x40108f, JMPGate, sizeof(JMPGate), (DWORD*)RetSize);
MessageBoxA(NULL,"Safe Here!!!","Very Good!!",NULL);
return 0;
}

آقای bardia_dst میشه حداقل یه توضیح راجع به اون Hooker بدید که چه طوری کار می کنه و چه طوری نوشته شده.

مهران موسوی
جمعه 29 شهریور 1387, 19:20 عصر
دوستان عزيز سعي ميكنم اخر شب يك مبحث رو در مورد هوك كردن راه اندازي كنم كه به صورت عملي و تخصصي اين مبحث رو دنبال كنيم .....

فقط از دوستان هم خواهش ميكنم همكاري لازم رو انجام بدن ...

( به دليل اينكه بيشتر بچه هاي فعلا اين بخش با Delphi كار ميكنن سعي بر اين دارم با اين زبان هو ك كردن رو ادامه بديم )

يا حق ...

joker
جمعه 05 مهر 1387, 01:39 صبح
بروبچ كسي لينك نسخه فول ور‍ژن و كامل اين madcollection را داره

whitehat
جمعه 05 مهر 1387, 17:32 عصر
در اینجا (http://www.madshi.net/olddlp0.htm) نسخه هایی قانونی برای دانلود هست ، ما بقیه لینکها را نباید اینجا بگذارید
دوستان لطف کنند ،لینکهای Emule و Rapidshare و امثالهم را با پیام خصوصی بهم بفرستند

Modernidea
دوشنبه 05 اسفند 1387, 13:06 عصر
برادران خواهران عزيز توجه فرماييد

بابا يكي نيست بگه شمايي كه تاپيك ميزني و قصد گفتگو و چميدونم آموزش و غيره داري چرا ادامه نميدي و يك مطلب درست حسابي نمينويسيد؟!
من شرمنده ام كه اينجوري گفتم ولي واقعا دوست دارم چنين مطلب هايي رو به صورت حرفه اي دنبال كنم.

با تشكر

مهران موسوی
سه شنبه 06 اسفند 1387, 11:06 صبح
علتش اينه كه در اين فروم مثل بقيه ي فروم ها نظير P30World نميشه به هر فايلي لينك داد چون نميتونيم كتابخانه ها و نرم افزارهاي كرك شده رو انتشار بديم ...

اونوقت وقتي بخواييم اموزش چيزي رو شروع كنيم بايد به هزار نفر لينك ايميل كنيم كه راستش رو بخوايين به درد سرش نمي ارزه . از نظر زماني هم كه بخواييم در نظر بگيريم اكثر بچه ها بايد تا قبل از عيد پروژه هاشون رو ببندن و حساب سال ماليشون رو در بيارن و حسابي فعلا سر اكثر بچه هايي كه به صورت تجاري برنامه نويسي ميكنن و توي ضمينه هاي مورد نظر تجربه دارن شلوغ هست . ( خودم كه روزي 5 بار به برنامه نويس سر ميزدم و تاپيك هاي جديد رو ميخوندم الان روزي يك بار هم به زور ميتونم تاپيك ها رو بخونم و از دانش دوستان استفاده كنم :لبخندساده: )

يا حق ...

BOB
سه شنبه 04 فروردین 1388, 20:28 عصر
سلام

اين مقاله فارسي در مورد Hook هاي windows احتمالا به درد بعضي از دوستان خواهد خورد.

موفق باشيد

Mask
چهارشنبه 05 فروردین 1388, 20:30 عصر
بروبچ كسي لينك نسخه فول ور‍ژن و كامل اين madcollection را داره
از لینک زیر یه قسمتهاییش رو بگیر بقیه رو هم من گزاشتم


در اینجا (http://www.madshi.net/olddlp0.htm) نسخه هایی قانونی برای دانلود هست ، ما بقیه لینکها را نباید اینجا بگذارید

joker
چهارشنبه 05 فروردین 1388, 23:28 عصر
از لینک زیر یه قسمتهاییش رو بگیر بقیه رو هم من گزاشتم

ممنون ،
از هوک انجین مجیک استفاده میکنم...

joker
جمعه 07 فروردین 1388, 21:31 عصر
سوال
وقتی تابع ZwTerminateProcess را هوک کنیم که یک برنامه خاتمه پیدا نکنه در حالت exeهای معمولی بدون مشکل کار میکنه
اما در فایلهای اجرائی نوع SERVICE با سطح دسترسی system ی این تابع ظاهرا هوک کردن نمیتونه جلوی خاتمه را بگیره ...
کسی میتونه علتش را بهم بگه ؟

پیوست : با تشکر از استاد MAGIC مشکلم حل شد :)

مهران موسوی
چهارشنبه 12 فروردین 1388, 03:35 صبح
سوال
وقتی تابع ZwTerminateProcess را هوک کنیم که یک برنامه خاتمه پیدا نکنه در حالت exeهای معمولی بدون مشکل کار میکنه
اما در فایلهای اجرائی نوع SERVICE با سطح دسترسی system ی این تابع ظاهرا هوک کردن نمیتونه جلوی خاتمه را بگیره ...
کسی میتونه علتش را بهم بگه ؟

پیوست : با تشکر از استاد MAGIC مشکلم حل شد :)


شما كه از ويرايشتون پيداست جوابتون رو گرفتيد ولي علتش رو ميگم شايد يك روزي به درد كسي خورد .

برنامه ي شما سطح دسترسيش پايين تر از يك سرويس هست براي همين توابع اي كه براي هوك استفاده ميكنيد اجازه ي دسترسي به حافظه ي كد سرويسها رو ندارند و در نتيجه نميتونند چيزي رو هوك كنند . پس اگه ميخواي روي سرويس ها هم كار كنه بايد يك سرويس بنويسي و عمليات هوك رو با اون انجام بدي .... يا اينكه يك درايور با Ring0 بنويسي تا به تمامي قسمتهاي سيستم دسترسي كامل داشته باشي و دچار از اين قبيل مشكلات نشي ... :چشمک:

يا حق....

Securebit
جمعه 14 فروردین 1388, 01:56 صبح
از لینک زیر یه قسمتهاییش رو بگیر بقیه رو هم من گزاشتم

نسخه های قبل از (madcollection 2.5.9) چندان ارزشی ندارد چون باگهایی دارند که فقط در نگارش ذکر شده برطرف شده اند.

R2du-soft
شنبه 22 مهر 1391, 10:56 صبح
سلام دوستان عزیز

کسی کد هوک کردن
Terminal process

رو داره؟

R2du-soft
چهارشنبه 26 مهر 1391, 10:39 صبح
از این کد در Visual C++ 9 استفاده کردم.

سلام
میشه لینک دانلود این برنامه رو بزارید؟

mehtala
پنج شنبه 29 فروردین 1392, 22:42 عصر
با سلام. من یک مشکلی دارم کسی میتونه حل کنه؟ ممنون میشم.
سوال: یک DLL به دست بیاورید که بتواند برای process های فعال و در حال اجرا تعداد دسترسی های آنها به API ها را مشخص و به عنوان مقدار برگشتی به فراخواننده خود برگشت دهد. آیا این DLL در مورد 64بیتی هم قابل اجرا شدن هست؟
مثلا فایل NOTEPAD بازه. ما میخوایم یه DLL پیدا کنیم که توش یه فایل API باشه که بتونه با قلاب اندازی (HOOK) پردازشهارو نشون بده.
کسی میتونه کمک کنه؟

saeghpc
یک شنبه 02 تیر 1392, 21:04 عصر
سلام دوستان چندسوالی داشتم :
1.من یک تابع از DLL های ویندوز (advapi32) را می خواهم HOOK کنم باید از SetWindowsHookEx حتما استفاده کنم یا روش های دیگری هم هست آخه چند کد دیدم از این تابع استفاده نکرده بودند.
2.یک کد بدست آوردم برای هوک کردن اما این خطای Error 2 error LNK2019: unresolved external symbol "public: __thiscall CAPIHook::~CAPIHook(void)" (??1CAPIHook@@QAE@XZ) referenced in function "void __cdecl `dynamic atexit destructor for 'g_OpenProcess''(void)" (??__Fg_OpenProcess@@YAXXZ)
دوستان می توانند راهنمایی کنند
3.کسی با کد های داخل سایت .MADshi.net توانسته تابعی را هوک کند اگر توانسته و امکان هست بذاره .