# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > امنیت در نرم افزار و برنامه نویسی >  آموزش Hook کردن توابع API از مبتدی

## crackgns

از دوستان و اساتید عزیز لطفآ اگه کسی Hook کردن توابع API رو بلده تو این تاپیک از سطح مبتدی آموزش بده.
از دوستانی که همکاری میکنن خیلی ممنونم

----------


## Developer Programmer

بپر برو از CD فروش محله، CD های MSDN 2008 رو بخر و بیار نصب کن. بعد توابع Hook رو با حوصله بخون

----------


## crackgns

اگه نمیخواین آموزش بدید حداقل یه منبع فارسی معرفی کنین؟!

----------


## Nima NT

اگه بخوای دنبال منابع فارسی بری هیچی یاد نمیگیری ، این دوستمون ( افشین خان ) درست راهنمائی کردن.

----------


## Developer Programmer

> اگه نمیخواین آموزش بدید حداقل یه منبع فارسی معرفی کنین؟!


بیا اینم آموزش...
http://delphi.about.com/od/kbwinshell/a/delphi_hook.htm

----------


## crackgns

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

----------


## Developer Programmer

> مثلآ فرض کنین بخوایم تابع CopyFile رو Hook کنیم حالا باید چیکار کنیم؟


حالا ديدي خوب جستجو نمي كني ؟  :لبخند: 
http://www.madshi.net

----------


## crackgns

آقا این رو هم دیدم.کدوم قسمتش رو می گی.فقط لینکشو دادی یا خودت ازش استفاده کردی.من اکثر منابع انگلیسی رو دیدم اما مشکل اینجاست که من یه منبع فارسی(کتاب)می خوام.کسی می تونه یه کتاب معرفی کنه؟!!

----------


## mohammad272005

والا من فارسیشو ندارم. ولی این انگلیسیش. خداییش روون و با مثال واضح نوشته.

----------


## Developer Programmer

> آقا این رو هم دیدم.کدوم قسمتش رو می گی.فقط لینکشو دادی یا خودت ازش استفاده کردی


بابا بيخيال؛  
مي گيم MSDN رو بخون ميگي نه... ميگيم اين لينك رو بخون ميگي نه اين ساده است... كامپوننت ميديم كه بي دردسر استفاده كني ميگي همينطوري الكي لينك دادي.

----------


## joker

نتیجه گیری اخلاقی : اقا بگو چه برنامه ای میخوای تا برات بنویسیم :)

----------


## crackgns

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

----------


## crackgns

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

----------


## Developer Programmer

> رنامه ای که بتونه کل فراخوانی هایی که توسط تمام برنامه ها و حتی ویروس ها از  چند تا API صورت می گیره رو Hook کنم


اگه فقط تا اين حده... اينترنت پر شده از برنامه هايي كه بتونن Hookهاي توابع رو نشونت بدن تا حتي بتوني بعضي RootKit ها رو هم شناسايي كني؛
يه Hooker قوي رو برديا گذاشته بود يه چند تا ابزار مفيد رو هم تو سايت SysInternals پيدا ميكني

----------


## Securebit

هوکری بسیار قدرتمند با کد ++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

آقا خیلی ممنون،ولی این با کدوم کامپایلر کامپایل میشه من با کامپایلر 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

از این کد در Visual C++‎ 9 استفاده کردم.

----------


## Masoudxb

> آقا خیلی ممنون،ولی این با کدوم کامپایلر کامپایل میشه من با کامپایلر 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

> 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

> هوکری بسیار قدرتمند با کد ++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")
> ...


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

----------


## مهران موسوی

دوستان عزيز سعي ميكنم اخر شب يك مبحث رو در مورد هوك كردن راه اندازي كنم كه به صورت عملي و تخصصي اين مبحث رو دنبال كنيم .....

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

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

يا حق ...

----------


## joker

بروبچ كسي  لينك نسخه فول ور‍ژن و كامل اين madcollection را داره

----------


## whitehat

در اینجا نسخه هایی قانونی برای دانلود هست ، ما بقیه لینکها را نباید اینجا بگذارید
دوستان لطف کنند ،لینکهای Emule و Rapidshare و امثالهم را با پیام خصوصی بهم بفرستند

----------


## Modernidea

برادران خواهران عزيز توجه فرماييد

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

با تشكر

----------


## مهران موسوی

علتش اينه كه در اين فروم مثل بقيه ي فروم ها نظير P30World نميشه به هر فايلي لينك داد چون نميتونيم كتابخانه ها و نرم افزارهاي كرك شده رو انتشار بديم ...

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

يا حق ...

----------


## BOB

سلام

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

موفق باشيد

----------


## Mask

> بروبچ كسي لينك نسخه فول ور‍ژن و كامل اين madcollection را داره


از لینک زیر یه قسمتهاییش رو بگیر بقیه رو هم من گزاشتم



> در اینجا نسخه هایی قانونی برای دانلود هست ، ما بقیه لینکها را نباید اینجا بگذارید

----------


## joker

> از لینک زیر یه قسمتهاییش رو بگیر بقیه رو هم من گزاشتم


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

----------


## joker

سوال
وقتی تابع ZwTerminateProcess را هوک کنیم که یک برنامه خاتمه پیدا نکنه در حالت exeهای معمولی بدون مشکل کار میکنه
اما در فایلهای اجرائی نوع SERVICE با سطح دسترسی system ی این تابع ظاهرا هوک کردن نمیتونه جلوی خاتمه  را بگیره ... 
* کسی میتونه علتش را بهم بگه ؟*

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

----------


## مهران موسوی

> سوال
> وقتی تابع ZwTerminateProcess را هوک کنیم که یک برنامه خاتمه پیدا نکنه در حالت exeهای معمولی بدون مشکل کار میکنه
> اما در فایلهای اجرائی نوع SERVICE با سطح دسترسی system ی این تابع ظاهرا هوک کردن نمیتونه جلوی خاتمه  را بگیره ... 
> * کسی میتونه علتش را بهم بگه ؟*
> 
> پیوست : با تشکر از استاد MAGIC  مشکلم حل شد :)


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

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

يا حق....

----------


## Securebit

> از لینک زیر یه قسمتهاییش رو بگیر بقیه رو هم من گزاشتم


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

----------


## R2du-soft

سلام دوستان عزیز

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

 رو داره؟

----------


## R2du-soft

> از این کد در Visual C++‎ 9 استفاده کردم.


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

----------


## mehtala

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

----------


## saeghpc

سلام دوستان چندسوالی داشتم :
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 توانسته تابعی را هوک کند اگر توانسته و امکان هست بذاره .

----------

