首页
社区
课程
招聘
5
[原创]Tp已经pass Only win7 32下面讲解方法
发表于: 2013-8-7 16:46 36466

[原创]Tp已经pass Only win7 32下面讲解方法

2013-8-7 16:46
36466

TP技术难点:
1.双机调试
2.TesSafe自身模块硬断检测和自身CRC检测
3.DebugOjbetType权值清零
4.DebugPort清零

1解决了  2放弃  3Pass  4Pass  a half

讲解3.
直接上笔记和码
nt!NtDebugActiveProcess+0x9a:
84cb8e4a 341b            xor     al,1Bh

nt!NtCreateDebugObject+0x60:
84cb7f53 341b            xor     al,1Bh

nt!NtWaitForDebugEvent+0xb5:
84cb920a 341b            xor     al,1Bh

nt!NtDebugContinue+0x82:
84cb94f3 341b            xor     al,1Bh

nt!NtRemoveProcessDebug+0x6d:

这里使系统函数调用了dbgkdebugobjecttype我们要替换他  
换成我们自己造好的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
#ifndef VALIDACCESSMASK
#define VALIDACCESSMASK
 
 
#define OBJECT_TO_OBJECT_HEADER( o ) CONTAINING_RECORD( (o), OBJECT_HEADER_WIN7, Body )
 
 
typedef struct _OBJECT_DIRECTORY_ENTRY_WIN7{
    struct _OBJECT_DIRECTORY_ENTRY_WIN7 *ChainLink;
    PVOID Object;
    ULONG HashValue;
} OBJECT_DIRECTORY_ENTRY_WIN7, *POBJECT_DIRECTORY_ENTRY_WIN7;
 
 
typedef struct _OBJECT_TYPE_INITIALIZER_WIN7 {
 
    USHORT Length     ;
    USHORT type       ;
    //+0x002 ObjectTypeFlags  : UChar
    //+0x002 CaseInsensitive  : Pos 0, 1 Bit
    //+0x002 UnnamedObjectsOnly : Pos 1, 1 Bit
    //+0x002 UseDefaultObject : Pos 2, 1 Bit
    //+0x002 SecurityRequired : Pos 3, 1 Bit
    //+0x002 MaintainHandleCount : Pos 4, 1 Bit
    //+0x002 MaintainTypeList : Pos 5, 1 Bit
    PVOID ObjectTypeCode   ;
    PVOID InvalidAttributes ;
    GENERIC_MAPPING GenericMapping   ;
    PVOID ValidAccessMask  ;
    PVOID RetainAccess     ;
    POOL_TYPE PoolType      ;
    PVOID DefaultPagedPoolCharge ;
    PVOID DefaultNonPagedPoolCharge ;
    PVOID DumpProcedure    ;
    PVOID OpenProcedure    ;
    PVOID CloseProcedure   ;
    PVOID DeleteProcedure  ;
    PVOID ParseProcedure   ;
    PVOID SecurityProcedure ;
    PVOID QueryNameProcedure ;
    USHORT OkayToCloseProcedure ;
 
} OBJECT_TYPE_INITIALIZER_WIN7, *POBJECT_TYPE_INITIALIZER_WIN7;
 
typedef struct _OBJECT_CREATE_INFORMATION_WIN7 {
    ULONG Attributes;
    HANDLE RootDirectory;
    KPROCESSOR_MODE ProbeMode;
    ULONG PagedPoolCharge;
    ULONG NonPagedPoolCharge;
    ULONG SecurityDescriptorCharge;
    PVOID SecurityDescriptor;
    PSECURITY_QUALITY_OF_SERVICE SecurityQos;
    SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
} OBJECT_CREATE_INFORMATION_WIN7, *POBJECT_CREATE_INFORMATION_WIN7;
 
typedef struct _OBJECT_TYPE_WIN7 {
    LIST_ENTRY TypeList;         //         : _LIST_ENTRY
    UNICODE_STRING Name;         //             : _UNICODE_STRING
    PVOID DefaultObject;         //    : Ptr32 Void
    ULONG Index;         //            : UChar
    ULONG TotalNumberOfObjects;         // : Uint4B
    ULONG TotalNumberOfHandles;         // : Uint4B
    ULONG HighWaterNumberOfObjects;         // : Uint4B
    ULONG HighWaterNumberOfHandles;         // : Uint4B
    OBJECT_TYPE_INITIALIZER_WIN7 TypeInfo;         //         : _OBJECT_TYPE_INITIALIZER
    PVOID TypeLock;         //         : _EX_PUSH_LOCK
    ULONG Key;         //              : Uint4B
    LIST_ENTRY CallbackList;         //     : _LIST_ENTRY
} OBJECT_TYPE_WIN7, *POBJECT_TYPE_WIN7;
 
typedef struct _OBJECT_HEADER_WIN7 {
    //对象头部的指针计数,对对象头指针引用的计数
    LONG_PTR PointerCount;
    union {
        //句柄引用计数
        LONG_PTR HandleCount;
        PVOID NextToFree;
    };
    POBJECT_TYPE Type;
    //OBJECT_HEADER_NAME_INFO相对于此结构的偏移
    UCHAR NameInfoOffset;
    //OBJECT_HEADER_HANDLE_INFO相对于此结构的偏移
    UCHAR HandleInfoOffset;
    //OBJECT_HEADER_QUOTA_INFO相对于此结构的偏移
    UCHAR QuotaInfoOffset;
    UCHAR Flags;
 
    union {
        //创建对象是用于创建对象附加头的结构
        //里面保存了和附加对象头类似的信息
        PVOID ObjectCreateInfo;
        PVOID QuotaBlockCharged;
    };
    PSECURITY_DESCRIPTOR SecurityDescriptor;
    QUAD Body;
} OBJECT_HEADER_WIN7, *POBJECT_HEADER_WIN7;
 
 
 
 
 
 
EXTERN_C
{
    NTKERNELAPI
        NTSTATUS
        ObCreateObjectType(
        __in PUNICODE_STRING TypeName,
        __in POBJECT_TYPE_INITIALIZER_WIN7 ObjectTypeInitializer,
        __in_opt PSECURITY_DESCRIPTOR SecurityDesorintor,
        __in POBJECT_TYPE_WIN7 *ObjectType
 
        );
 
 
    NTKERNELAPI
        PVOID
        ObGetObjectType(
        __in PVOID pObject
        );
 
 
}
 
 
ULONG DbgkDebugObjectType=NULL;
ULONG DbgkMyDebugObjectType=NULL;
 
POBJECT_TYPE_WIN7 MyDebugObjectType=NULL;
 
OBJECT_TYPE_INITIALIZER_WIN7 ObjectTypeInitializer;
 
 
void CreateMyDebugObjectType(POBJECT_TYPE_WIN7 tmpObjectType,UNICODE_STRING MyObjectTypeName)
{
 
 
 
 
    RtlZeroMemory(&ObjectTypeInitializer,sizeof(ObjectTypeInitializer));
    ObjectTypeInitializer.Length=tmpObjectType->TypeInfo.Length;
    ObjectTypeInitializer.ObjectTypeCode=tmpObjectType->TypeInfo.ObjectTypeCode;
    ObjectTypeInitializer.InvalidAttributes=tmpObjectType->TypeInfo.InvalidAttributes;
    ObjectTypeInitializer.GenericMapping=tmpObjectType->TypeInfo.GenericMapping;
    ObjectTypeInitializer.ValidAccessMask=(PVOID) 0x001fffff;
    ObjectTypeInitializer.RetainAccess=tmpObjectType->TypeInfo.RetainAccess;
    ObjectTypeInitializer.PoolType=tmpObjectType->TypeInfo.PoolType;
    ObjectTypeInitializer.DefaultPagedPoolCharge=tmpObjectType->TypeInfo.DefaultPagedPoolCharge;
    ObjectTypeInitializer.DefaultNonPagedPoolCharge=tmpObjectType->TypeInfo.DefaultNonPagedPoolCharge;
 
 
    ObjectTypeInitializer.DumpProcedure=tmpObjectType->TypeInfo.DumpProcedure;
    ObjectTypeInitializer.OpenProcedure=tmpObjectType->TypeInfo.OpenProcedure;
    ObjectTypeInitializer.CloseProcedure=tmpObjectType->TypeInfo.CloseProcedure;
    ObjectTypeInitializer.DeleteProcedure=tmpObjectType->TypeInfo.DeleteProcedure;
    ObjectTypeInitializer.ParseProcedure=tmpObjectType->TypeInfo.ParseProcedure;
    ObjectTypeInitializer.SecurityProcedure=tmpObjectType->TypeInfo.SecurityProcedure;
    ObjectTypeInitializer.QueryNameProcedure=tmpObjectType->TypeInfo.QueryNameProcedure;
    ObjectTypeInitializer.OkayToCloseProcedure=tmpObjectType->TypeInfo.OkayToCloseProcedure;
 
 
    ObCreateObjectType(&MyObjectTypeName,&ObjectTypeInitializer,(PSECURITY_DESCRIPTOR)NULL,&MyDebugObjectType);
 
}
 
 
void InitMyDebugOjbetType(ULONG pObjectType)
{
        UNICODE_STRING MyObjectTypeName;
        POBJECT_TYPE_WIN7 tmpObjectType=(POBJECT_TYPE_WIN7)*(ULONG *)pObjectType;
        RtlInitUnicodeString(&MyObjectTypeName,L"MyDebugObject");
        if(MyDebugObjectType==NULL)
        {
 
            CreateMyDebugObjectType(tmpObjectType,MyObjectTypeName);
            DbgPrint("CreateMyDebugObjectType is succeed!!\n");
        }
        if (MyDebugObjectType!=NULL)
        {
            //*(DWORD *)pObjectType=(ULONG)MyFirstType;
            DbgPrint("pObObjectType is %x !\n",(ULONG *)pObjectType);
        }
        else
        {
            DbgPrint("CreateMyDebugObjectType is failed!\n");
        }
}
bool PickUpObjectType(ULONG pObjectType,PWCH Name)
{
    UNICODE_STRING CmpName;
    POBJECT_TYPE_WIN7 tmpObjectType=(POBJECT_TYPE_WIN7)*(ULONG *)pObjectType;
    CmpName.Length=tmpObjectType->Name.Length;
    CmpName.Buffer=Name;//如果字符串2超过字符串1长度,那么不管超出部分怎么填都是对的
    //DbgPrint("TestObjectType is %S!\n",CmpName.Buffer);
    if(RtlEqualUnicodeString(&tmpObjectType->Name,&CmpName,FALSE))
    {
         
        return true;
         
         
    }
    return false;
}
 
POBJECT_TYPE GetObpTypeObjectType_Win7()
{
    PUCHAR addr,p;
    UNICODE_STRING usObCreateObjectType;
    POBJECT_TYPE _ObpTypeObjectType=NULL;
    RtlInitUnicodeString(&usObCreateObjectType,L"ObCreateObjectType");
    addr=(PUCHAR)MmGetSystemRoutineAddress(&usObCreateObjectType);
    ASSERT(addr!=NULL);
    DbgPrint("ObCreateObjectType=0x%08x\n",addr);
    for (p=addr;p<addr+PAGE_SIZE;p++)
    {
        if ((*(PUCHAR)p==0xa1) && (*(PUCHAR)(p+5)==0xbb))
        {
            _ObpTypeObjectType=(POBJECT_TYPE)(*(PULONG)(p+1));
            DbgPrint("ObpTypeObjectType=0x%08x\n",_ObpTypeObjectType);
            return _ObpTypeObjectType;
        }
    }
    if (p==addr+PAGE_SIZE)
        DbgPrint("Cannot find ObpTypeObjectType!\n");
    return NULL;
}
 
void EnumObjectType_Win7()
{
    ULONG OffsetObjectTypeName;
    ULONG OffsetCreatorInfoObject;
    ULONG OffsetObjectIndexObjectType;
    POBJECT_TYPE ObpTypeObjectType;
    ULONG ObjectTypeTable[50]={0};
    int i=0;
 
    ULONG_PTR TypeObjectAddr;
    PLIST_ENTRY TypeObjectCreatorInfo;
    PLIST_ENTRY NextEntry;
    RTL_OSVERSIONINFOW VersionInformation;
 
    RtlGetVersion(&VersionInformation);
 
    if (VersionInformation.dwMajorVersion==6)//win7
    {
        OffsetObjectTypeName=0x08;
        OffsetCreatorInfoObject=0x28;
        OffsetObjectIndexObjectType=0x14;
        ObpTypeObjectType=GetObpTypeObjectType_Win7();
    }
    for(i=0;i<50;i++)
    {
        ObjectTypeTable[i]=(ULONG)ObpTypeObjectType+sizeof(ULONG)*i;
         
    }
    i=3;
    TypeObjectAddr=*(PULONG_PTR)ObpTypeObjectType;
    TypeObjectCreatorInfo=(PLIST_ENTRY)(TypeObjectAddr-OffsetCreatorInfoObject);
    NextEntry=TypeObjectCreatorInfo;
    while (NextEntry->Flink!=TypeObjectCreatorInfo)
    {
         
        if (PickUpObjectType(ObjectTypeTable[i],L"DebugObject"))
        {
            InitMyDebugOjbetType(ObjectTypeTable[i]);
        }
        if (PickUpObjectType(ObjectTypeTable[i],L"MyDebugObject"))
        {
            DbgkMyDebugObjectType=ObjectTypeTable[i];
            DbgPrint("DbgkMyDebugObjectType is %x !\n",DbgkMyDebugObjectType);
        }
        DbgPrint("TypeAddr=0x%08x,TypeName=%wZ,TypeIndex=%d\n",
            (ULONG_PTR)NextEntry+OffsetCreatorInfoObject,
            (PUNICODE_STRING)((ULONG_PTR)NextEntry+OffsetCreatorInfoObject+OffsetObjectTypeName),
            *(PUCHAR)((ULONG_PTR)NextEntry+OffsetCreatorInfoObject+OffsetObjectIndexObjectType));
        NextEntry=NextEntry->Flink;
        i++;
 
    }
 
}
 
void DeleteMyDebugObjectType()
{
    if (MyDebugObjectType!=NULL)
    {
        //ObMakeTemporaryObject(MyDebugObjectType);
        ObfDereferenceObject(MyDebugObjectType);
    }
}
 
void PatchDebugObjectType()
 
{
 
    DbgkDebugObjectType=(ULONG)GetSSDTFunctionAddr(96)+0x9a;
    DbgkDebugObjectType=*(PULONG)DbgkDebugObjectType;
    ULONG PassNtDebugActiveProcess=(ULONG)GetSSDTFunctionAddr(96)+0x9a;
    ULONG PassNtCreateDebugObject=(ULONG)GetSSDTFunctionAddr(61)+0x60;
    ULONG PassNtWaitForDebugEvent=(ULONG)GetSSDTFunctionAddr(387)+0xb5;
    ULONG PassNtDebugContinue=(ULONG)GetSSDTFunctionAddr(97)+0x82;
    ULONG PassNtRemoveProcessDebug=(ULONG)GetSSDTFunctionAddr(289)+0x6d;
    DbgPrint("DbgkDebugObjectType is %x!\n",*(PULONG)DbgkDebugObjectType);
    DbgPrint("PassNtDebugActiveProcess is %x!\n",*(PULONG)PassNtDebugActiveProcess);
    DbgPrint("PassNtCreateDebugObject is %x!\n", *(PULONG)PassNtCreateDebugObject);
    DbgPrint("PassNtCreateDebugObject is %x!\n",*(PULONG)PassNtWaitForDebugEvent);
    DbgPrint("PassNtWaitForDebugEvent is %x!\n",*(PULONG)PassNtDebugContinue);
    DbgPrint("PassNtRemoveProcessDebug is %x!\n",*(PULONG)PassNtRemoveProcessDebug);
    DbgPrint("DbgkMyDebugObjectType is %x!\n",DbgkMyDebugObjectType);
    if(DbgkMyDebugObjectType!=NULL)
    {
        WPOFF();
        KIRQL uKirql;
        uKirql =KeRaiseIrqlToSynchLevel();
        *(PULONG)PassNtDebugActiveProcess=DbgkMyDebugObjectType;
        *(PULONG)PassNtCreateDebugObject=DbgkMyDebugObjectType;
        *(PULONG)PassNtWaitForDebugEvent=DbgkMyDebugObjectType;
        *(PULONG)PassNtDebugContinue=DbgkMyDebugObjectType;
        *(PULONG)PassNtRemoveProcessDebug=DbgkMyDebugObjectType;
        KeLowerIrql(uKirql);
        WPON();
        DbgPrint("PatchDebugObjectType is succeed!\n");
    }
    else
    {
        DbgPrint("PatchDebugObjectType is failed!\n");
    }
 
 
}
void UnPatchDebugObjectType()
{
 
 
    ULONG PassNtDebugActiveProcess=(ULONG)GetSSDTFunctionAddr(96)+0x9a;
    ULONG PassNtCreateDebugObject=(ULONG)GetSSDTFunctionAddr(61)+0x60;
    ULONG PassNtWaitForDebugEvent=(ULONG)GetSSDTFunctionAddr(387)+0xb5;
    ULONG PassNtDebugContinue=(ULONG)GetSSDTFunctionAddr(97)+0x82;
    ULONG PassNtRemoveProcessDebug=(ULONG)GetSSDTFunctionAddr(289)+0x6d;
 
    if(DbgkDebugObjectType!=NULL)
    {
        WPOFF();
        KIRQL uKirql;
        uKirql =KeRaiseIrqlToSynchLevel();
        *(PULONG)PassNtDebugActiveProcess=DbgkDebugObjectType;
        *(PULONG)PassNtCreateDebugObject=DbgkDebugObjectType;
        *(PULONG)PassNtWaitForDebugEvent=DbgkDebugObjectType;
        *(PULONG)PassNtDebugContinue=DbgkDebugObjectType;
        *(PULONG)PassNtRemoveProcessDebug=DbgkDebugObjectType;
        KeLowerIrql(uKirql);
        WPON();
        DbgPrint("UnPatchDebugObjectType is succeed!\n");
    }
    else
    {
        DbgPrint("UnPatchDebugObjectType is failed!\n");
    }
 
 
}
 
void AntiValidAccessMask()
{
    EnumObjectType_Win7();
    PatchDebugObjectType();
}
 
 
void UnAntiValidAccessMask()
{
    UnPatchDebugObjectType();
    DeleteMyDebugObjectType();
}
 
#endif

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
赞赏记录
参与人
雪币
留言
时间
心游尘世外
为你点赞~
2024-5-31 05:57
QinBeast
为你点赞~
2024-5-31 05:49
飘零丶
为你点赞~
2024-4-3 00:47
shinratensei
为你点赞~
2024-2-20 02:24
PLEBFE
为你点赞~
2023-3-7 00:29
最新回复 (42)
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
前排招租!!!
2013-8-7 16:47
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
前排顶一下
2013-8-7 16:52
0
雪    币: 27
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
马克一下。
2013-8-7 17:01
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
自己构建调试子系统的路过...
至于非法的问题,是因为没有隐藏好
2013-8-7 17:02
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
你是指隐藏什么?非法是因为debugprot!
2013-8-7 17:04
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
进程,对象,窗口,句柄...
很多很多,包括调试对象,调试句柄...
它为什么非法?因为它可以识别到你
为什么它可以识别?因为你是用系统的东西,由系统机制创建的进程和系统的调试机制
而系统的东西,作为驱动保护,它会不知道吗?
所以最好的方式就是自己去构建,根本就不用系统的东西,可以少用,敏感的东西都不用
这样一来它就不认识你或很难识别,只能自己识别,所以也只能自己用
能达到这种程度,是要下很大功夫的,但是好处就是可以ANTI很多驱动保护,这可是很诱人的
2013-8-7 18:00
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
自己构建调试子系统的理论依旧能说下
或者发个科普贴

我想说说我的看法
1.ring3的应用程序原来是调用系统的调试机制的,但是我想让他调用我的,那么ring3那套api要HOOK
2.既然调试机制自己写,那么可以拷贝ring0的那些函数
3.但是拷贝了ring0的函数 结构还得拷贝
4.这样的好处是不会蓝屏  只对某个进程有效就行了 稳定性不用担心
求指证?真心求解!
2013-8-7 18:16
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
http://bbs.pediy.com/showthread.php?t=142443&highlight=GalaxyAP

复制是没用的,关键是要自己去深刻理解...
2013-8-7 18:22
0
雪    币: 46
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
怎么构建
怎么隐藏好
2013-8-7 18:22
0
雪    币: 219
活跃值: (878)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
11
看你好像 应该 也许 是超级模块作者?
2013-8-7 18:23
0
雪    币: 46
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
好吧
我 不假装了
其实他说的就是重建内核
仿照360挂钩KIFASTCALLENTRY
2013-8-7 18:25
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
不是 ,当我还没学计算机专业 我很喜欢易语言 很喜欢小烦的模块
2013-8-7 18:26
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
KIFASTCALLENTRY是ring3进入内核的大门吗?
2013-8-7 18:30
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
那我HOOK这个函数判读是OD 就让od进入我拷贝的内核 是不是可以呢?
2013-8-7 18:33
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
啊哦……正准备在win7上过tp
2013-8-7 18:33
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
17
你真的是只过了DebugPort清零一半,

非法的原因很简单,tp扫描内核,发现你Patch了内核就非法了.
2013-8-7 18:50
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
我想知道他怎么扫的 扫的方法是什么原理?为什么他就不扫ssdt呢?
那我觉得可能堆栈回溯过了【ebp+???】 不等于  xxx+ec
2013-8-7 18:55
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19

扫描内存还不简单,先获取内核基址,然后就匹配已经设定好了的特征码,就是 你提取的DebugPort函数的特征码,你一修改,TP自然就发现不对劲,搜索不到特征码了,就爆非法,

我已经过了TP的特征码扫描,当然知道TP怎么干的.
不得不夸奖TP,真聪明的做法,直接把PatchDebugPort端口过清零的方法秒杀了.
2013-8-7 19:19
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
扫特征的话肯定得读取周边地址  我去断断看 。。。这么说来 的确
2013-8-7 19:29
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
21
你这么一说。。。既然他要读那么假如我能在内核制造异常,他读的时候就出异常,那么把ec给他,恢复异常如此循环  
如果内核异常处理搞懂了 相信drx也过了  crc也无视了

不知大神是否也是通过制造异常  HOOK idt  的方法Pass的?
2013-8-7 19:38
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
22
不是用的硬件断点方法,我用的某淫 荡的手法过的,具体,当然不会公开,公开必和谐.
2013-8-7 19:46
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
23
没说硬断啊  我是说异常中断让他进入蓝屏函数
我HOOK蓝屏函数
2013-8-7 19:49
0
雪    币: 6855
活跃值: (1359)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
顶一下楼主
2013-8-7 19:51
0
雪    币: 10090
活跃值: (2947)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
mark一下
2013-8-7 23:35
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册