大家做内挂,都用什么注入方式?小弟不才,只能想到下面这些方法,不知道还有没有更好的注入方法?
希望高手补充一下。
方法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屏蔽的对象。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!