---
# System prepended metadata

title: anti note

---

# what is this note
this note record things i learned in study anti sandbox
# progess
studying al-khaser(source code)
link : https://github.com/LordNoteworthy/al-khaser
# TODO
ring0 antidebug study
# tls callback
## tls into
https://learn.microsoft.com/en-us/windows/win32/procthread/thread-local-storage

## callback funtion
callback funtion will be called when main thread/others thread create/detach (this will cause different dwreason)

because of this ?, malware can check whether is in debug/vm (mitre : injection seem workable here?)

## checking implemention(key code)
```
//note : linker and reg callback is neccessary
//callback will be call during the execute of while
while (tls_callback_process_event == NULL && ++fuse != BLOWN) { SwitchToThread(); }

// we will check dwReason here, if it is attach -> fail the test
VOID WINAPI tls_callback(PVOID hModule, DWORD dwReason, PVOID pContext)
if (dwReason == DLL_PROCESS_ATTACH)
	{
		OutputDebugString(L"TLS callback: process attach");
		tls_callback_process_data = 0xDEADBEEF;
		SetEvent(tls_callback_process_event);
	}
```
## reference
https://learn.microsoft.com/en-us/windows/win32/procthread/thread-local-storage
https://xz.aliyun.com/t/12057
https://learn.microsoft.com/en-us/windows/win32/dlls/dllmain

# IsDebuggerPresentAPI
we will call the win32 api *IsDebuggerPresent()* to check if process is in user debug mode (return PEB->BeingDebugged flag)

# checkRemoteDebuggerPresentAPI
call *ntqueryinformationprocess* with *processinfoclass* = 7
*ntqueryinformationprocess* -> retrieve info about process(get port of debugger for process)
Q : what did this api check?
https://www.52pojie.cn/thread-1432590-1-1.html

## hint : above two api is check at ring3  
ring0 study : https://www.52pojie.cn/thread-1426244-1-1.html (TODO)

# ntglobalflag
gs register : for os , manage thread-specific memory(windows)
TODO : check gs register from gdb?
check *ntglobalflag* (some flag will be set if debug mode is open)
```
__readgsqword(0x60) + 0xBC)
```
TODO : how to get process PEB

# readHeapFlags(getforce flags : after 0x70, also 4bytes)
we can check the flags in heap to specify if process under debugger(added debug process creation flags in CreateProcess)
```
pProcessHeap = (PINT64)(__readgsqword(0x60) + 0x30);
		pHeapFlags = (PUINT32)(*pProcessHeap + 0x70);
```
# lowfragmentionheap
check frontendheap == NULL

# direct call ntqueryinfoprocess 
just the implementation of checkRemoteDebuggerPresentAPI

use ntqueryinformationprocess to check if nodebuginherit exitst

Q : NoDebugInherit not in manual. read wrong api manual= =
Q2 : 0x1e not match in manual?(0x1f also not)

# WUDFPlatform.dll
three check debug funtion can use
Q : the usage of this dll?


# ntsetinfothread

1. set aligof
2. init two api(set/get thread info)
3. check windows version
4. 0x11 == ThreadHideFromDebugger (https://geoffchappell.com/studies/windows/km/ntoskrnl/api/ps/psquery/class.htm)
TODO : this funtion include hook checking, so come back after learining hook
(antidebug part) basically, this funtion just use api to block the debugger


# ANTI-DEBUG TRICK NOTE
link : https://anti-debug.checkpoint.com/

## debug flags

### overview 
some flag will be set if program is in debug mode, we can specify these flag by using API or read system tables in memory

#### IsdebuggerPresent()
check PEB->BeingDebugged
#### CheckRemoteDebuggerPresent()
use *NtQueryInformationProcess* with class = 7 internel
Q : what is the principle of gdb?(why port)
#### NtQueryInformationProcess()
getcurrentprocess -> 7 -> check port
getcurrentprocess -> 0x1f -> get EPROCESS !nodebuginherit
                  -> 0x1e -> get debug object(kernel object)

#### QueryProcessDebugInformation
從heap讀一個Flags
Q : struct of heap?
#### NtQuerySystemInformation
0x23 class <- (1) enable(2) notpresent

#### mitigation
1. change epb
2. hook and set/modify return value

### manual check

#### PEB -> BeingDebugged Flag

note : fs/gs -> thread informaion block

#### ntGlobalFlag 
flag will be set 
if process is created by debugger
#### heap flags
1.Flags 2.ForceFlags
#### heap protection
1.針對tail
2.針對next memory block
#### KUSER_SHARED_DATA
0x7ffe02d4 = 0x7ffe0000(location of struct) + 0x02d4(KdDebuggerEnabled)
0x01 or 0x02 will be set if kernel debugger working

## object handle
### openProcess()
csrss.exe can only be opened when process is admin&has debug privileges
### CreateFile()
CREATE_PROCESS_DEBUG_EVENT : event that process being open(debugger first received event)

如果debugger正在運行，則CreateFileA會失敗(debugger會因為有handle沒有關?)?
### CloseHandle()
當process在debugger下，嘗試關一個不存在的handle會throw exception
### LoadLibrary()
和Createfile類似，只是不同event被觸發

### ntqueryobject()
如果有任何debugger開始被使用，有kernel object(debug object)會被create，可以透過ntqueryobject來訪問這個object是否有被創造
user1 -> malware -> call ntqeuryobject -> debug object
user2 -> normal -> debugger -> debug object
### mitigations 
基本上都可以用hook並修改return value來達成
