с FASM в с++, хук VMT

Тема в разделе "LANGS.C", создана пользователем r2max, 19 авг 2011.

  1. r2max

    r2max Женя

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    40
    Адрес:
    Киев
    Всем доброго вечера.
    В общем всё таки решил начать изучать с++.
    У меня на FASM остался пример хука VMT.
    Код (Text):
    1. macro m2m dst*,src* {
    2.     pushd src
    3.     popd dst
    4. };ENDM m2m
    5. proc HookMethod uses edi, Table:DWORD,Method:DWORD,Hook:DWORD
    6.     mov ecx,-1
    7.     cld
    8.     mov edi,[Table]
    9.     mov eax,[Method]
    10.     repnz scasd
    11.     m2m dword[edi-4],[Hook]
    12.     ret
    13. endp
    Реально такое сделать на с++?
    Или может быть есть какие то стандартные для этого функции.
    Помогите пожалуйста..
    И если можете, скиньте ссылку на материалы по сплайсингу и т д на с++
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    C++ - он, мягко говоря, для других целей.
     
  3. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    ну ничeго жe нe мeшaeт писaть нa с++ используя пaрaдигму с.
     
  4. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Реально, и не сложнее чем на асме. Ставите атрибут write, и пишите нужные байты.
    Хотя к С++ это отношения не имеет.
     
  5. r2max

    r2max Женя

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    40
    Адрес:
    Киев
    Код (Text):
    1. void SplaisingVMT(void * Table, void * Method, void * Hook)
    2. {
    3.     __asm mov ecx,-1
    4.     __asm cld
    5.     __asm mov edi,Table
    6.     __asm mov eax,Method
    7.     __asm repnz scasd
    8.     __asm push Hook
    9.     __asm pop edi-4
    10.     return;
    11. };
    Код (Text):
    1.     HMODULE hEngine = GetModuleHandle("engine.dll");
    2.     void * GameGuardReplay = GetProcAddress(hEngine, nGameGuardReplay);
    3.     void * UNHandlerTable = GetProcAddress(hEngine, nUNHandlerTable);
    4.     SplaisingVMT(UNHandlerTable,GameGuardReplay,GameGuardReplayHook);
    не работает =\
     
  6. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    VirtualProtect/WriteProcessMemory
    Разрешите писать в этот участок сделав его WRITE через VirtualProtect, после этого запись можно делать
    либо вручную, либо через WriteProcessMemory....
     
  7. r2max

    r2max Женя

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    40
    Адрес:
    Киев
    извиняюсь что не по теме но всё же...
    У меня есть список строк.
    Код (Text):
    1. char * BlackName[]=
    2. {   "L2UnrealWWindowsViewportWindow",   "Lineage II",
    3.     "l2control",    "L2NET",    "L2Jes ;) 0.1.193" ***и т д***
    4. }
    Мне надо проверить название окна с этим списком
    Код (Text):
    1. bool __stdcall FindHookByTitle(HWND hWnd, long lParam)
    2. {
    3.     char TitleName[255];
    4.     for(int i = 1; i < sizeof(BlackName); i++)
    5.     {
    6.         GetWindowText(hWnd, TitleName, 254);
    7.         if(strstr(TitleName,BlackName[i]) > 0)
    8.         {
    9.             MessageBox(0,"обнаружено окно!!!","обнаружено окно!!",MB_ICONSTOP);
    10.             ***и т д***
    11.         }
    12.     }
    13.     return false;
    14. };
    Это правильно?
     
  8. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    r2max
    Нажмите F5 и узнаете.
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    strstr тебе рекомендовали юзать для случая, когда все имена записаны в одну строку. А для массива строк лучше юзать if (strcmp(..) == 0)
     
  10. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    958
  11. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    958

    а) for(int i = 1; i < sizeof(BlackName); i++) // i = 0;
    b) i < sizeof(BlackName)/sizeof(char*) // в случае если char *BlackName[] = {"first str", "second str", ...};