天马阁

 找回密码
 立即注册
                                        →→→→→→→→→→→→ 1点击查看所有VIP教程目录长列表(总教程数269个) 2办理VIP详情进入 ←←←←←←←←←←←←
1 x64CE与x64dbg入门基础教程 7课 已完结 2 x64汇编语言基础教程 16课 已完结 3 x64辅助入门基础教程 9课 已完结 4 C++x64内存辅助实战技术教程 149课 已完结
5 C++x64内存检测与过检测技术教程 10课 已完结 6 C+x64二叉树分析遍历与LUA自动登陆教程 19课已完结 7 C++BT功能原理与x64实战教程 29课 已完结 8 C+FPS框透视与自瞄x64实现原理及防护思路 30课完结
64驱?封? 9 64反驱? 10 64位V? 11 绝? 12 ???课?
13 64透 ? 14 64U ? 15 64Q ? 16 64功 ?
17 64U ? 18 64模 ? 19 64多 ? 20 64网 ?
21 64注 ? 22 64火 ? 23 64棋 ? 24 64自二链L?
25 64破 ? 26 64 ? 27 加入2000人交流群637034024 3 28 免责声明?
查看: 1014|回复: 0

ring3反作弊篇——基于EBP遍历调用栈及模块名

[复制链接]

8

主题

0

回帖

12

积分

编程入门

Rank: 1

天马币
36
发表于 2024-3-4 09:30:41 | 显示全部楼层 |阅读模式
之前自己做的一款老游戏的基于R3入门级的反作弊代码中的片段,仅供学习参考~~

通杀Win XP/7/8,哪位兄弟装了WIN10麻烦测试一下谢谢!

//
// CallStackList.cpp : 定义控制台应用程序的入口点。
//
// thanks for NV.
//

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>

#include "EasyDetour.h"

#include <TlHelp32.h>
#include <sapi.h>
#pragma comment(lib,"psapi.lib")

typedef int (WINAPI *fnMessageBoxA)(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);

fnMessageBoxA  pMessageBoxA = NULL;

DWORD Functiion(DWORD x, DWORD y);


//
// 提取函数
//
BOOL TiQuan()
{
  HANDLE  hToken;
  BOOL  fOk = FALSE;

  if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
  {
    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount=1;
    if(!LookupPrivilegeValueA(NULL,"SeDebugPrivilege",&tp.Privileges[0].Luid))
      Sleep(1);

    tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    if(!AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL))
      Sleep(1);

    fOk = (GetLastError() == ERROR_SUCCESS);
    CloseHandle(hToken);
  }

  return fOk;
}

//
// 获取PE文件大小
//
DWORD GetPEImageSize(HMODULE hModule)
{
  PBYTE pInfo = (PBYTE)hModule;
  PIMAGE_DOS_HEADER pImgDos = (PIMAGE_DOS_HEADER)pInfo;
  PIMAGE_NT_HEADERS pImgNt;
  if(pImgDos->e_magic==IMAGE_DOS_SIGNATURE)
  {
    pImgNt = (PIMAGE_NT_HEADERS)&pInfo[pImgDos->e_lfanew];
    if(pImgNt)
    {
      if(pImgNt->Signature==IMAGE_NT_SIGNATURE)
      {
        return pImgNt->OptionalHeader.SizeOfImage;
      }
    }
  }
  return NULL;
}

//
// Hook MessageBox for test
//
BOOL WINAPI GetCheatModuleByEBP(DWORD nEBP,char *pszPath,int nLen)
{
  TiQuan();
  if(nEBP == 0)
    return FALSE;

  DWORD  nPEB = nEBP;
  BOOL  bFound = FALSE;
  HMODULE hMods[1024] = {0};
  DWORD  cbNeeded = 0;
  char  szModName[MAX_PATH];

  HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_QUERY_LIMITED_INFORMATION, FALSE, GetCurrentProcessId());
  //IsWow64Process(hProcess, &Wow64Process); //判断是32位还是64位进程
  EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded);

  nPEB = nEBP;
  for (UINT i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ )
  {
    GetModuleFileNameExA(hProcess, hMods, szModName, _countof(szModName));
    if(hMods)
    {
      if(nPEB >= (DWORD)hMods && (nPEB <= ((DWORD)hMods + GetPEImageSize(hMods))))
      {
        memset(pszPath,0x00,nLen);
        wsprintfA(pszPath,"%s",szModName);
        bFound = TRUE;
        break;
      }
    }
  }

  CloseHandle(hProcess);
  return bFound;
}

//
// Hook MessageBox for test
//
int WINAPI newMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
{
  Functiion(0,0);
  return pMessageBoxA(hWnd,lpText,lpCaption,uType);
}

//
// 回调函数
//
DWORD BackCall(DWORD Address)
{
  char  szDllPath[MAX_PATH] = {0x00};
  if(GetCheatModuleByEBP(Address,szDllPath,MAX_PATH))
    printf("检测地址:0x%08x  %s\n", Address, szDllPath);
  else
    printf("检测地址:0x%08x  未知模块\n", Address, szDllPath);

  //
  // 在这里添加白名单 黑名单匹配的代码 (黑名单返回1 白名单返回0)
  //

  return 0;
}

//
// 检测呼叫者调用连
//
BOOL __declspec(naked)  Check(void)
{
  __asm push ebp;
  __asm mov ebp, esp;
  __asm sub esp, 0x8;

  __asm push edi;
  __asm push ecx;

  //
  // 查询次数
  __asm mov ecx, dword ptr[ebp + 0x8];

  //
  // 设置堆栈指针
  __asm mov edi, dword ptr[ebp];

__Loop:

  //
  // 保存当前堆栈的返回地址 也就是呼叫这个函数的上一层函数的内存空间
  __asm mov eax, dword ptr[edi + 0x4];

  //
  // 调用匹配规则函数
  __asm push eax;
  __asm call dword ptr[ebp + 0xc];
  __asm add esp, 0x4;
  
  //
  // 获取上一个堆栈的指针
  __asm mov edi, dword ptr[edi];

  __asm cmp eax, 0x1;
  __asm je __Out;

  //
  // 如果已经为空了 则直接退出
  
  __asm cmp edi, 0x0;
  __asm je __Out;

  __asm loop __Loop;

__Out:

  __asm pop ecx;
  __asm pop edi;
  __asm add esp, 0x8;
  __asm pop ebp;
  __asm ret;
}



//
// 测试函数
//
DWORD Functiion(DWORD x, DWORD y)
{

  //
  // 设置回调函数
  __asm mov edx, dword ptr[BackCall];
  __asm push edx;

  //
  // 设置最大检测深度
  __asm push 0x50;
  __asm call dword ptr[Check];
  __asm add esp, 0x8;

  return x + y;
}

// 这里是测试函数
DWORD Function(DWORD x,DWORD y)
{
  //x += y;
  __asm mov edx,dword ptr[x];
  __asm add edx,0x10;        // 深度检测10个
  __asm mov dword ptr[x],edx;
  return x;
}

int MsgBox()
{
  return MessageBoxA(NULL,"Hello World by Koma !","Test",MB_OK);
}

int _tmain(int argc, _TCHAR* argv[])
{
  pMessageBoxA = MessageBoxA;
  DetourHook((void**)&pMessageBoxA,newMessageBoxA);
  MsgBox();
  while(getchar() != 'a')
    Sleep(0);
  DetourUnHook((void**)&pMessageBoxA,newMessageBoxA);
  return 0;
}


[url=http://www.70pv.com/]传奇sf一条龙服务端[/url]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

天马阁|C/C++辅助教程|安卓逆向安全| 论坛导航|免责申明|Archiver||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表天马阁立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2021 All Right Reserved.
快速回复 返回顶部 返回列表