نمایش نتایج 1 تا 35 از 35

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

  1. #1
    کاربر تازه وارد آواتار crackgns
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    همین نزدیکی ها
    پست
    38

    Post آموزش Hook کردن توابع API از مبتدی

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

  2. #2

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  3. #3
    کاربر تازه وارد آواتار crackgns
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    همین نزدیکی ها
    پست
    38

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  4. #4
    کاربر دائمی
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    تهران
    پست
    2,397

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  5. #5

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  6. #6
    کاربر تازه وارد آواتار crackgns
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    همین نزدیکی ها
    پست
    38

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  7. #7

    Exclamation نقل قول: آموزش Hook کردن توابع API از مبتدی

    مثلآ فرض کنین بخوایم تابع CopyFile رو Hook کنیم حالا باید چیکار کنیم؟
    حالا ديدي خوب جستجو نمي كني ؟
    http://www.madshi.net

  8. #8
    کاربر تازه وارد آواتار crackgns
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    همین نزدیکی ها
    پست
    38

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  9. #9
    کاربر دائمی آواتار mohammad272005
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    تهران
    پست
    639

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  10. #10

    نقل قول: آموزش Hook کردن توابع API از مبتدی

    آقا این رو هم دیدم.کدوم قسمتش رو می گی.فقط لینکشو دادی یا خودت ازش استفاده کردی
    بابا بيخيال؛
    مي گيم MSDN رو بخون ميگي نه... ميگيم اين لينك رو بخون ميگي نه اين ساده است... كامپوننت ميديم كه بي دردسر استفاده كني ميگي همينطوري الكي لينك دادي.

  11. #11
    کاربر دائمی آواتار joker
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    اصفهان
    سن
    42
    پست
    1,326

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  12. #12
    کاربر تازه وارد آواتار crackgns
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    همین نزدیکی ها
    پست
    38

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  13. #13
    کاربر تازه وارد آواتار crackgns
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    همین نزدیکی ها
    پست
    38

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  14. #14

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  15. #15
    مدیر بخش آواتار Securebit
    تاریخ عضویت
    آبان 1386
    محل زندگی
    تهران
    پست
    761

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  16. #16
    کاربر تازه وارد آواتار crackgns
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    همین نزدیکی ها
    پست
    38

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  17. #17
    مدیر بخش آواتار Securebit
    تاریخ عضویت
    آبان 1386
    محل زندگی
    تهران
    پست
    761

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  18. #18
    کاربر تازه وارد آواتار Masoudxb
    تاریخ عضویت
    آبان 1385
    محل زندگی
    Tehran
    پست
    58

    نقل قول: آموزش Hook کردن توابع API از مبتدی

    نقل قول نوشته شده توسط 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

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

  19. #19
    کاربر تازه وارد آواتار crackgns
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    همین نزدیکی ها
    پست
    38

    نقل قول: آموزش Hook کردن توابع API از مبتدی

    نقل قول نوشته شده توسط Masoudxb مشاهده تاپیک
    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 : چهارشنبه 27 شهریور 1387 در 14:48 عصر

  20. #20
    کاربر تازه وارد آواتار crackgns
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    همین نزدیکی ها
    پست
    38

    نقل قول: آموزش Hook کردن توابع API از مبتدی

    نقل قول نوشته شده توسط bardia_dst مشاهده تاپیک
    هوکری بسیار قدرتمند با کد ++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 بدید که چه طوری کار می کنه و چه طوری نوشته شده.

  21. #21

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

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

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

    يا حق ...

  22. #22
    کاربر دائمی آواتار joker
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    اصفهان
    سن
    42
    پست
    1,326

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  23. #23
    مدیر بخش آواتار whitehat
    تاریخ عضویت
    مهر 1382
    محل زندگی
    شیراز
    پست
    2,175

    نقل قول: آموزش Hook کردن توابع API از مبتدی

    در اینجا نسخه هایی قانونی برای دانلود هست ، ما بقیه لینکها را نباید اینجا بگذارید
    دوستان لطف کنند ،لینکهای Emule و Rapidshare و امثالهم را با پیام خصوصی بهم بفرستند
    To follow the path:
    Look to the master
    Follow the master
    Walk with the master
    See through the master
    Become the master

  24. #24
    کاربر دائمی آواتار Modernidea
    تاریخ عضویت
    خرداد 1387
    محل زندگی
    »مشهد الرضا«
    پست
    573

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

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

    با تشكر

  25. #25

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

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

    يا حق ...

  26. #26
    کاربر دائمی آواتار BOB
    تاریخ عضویت
    خرداد 1383
    محل زندگی
    http://www.mshams.ir
    پست
    450

    مقاله فارسي آموزش Hook و ...

    سلام

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

    موفق باشيد
    فایل های ضمیمه فایل های ضمیمه

  27. #27

    نقل قول: آموزش Hook کردن توابع API از مبتدی

    بروبچ كسي لينك نسخه فول ور‍ژن و كامل اين madcollection را داره
    از لینک زیر یه قسمتهاییش رو بگیر بقیه رو هم من گزاشتم
    در اینجا نسخه هایی قانونی برای دانلود هست ، ما بقیه لینکها را نباید اینجا بگذارید
    فایل های ضمیمه فایل های ضمیمه


  28. #28
    کاربر دائمی آواتار joker
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    اصفهان
    سن
    42
    پست
    1,326

    نقل قول: آموزش Hook کردن توابع API از مبتدی

    نقل قول نوشته شده توسط Delphi-7 مشاهده تاپیک
    از لینک زیر یه قسمتهاییش رو بگیر بقیه رو هم من گزاشتم
    ممنون ،
    از هوک انجین مجیک استفاده میکنم...

  29. #29
    کاربر دائمی آواتار joker
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    اصفهان
    سن
    42
    پست
    1,326

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

    پیوست : با تشکر از استاد MAGIC مشکلم حل شد :)
    آخرین ویرایش به وسیله joker : شنبه 08 فروردین 1388 در 02:46 صبح

  30. #30

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

    پیوست : با تشکر از استاد MAGIC مشکلم حل شد :)
    شما كه از ويرايشتون پيداست جوابتون رو گرفتيد ولي علتش رو ميگم شايد يك روزي به درد كسي خورد .

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

    يا حق....

  31. #31
    مدیر بخش آواتار Securebit
    تاریخ عضویت
    آبان 1386
    محل زندگی
    تهران
    پست
    761

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  32. #32

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

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

    رو داره؟

  33. #33

    نقل قول: آموزش Hook کردن توابع API از مبتدی

    نقل قول نوشته شده توسط Strong Bytes مشاهده تاپیک
    از این کد در Visual C++‎ 9 استفاده کردم.
    سلام
    میشه لینک دانلود این برنامه رو بزارید؟

  34. #34

    Question نقل قول: آموزش Hook کردن توابع API از مبتدی

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

  35. #35

    نقل قول: آموزش Hook کردن توابع API از مبتدی

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

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •