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

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Белый Дым, 3 Mar 2012.

  1. Белый Дым

    Белый Дым New Member

    Joined:
    25 Feb 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    пишу формграббер. успел набросать вот так вота:
    PHP:

    #include <windows.h>
    #include "module_disasm.h"
    #include "ffhook.h"
    HINSTANCE hInst=NULL;
    HHOOK SH 0;
    HANDLE MutexHandle=(HANDLE)(-1);



    long __stdcall MsgProc(int codeunsigned int wParam,long lparam)
    {

    return 
    CallNextHookEx(SH,code,wParam,lparam);
    }

    void __stdcall SetWindowsHook(bool e)
    {
        if(
    e){
         
    HANDLE M=CreateMutex(0,false,"__API_HOOK");
         if(
    GetLastError()!=ERROR_ALREADY_EXISTS){
         
         
    SH=SetWindowsHookEx(WH_GETMESSAGE,MsgProc,hInst,0);
         
    MutexHandle=M;
         }else
        
    CloseHandle(M);
        }
        else
        {
        
    UnhookWindowsHookEx(SH);
        
    CloseHandle(MutexHandle);
        }
    }


    BOOL __stdcall DllMain(HINSTANCE hModuleDWORD dwReasonLPVOID lpReserved)
    {
          switch(
    dwReason)
          {
          case 
    DLL_PROCESS_ATTACH:
                                    
    hInst=hModule;//инициализируем дескриптор приложения
                                    
    SetWindowsHook(true);
                                    
    SetFFHook();
                            
          case 
    DLL_PROCESS_DETACH:  
                                    
    SetWindowsHook(false);
          }
        return 
    0;
    }
    это главный модуль, а сама установка хука вот так выглядит:

    PHP:
    #include <windows.h>
    #include "module_disasm.h"//(c) slesh
    unsigned char *opcode=NULL;



    int PR_WRITE_tramp(
         
    DWORD *fd,
        
    void *buf,
        
    DWORD amount
    )
    {
        
    __asm{
            
    jmp opcode
        
    }
    }


    int PR_WRITE_hook(
         
    DWORD *fd,
        
    void *buf,
        
    DWORD amount
    )
    {

            
    MessageBox(0,"ok",NULL,0);
        
    return 
    PR_WRITE_tramp(fd,buf,amount);
    }




    bool SetFFHook()//хукаем nspr
    {
    HMODULE hNspr=GetModuleHandleA("nspr4.dll");//полчаем дескриптор dll-ки
    if(hNspr==0) return false;//если dll не загружена а значит мы не в том процессе - выходим

    DWORD dwPAddr=(DWORD)GetProcAddress(hNspr,"PR_Write");
    if(
    dwPAddr<=0) return false;//если не нашли функцию, значит dll левая - выходим
    MessageBox(0,"ok",NULL,0);
    int buflen=MDAL_GetOpcodesLenByNeedLen((BYTE *)dwPAddr,5);//сколько надо перенести на трамплин чтоб записать 5 байт
    unsigned char *op=new unsigned char[buflen];//выделяем память
    opcode=new unsigned char[buflen+5];
    ReadProcessMemory(INVALID_HANDLE_VALUE,(LPCVOID)dwPAddr,opcode,buflen,new DWORD);//копируем начало

    unsigned char jmp=0xE9;
    unsigned char nop=0x90;
    memcpy(op,(const void *)&jmp,1);//jmp
    DWORD offset=(DWORD)&PR_WRITE_hook dwPAddr 5;
    memcpy( (void *)((DWORD)op+1),(const void *)&offset,4);
    WriteProcessMemory(INVALID_HANDLE_VALUE,(LPVOID)dwPAddr,op,5,new DWORD);
        for (
    int i=5;i<buflen;++i)
            
    WriteProcessMemoryINVALID_HANDLE_VALUE,(LPVOID)(dwPAddr+i),&nop,1,new DWORD);


    DWORD tramp_offset=dwPAddr-(DWORD)opcode-5;
    if(!
    VirtualProtect(opcodebuflen+5PAGE_EXECUTE_READWRITE, new DWORD)) return false;
    memcpy((void *)((DWORD)opcode+buflen),(const void *)&jmp,1);//jmp
    memcpy( (void *)((DWORD)opcode+buflen+1),(const void *)&tramp_offset,4);

    return 
    true;
    }
    дак вот. почемуто выполняется только:
    PHP:
    HMODULE hNspr=GetModuleHandleA("nspr4.dll");//полчаем дескриптор dll-ки
    if(hNspr==0) return false;//если dll не загружена а значит мы не 

    адрес базы nspr4(hNspr) равен нулю даже когда длл грузиться в процесс фокса. грузится она лоадреом во все процессы за счет установки глобального хука. прошу заметить что аналогичный код на дельфе работает так как надо(только глобальный хук немного по другому ставиться но я думаю это не столь важно ибо длл точно грузиться во все процессыт.к. мессаджбокс прописанный в dllmain на dllprocessatach вылазит во всех оконных процессах). в чем дело? чеза хня?
     
  2. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    говорю сразу, код целиком не смотрел, но может попробуйте узнать базу через LoadLibraryA?
     
  3. Белый Дым

    Белый Дым New Member

    Joined:
    25 Feb 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    зачем? длл уже должна быть загружена в процесс....
     
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Нельзя гарантировать это.
     
  5. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    во первых esi в MDAL_GetOpcodeLen не сохраняется
    замените это

    Code:
    int MDAL_GetOpcodesLenByNeedLen(BYTE* opcode, int NeedLen)
    {
    	int FullLen = 0;
    	int len;
    
    	do
    	{
    		len = MDAL_GetOpcodeLen(opcode + FullLen);
    		if (!len)
    		{
    			return 0;
    		}
    		FullLen += len;
    	}
    	while (FullLen < NeedLen);
    
    	return FullLen;
    }
    
    на это
    Code:
    int MDAL_GetOpcodesLenByNeedLen(BYTE* opcode, int NeedLen)
    {
    	int FullLen = 0;
    	int len;
    
    	do
    	{
    		push esi
    		len = MDAL_GetOpcodeLen(opcode + FullLen);
    		pop esi
    		if (!len)
    		{
    			return 0;
    		}
    		FullLen += len;
    	}
    	while (FullLen < NeedLen);
    
    	return FullLen;
    }
    
    а во вторых вот исходники там есть код для сплайсинга
    http://webfile.ru/folder?id=17840
     
    #5 greki_hoy, 6 Mar 2012
    Last edited: 6 Mar 2012