年末系列(2)-加速器

转:http://bbs.pediy.com/showthread.php?t=214926


重要的事情说三遍,
加速器,加速器,加速器

大部分代码因为硬盘没了,剩下核心功能代码还在,还可以看看仅作参考啦

无需任何hook,不卡HAL时钟,不会导致硬盘io锁死问题。
不需要DX初始化来让系统时钟重置。
支持x64(代码只支持win7x64——需要签名!!
支持更多系统需要把PFN的数据结构改成对应的系统的)

加速原理:
PTE篡改PFN+MmPfn加锁Lock PFN,然后系统线程里自己同步刷新进程时钟...
除了可以加速之外还可以锁时间(年月日)
老司机开车 代码讨论与各种扯淡的QQ群:48715131 


#include "stdafx.h"
#include "PageHack.h"
//////////////////////////////////////////////////////////////////////////
#include <list>
#include <algorithm>
std::list <PEPROCESS> m_Process_Speed;
//////////////////////////////////////////////////////////////////////////
LONG g_ThreadLock = 0;
BOOL b_Stop = FALSE;
PVOID pBuffer = NULL;
PVOID pKiUserSharedData = NULL;
FAST_MUTEX g_Process_Lock;
//////////////////////////////////////////////////////////////////////////
#define KUSER_SHARED_DATA_RING0 0xFFFFF78000000000UI64
#define KUSER_SHARED_DATA_RING3 0x7FFE0000
ULONG   TickCountMultiplierOffset = 0x04;
ULONG   TickCountLowOffset = 0x00;
ULONG   TickCountLow320Offset = 0x320;
ULONG   TickCountHigh1TimeOffset = 0x324;
ULONG   TickCountHigh2TimeOffset = 0x328;
ULONG   PerformanceCounterOffset = 0x3B8;
ULONG   PerformanceCounterFlagOffset = 0x2ED;
//////////////////////////////////////////////////////////////////////////
EXTERN_C VOID  TimeUpdate(__in PVOID  StartContext)
{
  ULONGLONG OldTickCount = 0;
  ULONGLONG OldPerformanceCounter = 0;
  //PVOID pKiUserSharedData = NULL;
  auto speed = 5;
  //pKiUserSharedData = StartContext;
  KeLowerIrql(PASSIVE_LEVEL);
  while (!b_Stop)
  {
    ULONGLONG NowTickCount = 0;
    InterlockedIncrement(&g_ThreadLock);
    Sleep(1);
    if (!MmIsAddressValid(pKiUserSharedData))
    {
      return;
    }
    __try
    {
      memcpy(pKiUserSharedData, (PVOID)KUSER_SHARED_DATA_RING0, sizeof(KUSER_SHARED_DATA));
      auto pTickCountMultiplier = (PULONG)((ULONG_PTR)pKiUserSharedData + TickCountMultiplierOffset);
      //auto pTickCountLow = (PULONG)((ULONG_PTR)pKiUserSharedData + TickCountLowOffset);
      auto pTickCountLow320 = (PULONGLONG)((ULONG_PTR)pKiUserSharedData + TickCountLow320Offset);
      auto pFlags = (PBYTE)((ULONG_PTR)pKiUserSharedData + PerformanceCounterFlagOffset);
      auto pPerformanceCounter = (PULONGLONG)((ULONG_PTR)pKiUserSharedData + PerformanceCounterOffset);
      auto Mutil = (ULONGLONG)(*pTickCountMultiplier);
      auto NowPerformanceCounter = *pPerformanceCounter;

      //这里有个问题不能主动设置Flag,So 还需要hook NtQueryPerformanceCounter才行!
      //如果主动flag|=1的话,会爆炸..
      // (*pFlags)
      if (*pFlags & 1)
      {

        if (OldPerformanceCounter == 0)
        {
          OldPerformanceCounter = NowPerformanceCounter;
        }
        auto pfix = NowPerformanceCounter - OldPerformanceCounter;
        if (NowPerformanceCounter < OldPerformanceCounter)
        {
          pfix = 0;
          OldPerformanceCounter = NowPerformanceCounter;
        }
        if (pfix != 0)
        {
          *pPerformanceCounter = NowPerformanceCounter;// +pfix * speed;//2倍速加速PerformanceCount!!
        }
      }

      NowTickCount = (*pTickCountLow320) * Mutil;
      if (OldTickCount == 0)
      {
        OldTickCount = NowTickCount;
      }
      auto delta = NowTickCount - OldTickCount;
      if (OldTickCount > NowTickCount)
      {
        OldTickCount = NowTickCount;
        delta = 0;
      }
      if (delta != 0)
      {
        *pTickCountLow320 = ((OldTickCount + delta*speed + Mutil) / Mutil);
      }
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {

    }
    InterlockedDecrement(&g_ThreadLock);
  }
}
//////////////////////////////////////////////////////////////////////////
VOID LoadTLB()
{
  __try
  {
    auto Load = *(PULONG *)KUSER_SHARED_DATA_RING3;
    DbgPrint("TLB CMD %d\r\n", Load);
  }
  __except (EXCEPTION_EXECUTE_HANDLER)
  {
    return;
  }
}
VOID ModifyTLB(PHYSICAL_ADDRESS phys)
{
  __try
  {
    auto Pte = MiGetPteAddress((PVOID)KUSER_SHARED_DATA_RING3);

    Pte->PageFrameNumber = phys.QuadPart >> 12;

    _ReadWriteBarrier();

    __invlpg((PVOID)KUSER_SHARED_DATA_RING3);
  }
  __except (EXCEPTION_EXECUTE_HANDLER)
  {

  }
}
//////////////////////////////////////////////////////////////////////////
_Use_decl_annotations_
EXTERN_C
VOID CreateProcessNotifyRoutine(__in HANDLE ParentId, __in HANDLE ProcessId, __in BOOLEAN Create)
{
  PEPROCESS Process = NULL;
  auto ns = PsLookupProcessByProcessId(ProcessId, &Process);
  if (NT_SUCCESS(ns))
  {
    auto scop = std::experimental::make_scope_exit([&]() {ObDereferenceObject(Process); });

    CHAR szName[17];
    RtlZeroMemory(szName, 17);
    RtlCopyMemory(szName, PsGetProcessImageFileName(Process), 16);
    _strlwr(szName);
    if (strstr(szName, "fifa16.exe") == NULL)
    {
      return;
    }

    if (Create)
    {
      ObReferenceObject(Process);
      ExAcquireFastMutex(&g_Process_Lock);
      m_Process_Speed.push_back(Process);
      ExReleaseFastMutex(&g_Process_Lock);
    }
    else
    {
      ExAcquireFastMutex(&g_Process_Lock);
      std::remove_if(m_Process_Speed.begin(), m_Process_Speed.end(), [&](PEPROCESS Cur) {return Process == Cur; });
      ExReleaseFastMutex(&g_Process_Lock);
    }
    PHYSICAL_ADDRESS phys;
    KAPC_STATE ApcState;
    KeStackAttachProcess(Process, &ApcState);
    auto scop2 = std::experimental::make_scope_exit([&]() {KeUnstackDetachProcess(&ApcState); });
    if (Create)
    {
      memcpy(pKiUserSharedData, (PVOID)KUSER_SHARED_DATA_RING0, 0x1000);
      phys = MmGetPhysicalAddress(pKiUserSharedData);
      
    }
    else
    {
      phys = MmGetPhysicalAddress((PVOID)KUSER_SHARED_DATA_RING0);
    }
    LoadTLB();
    ModifyTLB(phys);
    if (Create)
    {
      //修改PFN
      //处理WorkingSet蓝屏问题
      auto MmPfnDataBase = reinterpret_cast<PMMPFN>(PVOID(PFN_DATA_BASE));
      auto Pte = MiGetPteAddress((PVOID)KUSER_SHARED_DATA_RING3);
      auto PageFrameIndex = Pte->PageFrameNumber;
      auto Pfn1 = &MmPfnDataBase[PageFrameIndex];
      Pfn1->u3.e2.ReferenceCount = 2;
      Pfn1->u2.ShareCount = 2;
      Pfn1->u4.PrototypePte = 0;
    }
    return;
  }
  return;

}
//////////////////////////////////////////////////////////////////////////
_Use_decl_annotations_
EXTERN_C
NTSTATUS
MainDriverEntry(
  IN PDRIVER_OBJECT DriverObject,
  IN PUNICODE_STRING RegistryPath)
{
  UNREFERENCED_PARAMETER(RegistryPath);
  InitExtendApi();
  ExInitializeFastMutex(&g_Process_Lock);
  {
    wchar_t fname[MAX_PATH];
    UNICODE_STRING u_fname;
    TIME_FIELDS tf;
    LARGE_INTEGER time;
    LARGE_INTEGER offset;

    KeQuerySystemTime(&time);
    RtlTimeToTimeFields(&time, &tf);

    RtlStringCchPrintfW(fname, MAX_PATH, L"\\??\\Global\\C:\\$%d-%.2d-%.2d", tf.Year, tf.Month, tf.Day);
    RtlInitUnicodeString(&u_fname, fname);
  }
  //auto ns = InitMapPage(&MapForTime);
  pBuffer = ExAllocatePoolWithTag(NonPagedPool, 0x4000, 0);
  pKiUserSharedData = (PVOID)(((ULONG_PTR)pBuffer + 0xFFF) & ~0xFFF);
  //if (NT_SUCCESS(ns))
  {
    //开始搞起
  //  auto scop = std::experimental::make_scope_exit([&]() { FiniMapPage(&MapForTime); });

    auto ns = PsSetCreateProcessNotifyRoutine(CreateProcessNotifyRoutine, FALSE);

    if (!NT_SUCCESS(ns))
    {
      return ns;
    }

    if (pKiUserSharedData)
      CreateThread(TimeUpdate, pKiUserSharedData);
    /*  auto scop2 = std::experimental::make_scope_exit([&]() { PsSetCreateProcessNotifyRoutine(CreateProcessNotifyRoutine, TRUE); });
      if (!CreateThread(TimeUpdate, NULL))
      {
        return STATUS_UNSUCCESSFUL;
      }
      scop2.release();*/
      //  scop.release();
    DriverObject->DriverUnload = NULL;
    return ns;
  }
  return STATUS_UNSUCCESSFUL;
}

_Use_decl_annotations_
EXTERN_C
void
UnLoad(
  __in PDRIVER_OBJECT driverObject
  )
{

  UNREFERENCED_PARAMETER(driverObject);
  DbgPrint("DrvUnLoad");
  //b_Stop = TRUE;
  //while (g_ThreadLock != 0) _mm_pause();
  //PsSetCreateProcessNotifyRoutine(CreateProcessNotifyRoutine, TRUE);
  //ExAcquireFastMutex(&g_Process_Lock);
  //for (auto x:m_Process_Speed)
  //{
  //  KAPC_STATE Apc;
  //  KeStackAttachProcess(x,&Apc);
  //  ZwTerminateProcess()
  //  KeUnstackDetachProcess(&Apc);
  //}
  //ExReleaseFastMutex(&g_Process_Lock);
  //FiniMapPage(&MapForTime);
  //ExFreePool(pBuffer);
  //UnloadInlineHookEngine();
  //LogTermination();
  return;
}


绝地求生:易语言 全套加速器源码【更新日期:2018年1月10日】 使用说明: 用FTP将后台文件用二进制上传到网站根目录后安装网站 安装好后登陆后台添加产品 然后把激活码输入都源码里,产品ID,通信秘钥在后台添加产品后获取,并输入 然后搜索HTTP 把所有HTTP网址改成自己的域名即可 后台设置公告(重要)不设置会导致软件无法启动 格式为 公告内容||网址 添加游戏: 在M文件夹中 route就是存放游戏路由表的地方 打开 1||英雄联盟||http://域名/m/route/yxlm.txt||http://域名/m/route/1.png||0 序号||游戏名称||游戏路由表地址||游戏LOGO地址||后面的0代表国内游戏,1则为国外游戏 路由表格式参考:add 1.207.140.0 mask 255.255.255.0 IP METRIC default IF IFZ add 14.17.12.0 mask 255.255.255.0 IP METRIC default IF IFZ add 14.17.13.0 mask 255.255.255.0 IP METRIC default IF IFZ add 14.17.14.0 mask 255.255.255.0 IP METRIC default IF IFZ 线路添加:网游加速的线路分别存放在这两个文件里面 国内跟国外,格式为 线路名称||IP||用户名||密码 网络加速则存放在 编写好节点文档后,采用附赠的加密工具加密后上传到网站根目录即可 充值系统 注:后台必须把充值卡位数改成10位以内,太多字符会导致充值出错! 1.首先打开注册个账号http://www.1ka123.com/dashboard/index 2.打开雷盾的后台 获取客户ID 3.地址 高级=》在线售卡 4. 这里写上客户ID 然后点编辑 刷新 5.获取提卡数据 6.在易卡上面 找到商品/分类的商品列表 点编辑 7.平台对接写雷盾 对接密匙 写提卡数据 然后点保存这样子就可以实现无卡的时候自动补卡了 软件对接: 打开源码目录下的扫码支付模块 按下列格式写入你的卡类信息 比如我这里增加月卡 修改完即可收款实现自动充值
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值