欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]关于dll注入方法

[原创]关于dll注入方法

大家做内挂,都用什么注入方式?小弟不才,只能想到下面这些方法,不知道还有没有更好的注入方法?
希望高手补充一下。
方法1,键盘钩子,鼠标钩子,消息钩子.
  挂.Dll:
        if ghNextHookKey = 0 then
            ghNextHookKey := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, HInstance, 0);
        if ghNextHookMouse = 0 then
            ghNextHookMouse := SetWindowsHookEx(WH_MOUSE, @MouseHook, HInstance, 0);
            
        缺点:TP,np,zp,hp,gpk,HS, xtrap,.....通常都对这些驱动处理了。
              只有没有加保护的游戏可以用,或者加了保护但没开相应功能也可以用。
            
方法2,对Game.exe加壳,用壳来LoadLibraryA。
  最简单的方法,找个upx的代码,修改一下,在:
    popa
    Jmp game.exe.OEP,  
    之前,LoadLibraryA,挂.dll.
   
    缺点: 游戏Launcher.exe通常都验证了 game.exe的MD5.
      或者Game.exe的自身壳做了Crc校验。
      关键的校验代码没有加vm,尚可过。如果加了vm,就..........
      
  
方法3,用PE编辑工具PE_Editor,给game.exe加个节表,从而启动 挂.Dll。
        缺点同上。
       
方法4,修改d3d9.dll,做个Jmp。
  【方法】
  游戏肯定会用 d3d9.dll这个库。
  用OD直接打开d3d9.dll, 在入口修改:
    jmp  镜像地址.XXXXXXX
   
    镜像地址.XXXXXXX-10:
      asdf.dll
    镜像地址.XXXXXXX:  
      pushad
      mov eax, XXXXXXX
      sub eax,10
      push eax      
      call LoadLibraryA
      popa
      //补齐代码
      jmp  回去
   
    OD另存D3d9.dll,然后替换之。
   
    缺点,不同操作系统D3d9.dll都不同,而且D3d9.dll的版本非常多,需要一个一个的改。
   
方法5,修改系统dll的某个函数,比如 User32.dll,或者kernel.dll的某个Call。
  方法同上。
  
  缺点:某些游戏保护系统把kernel复制一份,没用操作系统的kernel,很讨厌。比如tp就这么干了。
  
方法6,用驱动,启动个服务,给每个进程插入一个Dll。
        DWORD FindProcess(LPCTSTR str)
        {
                DWORD id = 0;
                PROCESSENTRY32 processEntry;
                HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
       
                processEntry.dwSize = sizeof(PROCESSENTRY32);
       
                BOOL bRet = Process32First(hProcessSnap, &processEntry);
       
                while (bRet)
                {               
                        if ( !wcscmp(processEntry.szExeFile, str) )
                        {
                                id = processEntry.th32ProcessID;
                                break;
                        }
                        bRet = Process32Next(hProcessSnap, &processEntry);
                }
       
                return id;
        }
       
        void DllHook()
        {
                //在这里写加载代码
                FindProcess("game.exe");
                //这里写 LoadLibraryA,加载自己Dll
                  
               
        }
       
        void OnUnload(IN PDRIVER_OBJECT DriverObject)
        {
                //在这里写卸载驱动的代码
        }
       
        NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
        {
       
                DriverObject->DriverUnload = OnUnload;
       
                DllHook();
       
                return STATUS_SUCCESS;
        }
  缺点:经常蓝了,很烦。
  
方法7,远程注入。
       
        function InstallRemoteDll(ExeName,DllName :PChar ):DWord ;
        var
          si : TSTARTUPINFO  ;
                pi : TPROCESSINFORMATION  ;
          mc_RemoteStr : PChar ;
          dwWriteByte : DWord;
          pfn_LoadLib : TThreadStartRoutine ;
          dwT1 : dword;
        begin
          result :=0 ;
          //启动进程
          ZeroMemory( @si, sizeof(si) ) ;
          si.cb  := sizeof(si) ;
          ZeroMemory( @pi, sizeof(pi) );
          if CreateProcess(ExeName,'',nil,nil,FALSE,CREATE_SUSPENDED,nil,nil,si,pi) then
            result:=pi.dwProcessId ;
          /////分配远程内存;
          mc_RemoteStr:=VirtualAllocEx(pi.hProcess,nil,length(DllName)+1,MEM_COMMIT,PAGE_READWRITE);
          if not WriteProcessMemory(pi.hProcess,mc_RemoteStr,DllName,Length(DllName)+1,dwWriteByte) then
            result :=1;
          //插入DLL
          pfn_LoadLib := TThreadStartRoutine(GetProcAddress(GetModuleHandle('Kernel32'),'LoadLibraryA')) ;
          CreateRemoteThread(pi.hProcess,nil,0,@pfn_LoadLib ,mc_RemoteStr,0,dwT1) ;
       
        end;
       
        缺点:这个方式也是大多数Protect屏蔽的对象。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功