能力值:
( LV9,RANK:610 )
|
-
-
2 楼
此次,主要简洁点,代码少贴点,没必要的就没贴~~~喜欢的支持一下!不喜欢的就乐一下!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
LZ也是做外挂的坏蛋..
PS.我只看了下.没试验.貌似这种方法依然过不了反外挂= =||
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
雾里看花。..........
|
能力值:
(RANK:570 )
|
-
-
11 楼
他写的东西都是基于你拥有能改变目标进程环境的权限。当你可以进入对方进程空间之后,可以玩的东西就多,可以根据你对系统的理解,在多种技术层面夺取EIP,例如玩玩系统提供的某个API,HOOK某个频繁调用的API,修改TEB/PEB里面某个回调的指针,当然还有SEH这个易于覆盖的东西。
因此,对于反外挂来说,其实就是不让不在白名单内的程序访问白名单。它的实现仅是禁止未授权程序获取受保护进程的HPROC、HTHREAD、HWND。
对于反外挂代码来说,保证自身效果的关键问题在于
1.如何保证自身文件不被修改
2.如何防止对方进入内核
假设正常情况下,用户在玩游戏的时候不应安装任何驱动程序,那么反外挂实际的问题便是与外挂运行先后的问题。即使网游在安装后,反外挂系统一直运行在用户系统,也可以通过先运行外挂,再装网游来解决。
一旦进入R0,爱怎么玩怎么玩~~~
想过反外挂系统,你需要一份WRK和2K的代码和一定反汇编及编写驱动的能力。剩下的仅是时间问题~~~
即LZ的文章,仅是为初学者普及编程知识,对抗反外挂,战场在R0,而不是R3,同样地,对抗主动防御,战场也在R0,而不是R3~~~
如何从R3切换到R0,这个问题则在NTDLL中有答案~~~KERNEL32和USER32没有你想要的答案
|
能力值:
( LV9,RANK:610 )
|
-
-
12 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
写得好,顶一下
|
能力值:
( LV12,RANK:460 )
|
-
-
16 楼
// fuckdll.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "fuckdll.h"
#include <tchar.h>
#define WM_CMD WM_USER+1
typedef ATOM (*REGWINCLASS)(CONST WNDCLASS *WndProc);
WNDPROC fpsWndProc;
REGWINCLASS fpsRegisterClassA;
typedef struct fuckyou
{
unsigned char _01cmd;
unsigned long _02dat;
}_ASM_JMP;
char Buffer1[128];
_ASM_JMP _jmp;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
InitRegClass();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT CALLBACK fpnWndProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
{
//保存窗口句柄:
//修改标题,方便我们调用:
SetWindowText(hDlg,_T("[PhantomNet] XX")); //我们把标题修改掉,方便通信,可以不修改的。
break;
}
case WM_CMD: //自定义命令:
{
if((DWORD)wParam==0x01){PostQuitMessage(0);} //收到命令,我们直接用API让程序结束。
if((DWORD)wParam==0x02){} //……什么操作都可以
break;
}
default:{break;}
}
//转到游戏的回调函数:
return fpsWndProc(hDlg,message,wParam,lParam);
}
ATOM WINAPI fpnRegisterClassA(WNDCLASS *lpWndClass)
{
MessageBox(NULL,"fuck you! 新窗口过程","look me",MB_OK);
//替换"XX"窗口的回调函数:
if(lstrcmp(lpWndClass->lpszClassName,"Afx:400000:0")==0) //如果是我们要替换的窗口,就替换,不是就不替换
{
//保存原始窗口过程
fpsWndProc=lpWndClass->lpfnWndProc;
//替换
lpWndClass->lpfnWndProc=fpnWndProc;
}
ATOM atom=fpsRegisterClassA(lpWndClass);
return atom;
}
void InitRegClass()
{
MessageBox(NULL,"fuck you!initregclass","look me",MB_OK);
//获取模块句柄:
HINSTANCE hModule=GetModuleHandle("User32.dll");
wsprintf(Buffer1,"address:%x",hModule);
MessageBox(NULL,Buffer1,"user32.dll",MB_OK);
if (hModule == NULL)
{
MessageBox(NULL,"fuck you! error","look me",MB_OK);
return;
}
//获取原始函数地址:
fpsRegisterClassA=(REGWINCLASS)GetProcAddress(hModule,"RegisterClassA");
wsprintf(Buffer1,"address:%x",fpsRegisterClassA);
MessageBox(NULL,Buffer1,"RegisterClass导出表函数地址",MB_OK);
if (fpsRegisterClassA == NULL)
{
MessageBox(NULL,"fuck you! error","look me",MB_OK);
return;
}
//获取当前内存块的保护类型:
MEMORY_BASIC_INFORMATION _base;
DWORD real;
real=VirtualQuery((LPVOID)((DWORD)hModule+0x1000),&_base,sizeof(MEMORY_BASIC_INFORMATION));
if (!real)
{
MessageBox(NULL,"fuck you! error","look me",MB_OK);
return;
}
//处理为读写类型:
if(!VirtualProtect(_base.BaseAddress,_base.RegionSize,PAGE_READWRITE,&_base.Protect)){
MessageBox(NULL,"fuck you! error","look me",MB_OK);
return;
}
//获得导出表的地址和大小:
DWORD dwExportSize=NULL;
PIMAGE_EXPORT_DIRECTORY pdwExportAddr=NULL;
PIMAGE_DOS_HEADER _dosHeader;
PIMAGE_NT_HEADERS _ntHeader;
DWORD _exportDir=NULL;
_dosHeader=(PIMAGE_DOS_HEADER)hModule;
_ntHeader=(PIMAGE_NT_HEADERS)((LONG)_dosHeader+(LONG)(_dosHeader->e_lfanew));
_exportDir=_ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
dwExportSize=_ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
//查找RegisterClassA函数地址:
pdwExportAddr=(PIMAGE_EXPORT_DIRECTORY)(_exportDir+(DWORD)hModule);
DWORD dwNum=pdwExportAddr->NumberOfFunctions;
DWORD** dwaddr=(DWORD**)((DWORD)hModule+pdwExportAddr->AddressOfFunctions);
for(DWORD i=0;i<dwNum;i++,dwaddr++)
{
if((DWORD)*dwaddr+(DWORD)hModule == (DWORD)fpsRegisterClassA)
{
//计算跳转地址:
DWORD dword=(DWORD)fpnRegisterClassA-(DWORD)fpsRegisterClassA;
_jmp._01cmd =0xE9;
memcpy(&_jmp._02dat,&dword,4);
//在函数之前5字节写入跳转
memcpy((LPVOID)((DWORD)fpsRegisterClassA-5),&_jmp,5);
//更新函数地址
DWORD dwAddr=(DWORD)(*dwaddr)-5;
//修改导出表地址
memcpy(dwaddr,&dwAddr,4);
break;
}
}
//处理完成后,恢复保护类型:
DWORD dwProctect=NULL;
VirtualProtect(_base.BaseAddress,_base.RegionSize,_base.Protect,&dwProctect);
}
//fuckdll.h
#ifdef FUCKDLL_EXPORTS
#define FUCKDLL_API __declspec(dllexport)
#else
#define FUCKDLL_API __declspec(dllimport)
#endif
FUCKDLL_API void InitRegClass();
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
不错。。。。很有参考价值啊!!
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
新手看不懂,不过顶了,系统知识太强了,希望有天我会懂,顶了先
|
能力值:
( LV8,RANK:130 )
|
-
-
21 楼
楼主做的是奇迹外挂吧??
如果方便,我想要一份来研究下。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
顶一下先,,
每次看楼主的帖子都能有新的收获。。
十分感谢!谢谢!向你致敬
|