




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——過驅(qū)動保護(hù)之TesSafe(讀寫內(nèi)存OD能附加下硬件斷點)
過驅(qū)動保護(hù)之TesSafe.sys對抗(過了后能讀寫內(nèi)存OD能附加下硬件斷點)
學(xué)習(xí)各種外掛制作技術(shù),馬上去百度探尋\魔鬼作坊\點擊第一個站進(jìn)入、快速成為做掛達(dá)人。
由于我的C用的比較少,所以大部分都用的匯編,部分地方用匯編寫不是很便利,所以我用的C,由于只是學(xué)習(xí),所以內(nèi)核地址我沒有計算都是硬編碼的。過DNF主要分為三步,可能我的思路不太正確,反正可以O(shè)D調(diào)試,下斷。
程序沒怎么修邊幅,由于只是測試,所以一般都沒有寫更改內(nèi)核后的恢復(fù),不過不阻礙使用。
附加不了就是KiAttachProcess沒恢復(fù)。附加之后什么都沒有就是debugport被清零。
第一步,這也是最起碼的,你必需要能夠開啟游戲進(jìn)程和線程,能夠開打進(jìn)程和線程后不被檢測到
其次步,能夠讀寫進(jìn)村內(nèi)存
第三步,能夠用OD附加游戲進(jìn)程第四步,能夠下硬件斷點而不被檢測
在NtReadVirtualMemory,NtWriteVirtualMemory函數(shù)頭處有如下HOOK
moveax,TesSafeproc_Addrjmpeax
上述2條指令占8字節(jié)
跳過NtReadVirtualMemory,NtWriteVirtualMemory函數(shù)頭的鉤子
代碼:
#include
typedefstruct_SERVICE_DESCRIPTOR_TABLE{
PVOIDServiceTableBase;
PULONGServiceCounterTableBase;ULONGNumberOfService;ULONGParamTableBase;
}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE;//由于KeServiceDescriptorTable只有一項,這里就簡單點了ExternPSERVICE_DESCRIPTOR_TABLEKeServiceDescriptorTable;//KeServiceDescriptorTable為導(dǎo)出函數(shù)/////////////////////////////////////VOIDHook();VOIDUnhook();
VOIDOnUnload(INPDRIVER_OBJECTDriverObject);//////////////////////////////////////
ULONGJmpAddress;//跳轉(zhuǎn)到NtOpenProcess里的地址ULONGJmpAddress1;//跳轉(zhuǎn)到NtOpenProcess里的地址
ULONGOldServiceAddress;//原來NtOpenProcess的服務(wù)地址ULONGOldServiceAddress1;//原來NtOpenProcess的服務(wù)地址//////////////////////////////////////
__declspec(naked)NTSTATUS__stdcallMyNtReadVirtualMemory(HANDLEProcessHandle,PVOIDBaseAddress,PVOIDBuffer,
ULONGNumberOfBytesToRead,PULONGNumberOfBytesReaded){
//跳過去__asm{
push0x1c
push804eb560h//共十個字節(jié)jmp[JmpAddress]}}
__declspec(naked)NTSTATUS__stdcallMyNtWriteVirtualMemory(HANDLEProcessHandle,PVOIDBaseAddress,PVOIDBuffer,
ULONGNumberOfBytesToWrite,PULONGNumberOfBytesReaded){
//跳過去__asm{
push0x1c
push804eb560h//共十個字節(jié)jmp[JmpAddress1]}}
///////////////////////////////////////////////////NTSTATUSDriverEntry(INPDRIVER_OBJECTDriverObject,PUNICODE_STRINGRegistryPath){
DriverObject->DriverUnload=OnUnload;DbgPrint(\Hook();
returnSTATUS_SUCCESS;}
/////////////////////////////////////////////////////
VOIDOnUnload(INPDRIVER_OBJECTDriverObject)
{
DbgPrint(\Unhook();}
/////////////////////////////////////////////////////VOIDHook(){
ULONGAddress,Address1;
Address=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0xBA*4;//0x7A為NtOpenProcess服務(wù)ID
Address1=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0x115*4;//0x7A為NtOpenProcess服務(wù)ID
DbgPrint(\
OldServiceAddress=*(ULONG*)Address;//保存原來NtOpenProcess的地址OldServiceAddress1=*(ULONG*)Address1;//保存原來NtOpenProcess的地址DbgPrint(\DbgPrint(\DbgPrint(\DbgPrint(\
JmpAddress=(ULONG)0x805b528a+7;//跳轉(zhuǎn)到NtOpenProcess函數(shù)頭+10的地方,這樣在其前面寫的JMP都失效了
JmpAddress1=(ULONG)0x805b5394+7;DbgPrint(\DbgPrint(\__asm
{//去掉內(nèi)存保護(hù)cli
moveax,cr0andeax,not10000hmovcr0,eax}
*((ULONG*)Address)=(ULONG)MyNtReadVirtualMemory;//HOOKSSDT*((ULONG*)Address1)=(ULONG)MyNtWriteVirtualMemory;__asm
{//恢復(fù)內(nèi)存保護(hù)moveax,cr0oreax,10000hmovcr0,eaxsti}}
//////////////////////////////////////////////////////VOIDUnhook()
{
ULONGAddress,Address1;
Address=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0xBA*4;//查找SSDTAddress1=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0x115*4;__asm{cli
moveax,cr0andeax,not10000hmovcr0,eax}
*((ULONG*)Address)=(ULONG)OldServiceAddress;//還原SSDT*((ULONG*)Address1)=(ULONG)OldServiceAddress1;//還原SSDT__asm{
moveax,cr0oreax,10000hmovcr0,eaxsti}
DbgPrint(\}
由于它不斷對DebugPort清零,所以要修改調(diào)試相關(guān)函數(shù),使得所有的訪問DebugPort的地方全部訪問EPROCESS中的
ExitTime字節(jié),這樣它怎么清零都無效了,也檢測不到代碼:.386
.modelflat,stdcalloptioncasemap:noneincludednf_hook.inc.c*****t
Dspdo_1equ80643db6hDmpp_1equ80642d5ehDmpp_2equ80642d64hDct_1equ806445d3hDqm_1equ80643089hKde_1equ804ff5fdhDfe_1equ80644340hPcp_1equ805d1a0dhMcp_1equ805b0c06hMcp_2equ805b0d7fhDmvos_1equ8064497fhDumvos_1equ80644a45hPet_1equ805d32f8hDet_1equ8064486ch
Dep_1equ806448e6h.code
;還原自己的Hook
DriverUnloadprocpDriverObject:PDRIVER_OBJECTret
DriverUnloadendp
ModifyFuncAboutDbgprocaddrOdFunc,cmd_1,cmd_2pushad
movebx,addrOdFuncmoveax,cmd_1
movDWORDptr[ebx],eaxmoveax,cmd_2
movDWORDptr[ebx+4],eaxpopadret
ModifyFuncAboutDbgendp
DriverEntryprocpDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRINGcli
moveax,cr0
andeax,not10000hmovcr0,eax
invokeModifyFuncAboutDbg,Dspdo_1,90784789h,0fde89090hinvokeModifyFuncAboutDbg,Dmpp_1,90787e39h,950f9090hinvokeModifyFuncAboutDbg,Dct_1,90785e39h,840f9090hinvokeModifyFuncAboutDbg,Dqm_1,9078408bh,45899090hinvokeModifyFuncAboutDbg,Kde_1,90787839h,13749090hinvokeModifyFuncAboutDbg,Dfe_1,9078418bh,0d2329090hinvokeModifyFuncAboutDbg,Pcp_1,90784389h,45f69090hinvokeModifyFuncAboutDbg,Mcp_1,90785e39h,950f9090hinvokeModifyFuncAboutDbg,Mcp_2,90784a89h,5e399090hinvokeModifyFuncAboutDbg,Dmvos_1,9078498bh,0cb3b9090hinvokeModifyFuncAboutDbg,Dumvos_1,00787983h,74909090hinvokeModifyFuncAboutDbg,Pet_1,00787f83h,74909090hinvokeModifyFuncAboutDbg,Det_1,9078498bh,0c9859090hinvokeModifyFuncAboutDbg,Dep_1,9078498bh,0c9859090h;invokeModifyFuncAboutDbg,Dmpp_2,8bc0950fh,8b90c032h
moveax,pDriverObject
assumeeax:ptrDRIVER_OBJECT
mov[eax].DriverUnload,offsetDriverUnloadassumeeax:nothing
moveax,cr0
oreax,10000hmovcr0,eaxsti
moveax,STATUS_SUCCESSret
DriverEntryendpendDriverEntry
繞過NtOpenProcess,NtOpenThread,KiAttachProcess
以及最重要的,不能讓它檢測到有硬件斷點,所以要對CONTEXT做一些偽裝,把真實的DR0~DR7的數(shù)據(jù)存放到別的地方,
OD訪問的時候返回正確的數(shù)據(jù),假使是DNF要獲取上下文,就稍微做下手腳代碼:.386
.modelflat,stdcalloptioncasemap:noneincludednf_hook.inc.c*****t
NtOpenProcessHookAddrequ805cc626hNtOpenProcessRetAddrequ805cc631hNtOpenProcessNoChangeequ805cc62chNtOpenThreadHookAddrequ805cc8a8hNtOpenThreadRetAddrequ805cc8b3hNtOpenThreadNoChangeequ805cc8aehKiAttachProcessAddrequ804f9a08hKiAttachProcessRetAddrequ804f9a0fh
ObOpenObjectByPointerAddrequ805bcc78h
NtGetContextThreadAddrequ805d2551h;805c76a3hNtGetContextThreadRetAddrequ805c76a7h;805d2555h.data
nameOffsetdd?threadCxtLinkdd0tmpLinkdd?.code
GetProcessNameproc
invokePsGetCurrentProcessmovebx,eax
addebx,nameOffset
invokeDbgPrint,$CTA0(\pushebx
invokeDbgPrint,ebxpopebx
invokestrncmp,$CTA0(\
pusheax
invokeDbgPrint,$CTA0(\popeaxret
GetProcessNameendpHookCodeproc;執(zhí)行被覆蓋的代碼
pushdwordptr[ebp-38h]pushdwordptr[ebp-24h];判斷是否dnf的進(jìn)程invokeGetProcessName
.if!eax;假使是DNF自己的進(jìn)程,那么跳轉(zhuǎn)回去執(zhí)行它的Hook代碼pushad
invokeDbgPrint,$CTA0(\popad
moveax,NtOpenProcessNoChange;805c13e6hjmpeax
.else;假使不是DNF自己的進(jìn)程,那么直接調(diào)用ObOpenObjectByPointer,再返回到后面pushad
invokeDbgPrint,$CTA0(\popad
moveax,ObOpenObjectByPointerAddr;805b13f0hcalleax
movebx,NtOpenProcessRetAddr;805c13ebhjmpebx.endif
HookCodeendp;獲取系統(tǒng)名稱偏移GetNameOffsetprocepelocaltmpOffsetpushad
movebx,epe
invokestrlen,$CTA0(\xorecx,ecx@@:pusheaxpushecx
invokestrncmp,$CTA0(\popecx.if!eax
popeax
movtmpOffset,ecxpopad
moveax,tmpOffset
ret.elseif
popeaxincebxincecx
cmpecx,4096je@Fjmp@B.endif@@:popad
moveax,-1ret
GetNameOffsetendpHookprocpushad
;頭5字節(jié)跳轉(zhuǎn)
moveax,offsetHookCode
subeax,NtOpenProcessHookAddr;805c13e0h;805c13edhsubeax,5
movebx,NtOpenProcessHookAddr;805c13e0h;805c13edhmovcl,0E9h
movBYTEPTR[ebx],cl
movDWORDPTR[ebx+1],eaxpopadret
Hookendp
HookThreadCodeproc;執(zhí)行被覆蓋的代碼
pushdwordptr[ebp-34h]pushdwordptr[ebp-20h];判斷是否dnf的進(jìn)程invokeGetProcessName
.if!eax;假使是DNF自己的進(jìn)程,那么跳轉(zhuǎn)回去執(zhí)行它的Hook代碼pushad
invokeDbgPrint,$CTA0(\popad
moveax,NtOpenThreadNoChange;805c13e6hjmpeax
.else;假使不是DNF自己的進(jìn)程,那么直接調(diào)用ObOpenObjectByPointer,再返回到后面pushad
invokeDbgPrint,$CTA0(\popad
moveax,ObOpenObjectByPointerAddr;805b13f0h
calleax
movebx,NtOpenThreadRetAddr;805c13ebhjmpebx.endif
HookThreadCodeendpHookThreadprocpushad
;頭5字節(jié)跳轉(zhuǎn)
moveax,offsetHookThreadCode
subeax,NtOpenThreadHookAddr;805c13e0h;805c13edhsubeax,5
movebx,NtOpenThreadHookAddr;805c13e0h;805c13edhmovcl,0E9h
movBYTEPTR[ebx],cl
movDWORDPTR[ebx+1],eaxpopadret
HookThreadendpHookDbgprocmovedi,edipushebp
movebp,esppushebxpushesi
movesi,KiAttachProcessRetAddrjmpesi
HookDbgendpDbgprocpushad
;頭5字節(jié)跳轉(zhuǎn)
moveax,offsetHookDbg
subeax,KiAttachProcessAddr;805c13e0h;805c13edhsubeax,5
movebx,KiAttachProcessAddr;805c13e0h;805c13edhmovcl,0E9h
movBYTEPTR[ebx],cl
movDWORDPTR[ebx+1],eaxpopadret
Dbgendp
;還原自己的Hook
DriverUnloadprocpDriverObject:PDRIVER_OBJECTcli
moveax,cr0
andeax,not10000hmovcr0,eax;還原進(jìn)程處理moveax,0ffc875ffhmovebx,805cc656h
movDWORDptr[ebx],eaxmoveax,43e8dc75h
movDWORDptr[ebx+4],eax;還原線程處理moveax,0ffcc75ffhmovebx,805cc8d8h
movDWORDptr[ebx],eaxmoveax,0c1e8e075h
movDWORDptr[ebx+4],eax;還原調(diào)試處理
moveax,08b55ff8bhmovebx,804f9a08h
movDWORDptr[ebx],eaxmoveax,08b5653ech
movDWORDptr[ebx+4],eaxmoveax,cr0
oreax,10000hmovcr0,eaxstiret
DriverUnloadendp
;顯示LinkTable的信息
ShowLinkTableInfoprocptrLTpushad
invokeDbgPrint,$CTA0(\
movebx,ptrLT
moveax,(LinkTableptr[ebx]).ThreadHandle
invokeDbgPrint,$CTA0(\
movebx,ptrLT
moveax,(LinkTableptr[ebx]).Dr0Seg
invokeDbgPrint,$CTA0(\
movebx,ptrLT
moveax,(LinkTableptr[ebx]).Dr1Seg
invokeDbgPrint,$CTA0(\
popad
invokeShowDrRegInfo,ptrContextpopadret
ClearDrRegendp
;NtGetContextThread鉤子代碼NtGetContextThreadHookCodeproc;ebx存放CONTEXT指針
movebx,DWORDptr[ebp+10h];線程句柄
movedx,DWORDptr[ebp+0ch]pushad
invokeShowDrRegInfo,ebxinvokeIsFilterProcess.ifeax;假使是DNF.exe
invokeAddLinkTable,edx,ebxinvokeClearDrReg,ebx.else;假使不是DNF.exe
invokeRecoveryDrReg,ebx,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 墻壁式電纜接頭盒行業(yè)深度研究報告
- 環(huán)境監(jiān)測采樣員工作總結(jié)報告7
- 中國旱冰鞋行業(yè)發(fā)展前景預(yù)測及投資戰(zhàn)略研究報告
- 2025年度砍伐合同范文:林業(yè)砍伐與水資源保護(hù)協(xié)議
- 2025年度企業(yè)員工解除勞動合同補(bǔ)償及后續(xù)服務(wù)協(xié)議
- 二零二五年度創(chuàng)業(yè)投資公司股權(quán)轉(zhuǎn)讓協(xié)議范本
- 2021-2026年中國女式職業(yè)襯衫行業(yè)調(diào)查研究及投資戰(zhàn)略規(guī)劃研究報告
- 2025年度商鋪投資退出協(xié)議書
- 二零二五年度社保補(bǔ)償項目監(jiān)理及驗收協(xié)議
- 2025年度智慧城市運營解除聘用協(xié)議書
- 全腦血管造影術(shù)的護(hù)理查房
- 學(xué)習(xí)弘揚紅船精神課件
- 消防工程施工組織設(shè)計方案
- 敦刻爾克大撤退課件
- 農(nóng)藥殘留監(jiān)測
- 新生兒敗血癥(共22張課件)
- 頌缽療愈師培訓(xùn)
- 2025蛇年春節(jié)習(xí)俗大賞體驗感受家的溫馨課件
- 投資居間協(xié)議合同模板
- 多重耐藥菌的預(yù)防及護(hù)理課件
- 抽水蓄能電站課件
評論
0/150
提交評論