首页
社区
课程
招聘
[分享]PassTP(1)---驱动开发 环境搭建(2)实现双机联调 (3)Ollydbg调试游戏
发表于: 2013-9-19 23:49 36114

[分享]PassTP(1)---驱动开发 环境搭建(2)实现双机联调 (3)Ollydbg调试游戏

2013-9-19 23:49
36114

    本人不擅长写文章,看着论坛有那么多无私的会员都暴了源码,还是坚持把自己最近的驱动开发心得发出来.祝看雪论坛越办越好,祝各位会员都能快速成长.不管写得好不好,都欢迎拍砖!
      本代码也是学习论坛某位会员reload new krnl思想写的,非常感觉你们的无私奉献.具体链接如下

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

    本系列文章打算写3篇,源码在3篇文章写完后再上
    第二篇为 PassTP(2)---实现双机联调
    第三篇为 PassTP(3)---Ollydbg调试游戏

      开发环境:vs2008+wdk(7600.16385.1)+win7sdk+vmvare(6.0)

    实验环境:TesSafe 1.15.0.11200(md5:F98D02564EE7B546AC121469EB7C5822)+大明龙权(我机器太烂了,这个游戏不是很大,所以用这款游戏和vm6)

      我电脑上装了vs2008,win7sdk,wdk.不知这三个东西有没有安装顺序的区分.至于为什么要装win7sdk,1是以前好像开发64位程序有用到,2是为了新建个"新平台"用于开发驱动(Itanium平台)
   

  win32 用于开发 32位 ring3程序
  x64    用于开发64位ring3程序
  Itanium 我把它修改了,用来开发32位 驱动程序
  如果你电脑上没Itanium平台,自己研究下.vcproj文件中的内容是什么意思

一.工具->选项->项目和解决方案->Vc++目录

C:\Documents and Settings\Administrator\Local Settings\Application Data\Microsoft\VisualStudio\9.0\VCComponents.dat
这个文件存的全是平台相关信息,默认是没这个文件的,只有改了平台相关目录信息,vs才会保存到这个地方.如果你把平台相关信息改坏了,把这个文件删了,vs就会用默认的平台信息.下面是我电脑上该文件的具体内容.如果你没装win7sdk,可能就没有itanium这个平台了.这时如果想编译驱动,就要改个已有平台的相关目录信息了

[VC\VC_OBJECTS_PLATFORM_INFO\Win32\Directories]
Include Dirs=$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)\include;$(FrameworkSDKDir)include
Reference Dirs=$(FrameworkDir)$(FrameworkVersion);$(VCInstallDir)atlmfc\lib;$(VCInstallDir)lib
Library Dirs=$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(VCInstallDir)atlmfc\lib\i386;$(WindowsSdkDir)\lib;$(FrameworkSDKDir)lib;$(VSInstallDir);$(VSInstallDir)lib
Source Dirs=$(VCInstallDir)atlmfc\src\mfc;$(VCInstallDir)atlmfc\src\mfcm;$(VCInstallDir)atlmfc\src\atl;$(VCInstallDir)crt\src
Exclude Dirs=$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)\include;$(FrameworkSDKDir)include;$(FrameworkDir)$(FrameworkVersion);$(VCInstallDir)atlmfc\lib;$(VCInstallDir)lib
Path Dirs=$(VCInstallDir)bin;$(WindowsSdkDir)\bin;$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(FrameworkSDKDir)bin;$(FrameworkDir)$(FrameworkVersion);$(VSInstallDir);$(SystemRoot)\SysWow64;$(FxCopDir);$(PATH)

[VC\VC_OBJECTS_PLATFORM_INFO\Itanium\Directories]
Include Dirs=C:\WinDDK\7600.16385.1\inc\api;C:\WinDDK\7600.16385.1\inc\crt;C:\WinDDK\7600.16385.1\inc\ddk
Reference Dirs=C:\WinDDK\7600.16385.1\lib\wxp\i386
Library Dirs=C:\WinDDK\7600.16385.1\lib\wxp\i386;C:\WinDDK\7600.16385.1\lib\Crt\i386
Source Dirs=C:\WinDDK\7600.16385.1\src
Exclude Dirs=C:\WinDDK\7600.16385.1\inc\api;C:\WinDDK\7600.16385.1\inc\crt;C:\WinDDK\7600.16385.1\inc\ddk;C:\WinDDK\7600.16385.1\lib\wxp\i386
Path Dirs=C:\WinDDK\7600.16385.1\bin\x86\x86;C:\WinDDK\7600.16385.1\bin\x86;C:\WINDOWS\system32

[VC\VC_OBJECTS_PLATFORM_INFO\x64\Directories]
Path Dirs=$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSdkDir)\bin;$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(FrameworkSDKDir)bin;$(FrameworkSDKDir)lib\win64;$(FrameworkDir)$(FrameworkVersion);$(FxCopDir);$(PATH)
Include Dirs=$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)\include;$(FrameworkSDKDir)include
Reference Dirs=$(FrameworkDir)$(FrameworkVersion);$(VCInstallDir)atlmfc\lib\amd64;$(VCInstallDir)lib\amd64
Library Dirs=$(VCInstallDir)lib\amd64;$(VCInstallDir)atlmfc\lib\amd64;$(WindowsSdkDir)\lib\x64
Source Dirs=$(VCInstallDir)atlmfc\src\mfc;$(VCInstallDir)atlmfc\src\mfcm;$(VCInstallDir)atlmfc\src\atl;$(VCInstallDir)crt\src
Exclude Dirs=$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)\include;$(FrameworkSDKDir)include;$(FrameworkDir)$(FrameworkVersion);$(VCInstallDir)atlmfc\lib\amd64;$(VCInstallDir)lib\amd64

Itanium 可执行文件:(编译,链接,cmd.exe所在目录)
   1.C:\WinDDK\7600.16385.1\bin\x86\x86
   2.C:\WinDDK\7600.16385.1\bin\x86
   3.C:\WINDOWS\system32
Itanium 包含文件:
  1.C:\WinDDK\7600.16385.1\inc\api
  2.C:\WinDDK\7600.16385.1\inc\crt
  3.C:\WinDDK\7600.16385.1\inc\ddk
Itanium 引用文件:
1.C:\WinDDK\7600.16385.1\lib\wxp\i386

Itanium 库文件:
 1.C:\WinDDK\7600.16385.1\lib\wxp\i386
 2.C:\WinDDK\7600.16385.1\lib\Crt\i386

Itanium 源文件:(visual assistant x用)
1.C:\WinDDK\7600.16385.1\src

二.新建 驱动工程
  网上一般说是先随便建个console工程,再改配置项,下面发下需要改哪些配置项.下面这段代码是我自己写的一个wizard,用来改驱动配置项的,完整代码也会发出来.
   
  1.也就是改工程属性页,c/c++,链接器等设置
  2.随便解释一段,其它的自己看下面个函数(CPY_Wizard\Scripts\1033\default.js)
     CLTool.CallingConvention=callConventionStdCall;  stdcall调用约定
     CLTool.CompileAs="2"; 编译为c++代码
     CLTool.AdditionalIncludeDirectories="$(SolutionDir)..\\Wrk;" 额外包含目录,驱动中很多数据结构用的wrk文件中的,所以自建了个wrk目录,把源wrk中的部分数据结构拷出来,放进去了
    LinkTool.SetChecksum="true"; 设置效验和,这个很重要,否则用drivermonitor加载驱动时,会提示类似于"不是用效的pe文件"这样的信息
   其它的就不解释了
     
    
  

function AddDriverConfig(proj, strProjectName)
{
  try
  {
  
    var platform=proj.Object.Platforms("Itanium");
    platform.ExecutableDirectories="C:\\WinDDK\\7600.16385.1\\bin\\x86\\x86;C:\\WinDDK\\7600.16385.1\\bin\\x86;C:\\Windows\\System32";
    platform.IncludeDirectories="C:\\WinDDK\\7600.16385.1\\inc\\api;C:\\WinDDK\\7600.16385.1\\inc\\crt;C:\\WinDDK\\7600.16385.1\\inc\\ddk";
    platform.ReferenceDirectories="";
    platform.LibraryDirectories="C:\\WinDDK\\7600.16385.1\\lib\\wxp\\i386";
    platform.ExcludeDirectories="";
    platform.SourceDirectories="C:\\WinDDK\\7600.16385.1\\src";
    

  
    
    var config = proj.Object.Configurations('Debug');
    config.OutputDirectory = '$(SolutionDir)..\\..\\bin\\$(ConfigurationName)\\';
    config.IntermediateDirectory = '$(SolutionDir)..\\..\\mid\\$(ProjectName)';
    config.CharacterSet=charSetUnicode;
    config.ConfigurationType=typeApplication;

    var CLTool = config.Tools('VCCLCompilerTool');
      CLTool.PreprocessorDefinitions="_X86_;DBG=1";
      CLTool.CallingConvention=callConventionStdCall;
      CLTool.DebugInformationFormat="1";
      CLTool.CompileAs="2";
      CLTool.BufferSecurityCheck="false";
      CLTool.AdditionalIncludeDirectories="$(SolutionDir)..\\Wrk;"
      CLTool.ExceptionHandling="0"

    var LinkTool = config.Tools('VCLinkerTool');
      LinkTool.OutputFile = "$(OutDir)/" + strProjectName + ".sys";
      LinkTool.AdditionalDependencies="ntoskrnl.lib Hal.lib $(NOINHERIT)";
      LinkTool.EnableUAC="false";
      LinkTool.SubSystem=subSystemConsole;
      LinkTool.Driver="1";
      LinkTool.EntryPointSymbol="DriverEntry";
      LinkTool.BaseAddress="0x10000";
      LinkTool.RandomizedBaseAddress="0";
      LinkTool.DataExecutionPrevention="0";
      LinkTool.GenerateManifest="false";
      LinkTool.IgnoreAllDefaultLibraries="true";
      LinkTool.TargetMachine="1";
      LinkTool.GenerateDebugInformation="true";
      LinkTool.SetChecksum="true";

      
    //release config
    config = proj.Object.Configurations('Release');
    config.OutputDirectory = '$(SolutionDir)..\\..\\bin\\$(ConfigurationName)\\';
    config.IntermediateDirectory = '$(SolutionDir)..\\..\\mid\\$(ProjectName)';
    config.CharacterSet=charSetUnicode;
    config.ConfigurationType=typeApplication;

    var CLTool = config.Tools('VCCLCompilerTool');
      CLTool.PreprocessorDefinitions="_X86_;DBG=0";
      CLTool.CallingConvention=callConventionStdCall;
      CLTool.CompileAs="2";
      CLTool.BufferSecurityCheck="false";
      CLTool.AdditionalIncludeDirectories="$(SolutionDir)..\\Wrk;"
      CLTool.ExceptionHandling="0"

    var LinkTool = config.Tools('VCLinkerTool');
      LinkTool.OutputFile = "$(OutDir)/" + strProjectName + ".sys";
      LinkTool.AdditionalDependencies="ntoskrnl.lib Hal.lib $(NOINHERIT)";
      LinkTool.EnableUAC="false";
      LinkTool.SubSystem=subSystemConsole;
      LinkTool.Driver="1"
      LinkTool.EntryPointSymbol="DriverEntry";
      LinkTool.BaseAddress="0x10000"
      LinkTool.RandomizedBaseAddress="0"
      LinkTool.DataExecutionPrevention="0"
      LinkTool.GenerateManifest="false";
      LinkTool.IgnoreAllDefaultLibraries="true";
      LinkTool.TargetMachine="1";
      LinkTool.SetChecksum="true";

  }
  catch(e)
  {
    throw e;
  }
}

三 CPY_WIZARD使用
1.把下图中3个文件放在相应目录,也可自建一个目录

2.CPY_Wizard.vsz 改这个文件中的绝对路径,也可以是相对路径有兴趣的自己去研究

VSWIZARD 7.0
Wizard=VsWizard.VsWizardEngine.9.0 //vs2008专用

Param="WIZARD_NAME = CPY_Wizard"
Param="ABSOLUTE_PATH = D:\Practice\trunk\src\TestSln\CPY_Wizard"
Param="FALLBACK_LCID = 1033"

四.项目刚完成,还没优化,代码有点乱.


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (42)
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
2
支持原创文章,不过……驱动编程的环境配置、基础知识不是一篇两篇文章就能讲清楚的,还是留给现成的书吧,或者简单点的方法比如Visual DDK直接搞定
2013-9-20 00:01
0
雪    币: 59
活跃值: (52)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
1.第一次写驱动,边逆向QQProtect.sys 边学写驱动,难免会蓝屏.所以本代码仅供交流学习.我这只是炒现饭了,其实pass tp 论坛上都可以找到答案的

2.公认tp iat hook了 下面两个函数
KdReceivePacket IAT  0x20dc
KdSendPacket IAT      0x20cc

3 Tp 不断 call KdDisableDebugger

4.搞定这3个地方就可以Kernal Debug TP驱动了

5.看下 ntoskrnl.exe中这两个函数
.text:0044173F ; __stdcall KdSendPacket(x, x, x, x)
.text:0044173F _KdSendPacket@16 proc near              ; CODE XREF: KdpSendWaitContinue(x,x,x,x)+4Ep
.text:0044173F                                         ; KdpSendWaitContinue(x,x,x,x)+3DDp ...
.text:0044173F                 jmp     ds:__imp__KdSendPacket@16 ; KdSendPacket(x,x,x,x)
.text:0044173F _KdSendPacket@16 endp
.text:0044173F


将 jmp [xx] 改成 jmp yy 就可以无视 TP的iat hook 随他怎么去校验

6. 至于KdDisableDebugger 看下这个函数的源码,其实只要将类似引用计数的一个全局变量KdDisableCount 提前置1就行了,这样tp 不断的KdDisableDebugger 就成了空函数,这样很容易就过了校验

7.上面几步搞定好,突然发现还是不能krnl debug,其实我们可以再看下KdDisableDebugger 这个函数的源码,该函数核心功能其实就是  mov     ds:_KiDebugRoutine, offset _KdpStub@24 ; 
猥琐的tp 在不断的KdDisableDebugger 同时执行了上面这句,正常的krnl debug 是
mov     _KiDebugRoutine, offset _KdpTrap@24  ,知道了原理就好搞了.这里大家可以根据自己的习惯去搞 .我的做法是 inline hook KdpStub 让它跳回去执行 KdpTrap
上传的附件:
2013-9-20 00:10
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
大侠好人啊!!!!!!!
2013-9-20 00:14
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢老大!!!  中秋节快乐啊
2013-9-20 00:16
0
雪    币: 59
活跃值: (52)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
一.reload krnl的思想 :尽量 不改oldkrnl ,让new krnl 为od服务,实现隐藏debugport,分发调试消息

二.基本流程
   1.fix debug port(重中之重)
   2.基址重定位,new krnl 因为没调用初始化代码,也就是DriverEntry(KiSystemStartup),全局变量也就没有初始化,基址重定位的目的也就是让 new krnl 直接用 old krnl 的全局变量,但有些全局变量我们是不能直接用old krnl,像 函数指针(也属于全局变量),所以我们下一步就要 对部分函数指针 作重定位,让函数指针 指向 new krnl中的 函数
   3.hook kifastcallentry ,这个函数是作sdt ,sdt shadow中服务函数中转的,让new krnl为 od提供服务,也就是 od 调用 那些服务函数时 走 new krnl中的函数(old krnl中的函数 可能被hook了 )
  4.换idt ,我只换了 两个 中断函数 单步中断int 1(f7,f8用到) 和 int 3中断(也就是od中设置断点时用到的).不知 tp 的int 20 中断是搞什么用的.
  5.tx的游戏好像在 ring 3  还搞了个 disable attach 看下DebugActiveProcess,DbgUiConnectToDbg,DbgUiDebugActiveProcess,DbgUiIssueRemoteBreakin,再结合google相关搜索,核心代码 也就是 RtlCreateUserThread(DbgUiRemoteBreakin),ring3 只需 hook DbgUiRemoteBreakin 就可简单反attach了,这个破东西,困扰了我好久.过这个破东西,只需开 strong od的 anti anti_debug就可搞定.
   6.别忘了fix kiservicetable ,让od或被调试程序的部分nt函数,走newkrnl的 kiservicetable,至于哪些函数,在wrk中 搜下 DebugPort 就会找到答案.
   7.让被调试程序的某些nt函数也走new krnl 为了 实现分发 调试消息

三 
过tp其实就是要懂得调试器的原理,看下wrk中dbg开头,带操作 DebugPort的函数,是在什么时候被调用的基本上就知道 调试器是个什么鬼东西.

四.关于DebugPort
1.至于为什么要改DebugPort的偏移,以及DebugPort是个什么鬼东西,网上一大堆,这里我要说的是很多发的关于过tp的代码,都是要经过修改才能用的,那些debugport 的特征码在各个版本的系统是不一样的
2.DebugPort特征码找法.
   a.在wrk中搜操作debugport的函数,一共有21个
   b.ida ntoskrnl ,alt+b 空格 bc 00 00 00 把那21个函数找出来,包含bc 00 00 00的 一共有31处,MmCreatePeb 这个函数 出现了两次,其实有一处是错误的,不过你把它给fix了也不会有什么问题
至于有一处指向什么,自己找答案,这样的话,真正需要fix的地方只有30处(我说的是xp系统,下面附近是我的研究样本)

3.DebugPort 30处一定要全部搞对,fix后最好用windbg local krnl u 看下改对没,否则一处错误,就可能导致一些调试异常,像我在搞这个东西时,把DbgkExitThread, DbgkExitProcess 的特征码搞成了一样的,结果在od  alt+f2 时 死活退不出被调试程序.困扰了好久,最后krnl debug ba 下访问断点时才找到原因

4.举例找特征码
{"89 83 BC 00 00 00 F6 45 18 02",      "PspCreateProcess",}
alt+b ida中 第一行字符串 看图


5.再次强调不同的ntoskrnl debugport 特征码有些是不一样的

6.我还作了两处objecthook 一是 debugport 的 closeprocedure 和 psprocesstype的DeleteProcedure,我也不知道有没有用,因为我发现这些也是通过函数指针作的调用.这些是我在定位,调试器无法terminate被调试程序时发现的.


 服务号 0-1000 基本上是 ntoskrnl.exe
           1000-?? win2k.sys
          2000-?? 可用来指向我们自己的表

六.知识点总结
1.pe结构 fileoffset rva,导入导出表,重定位表
2.线程亲和性,KeSetAffinityThread
3.描述符8字节,描述符表,段选择子
4.内核下fs寄存器,[ fs:18]=? 根据下面的宏都能得到答案
  #define KIP0PCRADDRESS              0xffdff000   (_KPCR)                              
  #define KI_USER_SHARED_DATA         0xffdf0000 (_KI_USER_SHARED_DATA)
5._KTHREAD->ServiceTable
6._PEB->KernelCallbackTable 
7.PspCidTable
8.ssdt,ssdt shadow,idt
9._EPROCESS,_KTHREAD 重要数据结构

七.待掌握知识
1.分页,非分页相关概念
2.apc相关
3.mdl

八.疑问
1.一直想把wrk的 _EPROCESS移过来用,这个结构太庞大了,移了两次没成功
2._EPROCESS,在ntddk下有定义,不知咋搞了
3.OBJECT_TYPE ntddk 和wrk下都有定义
4.tp的代码中有个.vlizer段 不知是什么玩意,代码都变形了,不知是不是vmp?
5.tp调用的关键函数的地址都简单加密了,目前有下面这些函数
01016B50 g_EncryptFuncs  
    0=ExAcquireRundownProtection
4=ExEnumHandleTable
8=IoAllocateWorkItem
c=IoFreeWorkItem
    10=IoInitializeTimer
14=IoQueueWorkItem
    18=IoStartTimer
1c=IoStopTimer
20=IoThreadToProcess
    24=IoVolumeDeviceToDosName
28=KdDebuggerEnabled
2c=KdDisableDebugger
30=KeAddSystemServiceTable
    34=KeBugCheck
38=KeCancelTimer
3c=KeInitializeDpc
40=KeInitializeTimer
44=KeServiceDescriptorTable
48=KeSetTimerEx
4c=MmMapIoSpace
50=MmMapViewInSystemSpace
54=MmUnmapIoSpace
58=MmUnmapViewInSystemSpace
    5c=NtDeviceIoControlFile
60=NtOpenProcess
64=NtOpenThread
    68=NtSetInformationProcess
    6c=ObfReferenceObject
70=ObOpenObjectByPointer
74=PsCreateSystemThread
    78=PsGetContextThread
7c=PsGetProcessId
80=PsGetProcessImageFileName
84=PsGetProcessSessionId
88=PsLookupProcessByProcessId
8c=PsRemoveCreateThreadNotifyRoutine
90=PsRemoveLoadImageNotifyRoutine
    94=PsSetCreateProcessNotifyRoutine
    98=PsSetCreateThreadNotifyRoutine
    9c=PsSetLoadImageNotifyRoutine

A0=RtlGetVersion
A4=ZwOpenDirectoryObject
A8=ZwQueryDirectoryObject


以前有人说 inline hook 
NtOpenProcess _ObOpenObjectByPointer  0xba4a
NtOpenThread _ObOpenObjectByPointer   0x2ff2

这次试了下,在tp没更新前,好像没事,后来tp升级了
只要谁动了 上面两个函数中的 ob*函数 ,tp就会报异常,这就是为什么一开pchunter 就报异常(以前不报),pchunter 动了上面那个地方.

bp MessageBoxA 
上传的附件:
2013-9-20 01:25
0
雪    币: 4560
活跃值: (1002)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
为了过TP而重载内核貌似有点儿杀鸡用牛刀了
2013-9-20 01:36
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
10
强力支持,感谢分享。
2013-9-20 08:46
0
雪    币: 62
活跃值: (971)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
楼主有下功夫。
2013-9-20 09:43
0
雪    币: 47147
活跃值: (20420)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
12
中秋快乐!
将三帖合并一帖了,希望理解。
2013-9-20 09:56
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
13
中秋节快乐~~!
2013-9-20 10:21
0
雪    币: 680
活跃值: (68)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
厚颜无耻的mark
2013-9-20 10:27
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感谢分享,mark
2013-9-20 10:29
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
mark
2013-9-20 10:41
0
雪    币: 129
活跃值: (2763)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
中秋快乐 虽然昨天是中秋
2013-9-20 10:42
0
雪    币: 9687
活跃值: (2491)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
还是有点摸不着头脑,慢慢看吧.
2013-9-20 11:15
0
雪    币: 30
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
mark !!
2013-9-20 12:21
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
楼主看来是下苦功夫了,值得尊敬啊!!

不过还需要下点功夫,简化过的方法,可以更简单点,只要修改3个地方,它的R3和R0钩子直接无视,什么工具都可以运行,无半点非法提示。
楼主继续努力。。。。。
2013-9-20 12:28
0
雪    币: 40
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
感谢分享,mark
2013-9-20 13:15
0
雪    币: 74
活跃值: (748)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
厚颜无耻的mark
2013-9-20 16:16
0
雪    币: 615
活跃值: (580)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
23
革命尚未成功,同志乃需努力。
2013-9-20 18:07
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
24
wrk的结构搬来越搬越乱,我也试过
2013-9-20 18:27
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
为了过TP而重载内核貌似有点儿杀鸡用牛刀了
2013-9-20 21:23
0
游客
登录 | 注册 方可回帖
返回
//