首页
社区
课程
招聘
[讨论]周末有点时间系列:让别人不能CALL我们的那些函数
发表于: 2013-1-19 14:22 20236

[讨论]周末有点时间系列:让别人不能CALL我们的那些函数

2013-1-19 14:22
20236

这个话题,主要是因为跟朋友讨论一些小技术时,引发出来的,于是做了点笔记,不敢独享,故而发出来。
从线程入手就行了,不去使用可以被驱动拦截和监控的ZwSetInfomationThread和ZwQueryInformationThread而使用只操作用户层内存的三个函数:
RtlPushFrame
RtlGetFrame
RtlPopFrame
完全定义形态:
typedef  VOID (NTAPI *T_RtlPushFrame)(
        PTEB_ACTIVE_FRAME Frame
        );
typedef PTEB_ACTIVE_FRAME (NTAPI *T_RtlGetFrame)(
        VOID
        );

typedef VOID (NTAPI *T_RtlPopFrame)(
        PTEB_ACTIVE_FRAME Frame
        );

其中PTEB_ACTIVE_FRAME的定义(通过windbg可以获得):
typedef struct TEB_ACTIVE_FRAME_CONTEXT
{
        /* 0x000 */ ULONG   Flags;
        /* 0x004 */ PSTR    FrameName;

} TEB_ACTIVE_FRAME_CONTEXT, *PTEB_ACTIVE_FRAME_CONTEXT;

typedef struct TEB_ACTIVE_FRAME
{
        /* 0x000 */ ULONG                       Context;  // Flags;
        /* 0x004 */ struct TEB_ACTIVE_FRAME    *Previous;
        /* 0x008 */ PTEB_ACTIVE_FRAME_CONTEXT   pContext;
} TEB_ACTIVE_FRAME, *PTEB_ACTIVE_FRAME;

具体的封装应用的逻辑:
一个自己的创建线程的封装(自己的线程除了系统给的第一个之外都是自己建立的)。
一个通用的检测函数,在某些关键函数(比如发包前的加密的函数,某个重要操作的函数)里加入调用检测函数(当然要适当使用VMP这类高强度的壳的SDK保护好自己的这套逻辑才好)。
封装一个设置给主线程和某些不明线程的使用的设置标识的函数。
封装一个用于清理的函数。

详情参看如下代码:

首先是头文件部分:

#pragma once
#include <windows.h>
#include <winternl.h>
#include <ntstatus.h>
typedef struct TEB_ACTIVE_FRAME_CONTEXT
{
	/* 0x000 */ ULONG   Flags;
	/* 0x004 */ PSTR    FrameName;

} TEB_ACTIVE_FRAME_CONTEXT, *PTEB_ACTIVE_FRAME_CONTEXT;

typedef struct TEB_ACTIVE_FRAME
{
	/* 0x000 */ ULONG                       Context;  // Flags;
	/* 0x004 */ struct TEB_ACTIVE_FRAME    *Previous;
	/* 0x008 */	PTEB_ACTIVE_FRAME_CONTEXT   pContext;
} TEB_ACTIVE_FRAME, *PTEB_ACTIVE_FRAME;
typedef struct _THREADPARAM_
{
	PVOID Context;
	LPTHREAD_START_ROUTINE Routine;
}THREADPARAM,*PTHREADPARAM;
struct _OWN_THREAD_CONTEXT_ : public TEB_ACTIVE_FRAME
{
	DWORD dwThreadId;
	struct _OWN_THREAD_CONTEXT_ *Own;
};
typedef  VOID (NTAPI *T_RtlPushFrame)(
	PTEB_ACTIVE_FRAME Frame
	);
typedef PTEB_ACTIVE_FRAME (NTAPI *T_RtlGetFrame)(
	VOID
	);

typedef VOID (NTAPI *T_RtlPopFrame)(
	PTEB_ACTIVE_FRAME Frame
	);
#define OWN_THREAD_FLAGS ULONG('MJMJ')
VOID SetOwnThread();//设置当前线程标志
BOOL IsOwnThread();//检测当前线程是否有标志,无标志返回FALSE有返回TRUE
VOID CleanUpOwnThread();//对当前线程清空标志
BOOL _CreateThreadEx(LPTHREAD_START_ROUTINE lpThreadRoutine,LPVOID lparam,PHANDLE pThreadHandle,PDWORD pThreadId);//创建新线程封装函数

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 6
支持
分享
最新回复 (30)
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
2
第一位啊!赶上直播了!
2013-1-19 14:25
0
雪    币: 7146
活跃值: (3731)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
asd
3
沙个发
2013-1-19 14:25
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
4
顶 楼上的楼上
2013-1-19 14:35
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
顶了个顶
2013-1-19 16:15
0
雪    币: 102
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我是来顶V大的
2013-1-19 16:22
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
7
启发 很好.......
2013-1-19 16:58
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习................
2013-1-19 17:45
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不错.好厉害
2013-1-19 17:55
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
支持老V。。。。。。。。。。。。。。。。。。。。
2013-1-19 19:02
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
good~~~~~~~~~~~~~~
2013-1-20 10:20
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
看看,膜拜123456
2013-1-20 11:57
0
雪    币: 17
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
顶下..这个方法牛X.
2013-1-21 09:48
0
雪    币: 2314
活跃值: (2205)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
14
思路不错。                    ——
2013-1-22 20:30
0
雪    币: 74
活跃值: (748)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
支持老V不解释
2013-1-22 20:55
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
用 TLS 怎么样?
2013-1-22 22:29
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
来学习一下,好资料顶个
2013-1-23 01:48
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
老V出品必属精华,先顶再看
2013-1-23 13:51
0
雪    币: 97697
活跃值: (200829)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
19
Thanks for share.
2013-1-24 11:28
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
对于3D游戏这样的大工程,显然有很多弊病,不然还不如逐级使用VMP SDK(一些循环费时都函数就不VM了,因为大部分游戏,最多返回8-9层就到了消息层了)。

一个更好的方法是从鼠标键盘消息层就加入检测函数,然后在发包加密层对相应的动作发包时做检测(选几个典型的动作就行了,比如走路 捡物)。
2013-1-24 16:41
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
21
大型3D游戏的工程更简单(小工程因为作坊式开发导致问题多多多多),一般在线程类的创建和回收的代码里加2个函数就搞定了~
检测就直接放在明文包或者加密的地方(几个OnXXX函数上)就完了,2GB代码量的某个游戏修改15行代码就完成这个事儿~~
2013-1-24 18:51
0
雪    币: 357
活跃值: (3443)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
22
我一般在TEB里设置东西..

7DF0FABA RtlGetFrame     64:A1 18000000  MOV EAX,FS:[18]
7DF0FAC0                 8B80 B00F0000   MOV EAX,[EAX+FB0]
7DF0FAC6                 C3              RETN

7D862C95 TlsGetValue     8BFF            MOV EDI,EDI
7D862C97                 55              PUSH EBP
7D862C98                 8BEC            MOV EBP,ESP
7D862C9A                 64:A1 18000000  MOV EAX,FS:[18]
7D862CA0                 8B4D 08         MOV ECX,[EBP+8]
7D862CA3                 8360 34 00      AND DWORD PTR [EAX+34],0
7D862CA7                 83F9 40         CMP ECX,40
7D862CAA                 73 09           JNB SHORT 7D862CB5
7D862CAC                 8B8488 100E0000 MOV EAX,[EAX+ECX*4+E10]
7D862CB3                 EB 14           JMP SHORT 7D862CC9
7D862CB5                 81F9 40040000   CMP ECX,440
7D862CBB                 72 10           JB SHORT 7D862CCD
7D862CBD                 68 0D0000C0     PUSH C000000D
7D862CC2                 E8 9B390200     CALL 7D886662
7D862CC7                 33C0            XOR EAX,EAX
7D862CC9                 5D              POP EBP
7D862CCA                 C2 0400         RETN 4
7D862CCD                 8B80 940F0000   MOV EAX,[EAX+F94]
7D862CD3                 85C0            TEST EAX,EAX
7D862CD5               ^ 74 F0           JE SHORT 7D862CC7
7D862CD7                 8B8488 00FFFFFF MOV EAX,[EAX+ECX*4-100]
7D862CDE               ^ EB E9           JMP SHORT 7D862CC9
2013-1-24 19:24
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
看不懂。。。这样和自己用一个map保存有什么区别?
2013-1-24 20:52
0
雪    币: 1318
活跃值: (149)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
Thanks for share.
2013-1-24 21:07
0
雪    币: 94
活跃值: (465)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
这个系统能通用么?兼容性怎么样?64位OK?
2013-1-25 08:06
0
游客
登录 | 注册 方可回帖
返回
//