易语言教程_易语言源码_易语言视频教程_易语言论坛

 找回密码
 点击注册

Vip新手入门区
新手学习指南  学员作品展示 Vip课程总纲  Vip绝密课程系列

Vip相关下载区
Vip模块下载   Vip模块绑定   Vip模块例子 魔鬼插件下载  魔鬼插件例子  教程工具下载

Vip论坛服务区
教程问题提问区   模块问题提问区 技术交流区   魔鬼插件建议   忘记密码找回

VIP会员办理QQ: 8643245   
【请先加好友,然后到好友列表双击联系客服,办理VIP会员。】
【基础篇】易语言辅助入门基础教程
VIP模块办理QQ: 7189694 办理正版魔鬼作坊VIP模块 【基础篇】OD与CE入门基础教程
办理【终身VIP会员】“秒杀价” 仅需 RMB278.00元… 【基础篇】零基础绝密汇编语言入门课程 (共26课已完成)…
办理VIP详情…猛击这里查看详情 【基础篇】VIP辅助入门基础教程-新手必学 已发布10课 ……
VIP教程免费试看章节…猛击下载 【第1款】制作“辅助挂”教程目录查看(共107+16_x64下更新课已完成)…
亲爱的VIP学员,请到此写下你学习的感受与发布作品截图… 【第2款】制作“任务挂”教程目录查看(共77+1_x64下更新课已完成)…
卍解吧!不用bp send类封包断点找CALL的各种通杀思路 【第3款】驱动过保护技术课程(共38课已完成)…
【绝密教程】VIP绝密教程系列---注意:随时会更新! 【第4款】VIP邪恶二叉树辅助课程 (共31+17_x64下更新课已完成)…
【精品第13款】3D射击游戏与页游透视 智辅课程 已完成17课… 【第5款】零基础易语言按键辅助教程 (30课已完成)…
【精品第14款】变态功能辅助是如何炼成的 已完成36课… 【第6款】从零开始学习封包辅助技术教程(20课已完成) …
【精品第15款】DNF商业变态辅助的修炼之路 已完成27课… 【第7款】大杀特杀分析来源与CALL吸血鬼课程 (56课已完成)
【精品第16款】中控台多线程多开自动化商业辅助课程 已完成66课… 【第8款】完全零基础网页辅助课程(40课已完成)
【全新精品第17款】检测原理与过游戏内存检测技术课程 已发布9课… 【第9款】自动登录与操控LUA技术课程 (共46+8_x64下更新课已完成)…
【全新精品第18款】手游全自动化任务脚本辅助课程 已发布25课…… 【第10款】网页辅助封包脱机进阶课程 已完成30课…
【全新精品第19款】D3D方框骨骼透视与自瞄辅助课程进阶篇 已发布34课…… 【第11款】VC++ Lua脚本辅助课程 已完成112课…
【全新精品第20款】 X64模拟器吃鸡游戏方框透视自瞄辅助课程 发布中... 【第12款】网游脱机封包智辅课程 已完成35课…
查看: 1733|回复: 5

来个高人呀!急呀!

[复制链接]

2

主题

2

回帖

25

积分

编程入门

Rank: 1

魔鬼币
25
发表于 2011-2-3 13:39:20 | 显示全部楼层 |阅读模式
能帮忙把的源码弄成易语言的吗???详细解释一下易语言怎么弄也行呀!

第一步,这也是最起码的,你必须要能够打开游戏进程和线程,能够开打进程和线程后不被检测到
第二步,能够读写进村内存
第三步,能够用OD附加游戏进程
第四步,能够下硬件断点而不被检测

跳过NtReadVirtualMemory,NtWriteVirtualMemory函数头的钩子

代码:
[code#include<ntddk.h>

typedef struct _SERVICE_DESCRIPTOR_TABLE
{
   PVOID    ServiceTableBase;
   PULONG   ServiceCounterTableBase;
   ULONG    NumberOfService;
   ULONG    ParamTableBase;
}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE; //由于KeServiceDescriptorTable只有一项,这里就简单点了
extern PSERVICE_DESCRIPTOR_TABLE     KeServiceDescriptorTable;//KeServiceDescriptorTable为导出函数

/////////////////////////////////////
VOID Hook();
VOID Unhook();
VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
//////////////////////////////////////
ULONG JmpAddress;//跳转到NtOpenProcess里的地址
ULONG JmpAddress1;//跳转到NtOpenProcess里的地址
ULONG OldServiceAddress;//原来NtOpenProcess的服务地址
ULONG OldServiceAddress1;//原来NtOpenProcess的服务地址
//////////////////////////////////////
__declspec(naked) NTSTATUS __stdcall MyNtReadVirtualMemory(HANDLE ProcessHandle,
                PVOID BaseAddress,
                PVOID Buffer,
                ULONG NumberOfBytesToRead,
          PULONG NumberOfBytesReaded)
{
   //跳过去
   __asm
   {
     push     0x1c
     push     804eb560h   //共十个字节
     jmp      [JmpAddress]   
   }
}

__declspec(naked) NTSTATUS __stdcall MyNtWriteVirtualMemory(HANDLE ProcessHandle,
                PVOID BaseAddress,
                PVOID Buffer,
                ULONG NumberOfBytesToWrite,
          PULONG NumberOfBytesReaded)
{
   //跳过去
   __asm
   {
     push     0x1c
     push     804eb560h   //共十个字节
     jmp      [JmpAddress1]
   }
}
///////////////////////////////////////////////////
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath
{
    DriverObject->DriverUnload = OnUnload;
   DbgPrint("Unhooker load");
   Hook();
   return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////
VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
   DbgPrint("Unhooker unload!");
   Unhook();
}
/////////////////////////////////////////////////////
VOID Hook()
{
   ULONG   Address, Address1;
   Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0xBA * 4;//0x7A为NtOpenProcess服务ID
   Address1 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x115 * 4;//0x7A为NtOpenProcess服务ID

   DbgPrint("Address:0x%08X",Address);

   OldServiceAddress = *(ULONG*)Address;//保存原来NtOpenProcess的地址
   OldServiceAddress1 = *(ULONG*)Address1;//保存原来NtOpenProcess的地址
   DbgPrint("OldServiceAddress:0x%08X",OldServiceAddress);
   DbgPrint("OldServiceAddress1:0x%08X",OldServiceAddress1);

   DbgPrint("MyNtOpenProcess:0x%08X",MyNtReadVirtualMemory);
   DbgPrint("MyNtOpenProcess:0x%08X",MyNtWriteVirtualMemory);

   JmpAddress = (ULONG)0x805b528a + 7; //跳转到NtOpenProcess函数头+10的地方,这样在其前面写的JMP都失效了
   JmpAddress1 = (ULONG)0x805b5394 + 7;
   DbgPrint("JmpAddress:0x%08X",JmpAddress);
   DbgPrint("JmpAddress1:0x%08X",JmpAddress1);
   
   __asm
   {     //去掉内存保护
     cli
         mov   eax,cr0
     and   eax,not 10000h
     mov   cr0,eax
   }

   *((ULONG*)Address) = (ULONG)MyNtReadVirtualMemory;//HOOK SSDT
   *((ULONG*)Address1) = (ULONG)MyNtWriteVirtualMemory;

   __asm
   {     //恢复内存保护  
         mov   eax,cr0
     or    eax,10000h
     mov   cr0,eax
     sti
   }
}
//////////////////////////////////////////////////////
VOID Unhook()
{
   ULONG   Address, Address1;
   Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0xBA * 4;//查找SSDT
   Address1 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x115 * 4;

   __asm{
     cli
           mov   eax,cr0
     and   eax,not 10000h
     mov   cr0,eax
   }

   *((ULONG*)Address) = (ULONG)OldServiceAddress;//还原SSDT
   *((ULONG*)Address1) = (ULONG)OldServiceAddress1;//还原S
__asm{  
          mov   eax,cr0
     or    eax,10000h
     mov   cr0,eax
     sti
   }

   DbgPrint("Unhook");
}
由于它不断对DebugPort清零,所以要修改调试相关函数,使得所有的访问DebugPort的地方全部访问EPROCESS中的ExitTime字节,这样它怎么清零都无效了,也检测不到

代码:
.386
.model flat, stdcall
option casemap:none

include dnf_hook.inc

.const
Dspdo_1 equ 80643db6h
Dmpp_1 equ 80642d5eh
Dmpp_2 equ 80642d64h
Dct_1 equ 806445d3h
Dqm_1 equ 80643089h
Kde_1 equ 804ff5fdh
Dfe_1 equ 80644340h
Pcp_1 equ 805d1a0dh
Mcp_1 equ 805b0c06h
Mcp_2 equ 805b0d7fh
Dmvos_1 equ 8064497fh
Dumvos_1 equ 80644a45h
Pet_1 equ 805d32f8h
Det_1 equ 8064486ch
Dep_1 equ 806448e6h

.code

2

主题

2

回帖

25

积分

编程入门

Rank: 1

魔鬼币
25
 楼主| 发表于 2011-2-3 13:39:55 | 显示全部楼层
接上面的
;还原自己的Hook
DriverUnload proc pDriverObjectDRIVER_OBJECT
   ret  
DriverUnload endp

ModifyFuncAboutDbg proc addrOdFunc, cmd_1, cmd_2
   pushad
   mov   ebx, addrOdFunc
   mov   eax, cmd_1
   mov    DWORD ptr [ebx], eax
   mov   eax, cmd_2
   mov    DWORD ptr [ebx + 4], eax
   popad
   ret
ModifyFuncAboutDbg endp

DriverEntry proc pDriverObjectDRIVER_OBJECT, pusRegistryPathUNICODE_STRING
   cli
         mov    eax, cr0
         and    eax, not 10000h
         mov    cr0, eax
        
   invoke ModifyFuncAboutDbg, Dspdo_1, 90784789h, 0fde89090h
   invoke ModifyFuncAboutDbg, Dmpp_1, 90787e39h, 950f9090h
   invoke ModifyFuncAboutDbg, Dct_1, 90785e39h, 840f9090h
   invoke ModifyFuncAboutDbg, Dqm_1, 9078408bh, 45899090h
   invoke ModifyFuncAboutDbg, Kde_1, 90787839h, 13749090h
   invoke ModifyFuncAboutDbg, Dfe_1, 9078418bh, 0d2329090h
   invoke ModifyFuncAboutDbg, Pcp_1, 90784389h, 45f69090h
   invoke ModifyFuncAboutDbg, Mcp_1, 90785e39h, 950f9090h
   invoke ModifyFuncAboutDbg, Mcp_2, 90784a89h, 5e399090h
   invoke ModifyFuncAboutDbg, Dmvos_1, 9078498bh, 0cb3b9090h
   invoke ModifyFuncAboutDbg, Dumvos_1, 00787983h, 74909090h
   invoke ModifyFuncAboutDbg, Pet_1, 00787f83h, 74909090h
   invoke ModifyFuncAboutDbg, Det_1, 9078498bh, 0c9859090h
   invoke ModifyFuncAboutDbg, Dep_1, 9078498bh, 0c9859090h
   ;invoke ModifyFuncAboutDbg, Dmpp_2, 8bc0950fh, 8b90c032h
  
   mov   eax, pDriverObject
   assume    eax : ptr DRIVER_OBJECT
     jmp   ebx
   .endif
HookCode endp

;获取系统名称偏移
GetNameOffset proc epe
   local tmpOffset
   pushad
   mov   ebx, epe
   invoke strlen, $CTA0("System")
   xor   ecx, ecx
@@:
   push   eax
   push   ecx
   invoke strncmp, $CTA0("System"), ebx, eax
   pop   ecx
   .if   !eax
     pop   eax
     mov   tmpOffset, ecx
     popad
     mov   eax, tmpOffset
     ret
   .elseif
     pop   eax
     inc   ebx
     inc   ecx
     cmp   ecx, 4096
     je   @F
     jmp   @B
   .endif
@@:
   popad
   mov   eax, -1
   ret
GetNameOffset endp

Hook proc
   pushad
   ;头5字节跳转
   mov   eax, offset HookCode
   sub   eax, NtOpenProcessHookAddr;805c13e0h;805c13edh
   sub   eax, 5
   mov   ebx, NtOpenProcessHookAddr;805c13e0h;805c13edh
   mov   cl, 0E9h
   mov   BYTE PTR [ebx], cl
   mov   DWORD PTR [ebx + 1], eax
   popad
   ret
Hook endp

HookThreadCode proc
   ;执行被覆盖的代码
   push     dword ptr [ebp-34h]
   push     dword ptr [ebp-20h]
   ;判断是否dnf的进程
   invoke   GetProcessName
   .if   !eax   ;如果是DNF自己的进程,那么跳转回去执行它的Hook代码
     pushad
     invoke DbgPrint, $CTA0("\nNotUnHook\n")
     popad
     mov   eax, NtOpenThreadNoChange;805c13e6h
     jmp   eax
   .else     ;如果不是DNF自己的进程,那么直接调用ObOpenObjectByPointer,再返回到后面
     pushad
     invoke DbgPrint, $CTA0("\nUnHook\n")
     popad
     mov   eax, ObOpenObjectByPointerAddr;805b13f0h
     call   eax
     mov   ebx, NtOpenThreadRetAddr;805c13ebh
     jmp   ebx
   .endif
  
HookThreadCode endp

HookThread proc
   pushad
   ;头5字节跳转
   mov   eax, offset HookThreadCo
   sub   eax, NtOpenThreadHookAddr;805c13e0h;805c13edh
   sub   eax, 5
   mov   ebx, NtOpenThreadHookAddr;805c13e0h;805c13edh
   mov   cl, 0E9h
   mov   BYTE PTR [ebx], cl
   mov   DWORD PTR [ebx + 1], eax
   popad
   ret
HookThread endp

HookDbg proc
   mov      edi, edi
   push     ebp
   mov      ebp, esp
   push     ebx
   push     esi
   mov   esi, KiAttachProcessRetAddr
   jmp   esi
HookDbg endp

Dbg proc
   pushad
   ;头5字节跳转
   mov   eax, offset HookDbg
   sub   eax, KiAttachProcessAddr;805c13e0h;805c13edh
   sub   eax, 5
   mov   ebx, KiAttachProcessAddr;805c13e0h;805c13edh
   mov   cl, 0E9h
   mov   BYTE PTR [ebx], cl
   mov   DWORD PTR [ebx + 1], eax
   popad
   ret
Dbg endp

;还原自己的Hook
DriverUnload proc pDriverObjectDRIVER_OBJECT
   cli
         mov    eax, cr0
         and    eax, not 10000h
         mov    cr0, eax

   ;还原进程处理
   mov   eax, 0ffc875ffh
   mov   ebx, 805cc656h
   mov    DWORD ptr [ebx], eax
   mov    eax, 43e8dc75h
   mov   DWORD ptr [ebx + 4], eax
   ;还原线程处理
   mov   eax, 0ffcc75ffh
   mov   ebx, 805cc8d8h
   mov    DWORD ptr [ebx], eax
   mov    eax, 0c1e8e075h
   mov   DWORD ptr [ebx + 4], eax
   ;还原调试处理
   mov   eax, 08b55ff8bh
   mov   ebx, 804f9a08h
   mov    DWORD ptr [ebx], eax
   mov   eax, 08b5653ech
   mov    DWORD ptr [ebx + 4], eax

   mov   eax, cr0
         or   eax, 10000h
         mov    cr0, eax
         sti

   ret  
DriverUnload endp

;显示LinkTable的信息
ShowLinkTableInfo proc ptrLT
   pushad
   invoke    DbgPrint, $CTA0("\nThe LinkTable Info:\n")
  
   mov   ebx, ptrLT
   mov   eax, (LinkTable ptr [ebx]).ThreadHandle
    invoke    DbgPrint, $CTA0("ThreadHandle:%0X\n"), eax
  
     mov   ebx, ptrLT
   mov   eax, (LinkTable ptr [ebx]).Dr0Seg
   invoke    DbgPrint, $CTA0("Dr0Seg:%0X\n"), eax
  
   mov   ebx, ptrLT
   mov   eax, (LinkTable ptr [ebx]).Dr1Seg
   invoke    DbgPrint, $CTA0("Dr1Seg:%0X\n"), eax
  
   mov   ebx, ptrLT
   mov   eax, (LinkTable ptr [ebx]).Dr2Seg
   invoke    DbgPrint, $CTA0("Dr2Seg:%0X\n"), eax
  
   mov   ebx, ptrLT
   mov   eax, (LinkTable ptr [ebx]).Dr3Seg
   invoke    DbgPrint, $CTA0("Dr3Seg:%0X\n"), eax
  
   mov   ebx, ptrLT
   mov   eax, (LinkTable ptr [ebx]).Dr6Seg
   invoke    DbgPrint, $CTA0("Dr6Seg:%0X\n"), eax
  
   mov   ebx, ptrLT
   mov   eax, (LinkTable ptr [ebx]).Dr7Seg
   invoke    DbgPrint, $CTA0("Dr7Seg:%0X\n"), eax
  
   mov   ebx, ptrLT
   mov   eax, (LinkTable ptr [ebx]).LinkPtr
   invoke    DbgPrint, $CTA0("LinkPtr:%0X\n"), eax
  
   mov   ebx, ptrLT
   mov   eax, (LinkTable ptr [ebx]).NextLinkPtr
   invoke    DbgPrint, $CTA0("NextLinkPtr:%0X\n"), eax
   popad
   ret
ShowLinkTableInfo endp

;判断该线程是否存在
;如果不存在则返回0,存在则返回指向该链表的指针,1代表链表为空
ExsitsLinkTable proc pHandle
   pushad
   mov   eax, threadCxtLink
   .if   !eax   ;链表为空
     pushad
     invoke    DbgPrint, $CTA0("\nLinkTable Is Null.\n")
     popad   
   
     popad
     mov   eax, 1
     ret
   .endif
@@:
   mov   ebx, (LinkTable ptr [eax]).ThreadHandle
   cmp   ebx, pHandle   ;如果匹配已经存在
   je   @F
   mov   eax, (LinkTable ptr [eax]).NextLinkPtr
   .if   !eax   ;已经到达末尾,没有找到匹配
     pushad
     invoke    DbgPrint, $CTA0("\pHandle Is Not Found.\n")
     popad
   
     popad
     xor   eax, ea
     ret
     .endif
   jmp   @B
@@:
   pushad
   invoke    DbgPrint, $CTA0("\npHandle Is Exsits.\n")
   popad
   invoke    ShowLinkTableInfo, eax
   ;返回链表指针
   mov   tmpLink, eax
   popad
   mov   eax, tmpLink
   ret
ExsitsLinkTable endp

;拷贝Context到LinkTable中
CopyContextToLinkTable proc ptrContext, ptrLT
   pushad
   mov   ebx, ptrContext
   mov   edx, ptrLT
   mov   ecx, 4
@@:
   mov   eax, DWORD ptr [ebx + ecx]
   mov   DWORD ptr [edx + ecx], eax
   add   ecx, 4
   cmp   ecx, 18h
   jbe   @B
   popad
   ret
CopyContextToLinkTable endp

;添加LinkTable表
AddLinkTable proc pHandle, ptrContext
   pushad
   invoke   ExsitsLinkTable, pHandle
   .if   eax > 1
     ;已经存在只需要更新dr寄存器即可
     invoke   CopyContextToLinkTable, eax, ptrContext
   .else
     push   eax
     invoke    ExAllocatePool, 1, size LinkTable
     .if   eax
       ;申请内存成功
       mov   ebx, eax
       pop   eax
       ;置地一个元素
       mov   ecx, pHandle
       mov   (LinkTable ptr [ebx]).ThreadHandle, ecx
       ;拷贝dr寄存器的值
       invoke   CopyContextToLinkTable, ptrContext, ebx
       ;置另外两个元素
       mov   (LinkTable ptr [ebx]).LinkPtr, ebx
       mov   (LinkTable ptr [ebx]).NextLinkPtr, 0
       invoke   ShowLinkTableInfo, ebx
      
       ;把新的链表项添加到链表中
       .if   eax == 1

42

主题

62

回帖

94

积分

终身VIP会员

团长

Rank: 7Rank: 7Rank: 7

魔鬼币
1923
发表于 2011-2-4 03:24:57 | 显示全部楼层
............................???????????????????????????????????????????????????????

2

主题

22

回帖

1

积分

编程入门

生不如死

Rank: 1

魔鬼币
1
发表于 2011-2-4 09:22:47 | 显示全部楼层
完全高难度

19

主题

115

回帖

86

积分

终身VIP会员

Rank: 7Rank: 7Rank: 7

魔鬼币
78151
发表于 2011-2-5 11:57:10 | 显示全部楼层
现在的易语言根本无法实现

19

主题

115

回帖

86

积分

终身VIP会员

Rank: 7Rank: 7Rank: 7

魔鬼币
78151
发表于 2011-2-5 11:58:04 | 显示全部楼层
这个保护也只是跳过了内存的读写保护!
您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

魔鬼作坊|易语言教程|易语言源码|易语言论坛|易语言视频教程| 论坛导航|免责申明|手机版||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表魔鬼作坊立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2019 All Right Reserved.
快速回复 返回顶部 返回列表