年末系列(2)-加速器
来源:互联网 发布:国内网络存储厂商排名 编辑:程序博客网 时间:2024/05/03 16:59
转: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 0x7FFE0000ULONG 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_CVOID 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_CNTSTATUSMainDriverEntry( 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_CvoidUnLoad( __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;}
0 0
- 年末系列(2)-加速器
- 年末发点代码系列(1)
- 14 - Docker加速器(Docker系列)
- 年末(2015)-开篇
- 年末总结(androidbug)
- 年末
- 年末
- 年末裁员事件背后的启示录(2)
- accelerator(加速器)
- 加速器
- 加速器
- 关于网游的那点事儿 ---- 年末网游企业裁员事件背后的启示录(2)
- 2005年度年末随笔(上)
- 2005年度年末随笔(下)
- 2005年度年末随笔(上)
- 14年末留下点东东(补记)
- php缓存(加速器) APC 和 eAccelerator
- 年末裁员事件背后的启示录(1)
- mac系统升级到10.12后homebrew不能正常使用的问题
- 个人网站怎么备案?
- 几个易混淆概念(2)
- 年末发点代码系列(1)
- myeclipse 删除项目后记得删除tomcat部署目录下的项目信息。D:\Java\apache-tomcat-6.0.43\webapps
- 年末系列(2)-加速器
- jenkins 构建触发器 区别
- 中部公立大水校ECE研究生生活流水....
- 读书笔记之 大型网站技术架构(核心原理与案例分析)
- 205. Isomorphic Strings
- Struts2-结果和结果类型
- APP换量那些事儿,你造吗?(换量合作的形式,方法以及注意事项)
- PAT甲级1023
- 结构体与结构体变量