首页
社区
课程
招聘
[原创]关于dll注入方法
发表于: 2013-5-7 19:24 79580

[原创]关于dll注入方法

2013-5-7 19:24
79580

大家做内挂,都用什么注入方式?小弟不才,只能想到下面这些方法,不知道还有没有更好的注入方法?
希望高手补充一下。

方法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屏蔽的对象。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (110)
雪    币: 533
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可以考虑把代码复制到进程里面,这不算注入了。
2013-5-7 20:28
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
LSP劫持网络注入,IME输入法注入
或者自己写个驱动,创建线程Notify,发现是目标进程创建的,就LoadDll,还省得Open和Attach了
2013-5-7 20:49
0
雪    币: 182
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
还有一种也是远程注入,用win32汇编,直接往里面写代码。因为汇编比较容易计算要注入的代码长度,注意重定位就行了
2013-5-7 22:54
0
雪    币: 1839
活跃值: (295)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
5
安博士保护系统,就是这么弄的,把dll搞成一个dat,然后让game.exe加载这个dat,
创建一片内存NewMem,然后复制进去,然后导入IAT,更新重定位表,指定OEP运行。

我们的dll就算写成dat,game.exe是不会主动加载的,还是需要提前注入一个dll,去做:NewMem,重定位,指定OEP等等事情。

问题是也需要提前注入另外一个dll啊。所以这种方法不是第一步要做的事情。
2013-5-8 09:12
0
雪    币: 1839
活跃值: (295)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
6
网络消息注入,就是我说的第一种方法里面的消息注入,类似的。

IME注入,无非就是我说的【方法一】键盘鼠标消息钩子,或者是【方法六】驱动服务。
2013-5-8 09:15
0
雪    币: 1839
活跃值: (295)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
7
这个就是【方法七】
2013-5-8 09:17
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
8
最简单稳定的方法:
驱动创建Image Notify,动态修改进程内存IAT,DLL加载完成再恢复回去,毫无痕迹。。
2013-5-8 11:37
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
NP GAMEMON会重载....然后他的壳的关系 会直接报错......
其实最干净的办法是内存映射.然后设置EIP....没有加载模块的过程.所以链表什么信息都没有.
映射可以在驱动下也可以在应用层.

然后是模块劫持....XP下的还有注册表.方法太多太多了...
2013-5-8 12:13
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
LSP劫持注入跟消息无关,输入法注入也无关消息钩子
2种完全不同的方式,分别是利用网络传输协议和输入法加载的机制来注入dll
2013-5-8 12:16
0
雪    币: 1839
活跃值: (295)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
11
XP下的还有注册表.

注册表如何把一个dll插入到进程中。大牛,不吝赐教啊,膜拜
2013-5-8 17:44
0
雪    币: 1839
活跃值: (295)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
12
输入法加载的原理详解,洗耳恭听,提前膜拜下
2013-5-8 17:46
0
雪    币: 88
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
CONTEXT 结构  修改eip
2013-5-24 09:47
0
雪    币: 130
活跃值: (427)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
支持~~~~
2013-5-30 04:44
0
雪    币: 244
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
值得收听
2013-5-30 05:50
0
雪    币: 238
活跃值: (375)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
D3D9.DLL 那个.可以写个马甲....
2013-5-30 07:34
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
收藏了,谢楼主
2013-5-30 16:36
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
初来咋到,发现都是大牛
2013-5-31 15:33
0
雪    币: 238
活跃值: (216)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
感谢楼主无私分享。
2013-5-31 22:47
0
雪    币: 4
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
被科普  感谢楼主了~
2013-5-31 23:07
0
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
我喜欢劫持游戏的dll
2013-5-31 23:58
0
雪    币: 334
活跃值: (213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
奋力追赶学习中。谢谢。
2013-6-1 16:18
0
雪    币: 284
活跃值: (3624)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
23
顶六一顶
2013-6-1 16:34
0
雪    币: 157
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
保存,以后慢慢看
2013-6-7 20:00
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
本帖回复高产,学习啦。
2013-6-8 10:44
0
游客
登录 | 注册 方可回帖
返回
//