作者:six_L 此贴贴于2020-7-5 14:07:34,已被阅读177次/回复1 
TLS回调功能

option casemap:none
option win64:7

include \UASM64\include\windows.inc
include    \UASM64\include\tlhelp32.inc

includelib \UASM64\Lib\kernel32.lib
includelib \UASM64\Lib\user32.lib
includelib \UASM64\Lib\gdi32.lib
includelib \UASM64\Lib\advapi32.lib

PUBLIC   _tls_index
PUBLIC   _tls_used

x_LUID_AND_ATTRIBUTES STRUCT
    LowPart            DWORD      ?
    HighPart        DWORD      ?
    attributes        DWORD      ?
x_LUID_AND_ATTRIBUTES ENDS

x_TOKEN_PRIVILEGES STRUCT
    privilegecount        DWORD      ?
    theluid            x_LUID_AND_ATTRIBUTES   <?>
x_TOKEN_PRIVILEGES ENDS

x_IMAGE_TLS_DIRECTORY STRUCT 
    StartAddressOfRawData   QWORD ?
    EndAddressOfRawData    QWORD ?
    AddressOfIndex        QWORD ?
    AddressOfCallBacks    QWORD ?
    SizeOfZeroFill        DWORD ?
    Characteristics        DWORD ?
x_IMAGE_TLS_DIRECTORY ENDS

    ICO_MAIN    equ    1000h
    DLG_MAIN    equ    1

.data?
    hInstance    qword    ?
    hMainhWnd    qword    ?
    hFont        qword    ?
    dwTxtColor    dword    ?
    dqColorCnt    qword    ?

.data
    OurTxt        db "Hello The World!", 0
    TxtColorTable    dd 0FFH,0FF00H,0FF0000H,0FFFF00H,0FF00FFH,0FFFFH
    ColorFlag    BOOL FALSE

.code

_ProcDlgMain Proc USES RDI hWnd:qword,wMsg:dword,wParam:qword,lParam:qword
    local ps:PAINTSTRUCT

    mov    eax,wMsg
    .if    eax == WM_INITDIALOG
        mov    rax,hWnd
        mov    hMainhWnd,rax
        invoke    LoadIcon,hInstance,ICO_MAIN
        invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,rax
        
        invoke  CreateFont,54,0,0,0,FW_BOLD,FALSE,FALSE,FALSE, \
                DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, \
                DEFAULT_QUALITY,FIXED_PITCH, CStr("Cambria")
        mov    hFont, rax
        
        invoke    SetTimer, hWnd, 1, 1500, 0
        mov    dwTxtColor,0ff00h
        mov    dqColorCnt,0

    .elseif    eax == WM_COMMAND
        mov    rax,wParam
        .if    ax ==    IDCANCEL
            invoke    EndDialog,hWnd,NULL
        .elseif    ax ==    IDOK
            .if ColorFlag == TRUE
                invoke SetDlgItemText, hWnd, IDOK, CStr('ChangeColor')
                mov ColorFlag,FALSE
            .else
                invoke SetDlgItemText, hWnd, IDOK, CStr('StopChange')
                mov ColorFlag,TRUE
            .endif
        .endif

    .elseif    eax == WM_PAINT
        
        invoke    BeginPaint,hWnd,addr ps
        
        invoke    SelectObject,ps.hdc,hFont
        invoke    SetBkMode,ps.hdc,TRANSPARENT
        invoke    SetTextColor,ps.hdc,dwTxtColor
        
        invoke    TextOut,ps.hdc,50,80,addr OurTxt,sizeof OurTxt

        invoke    EndPaint, hWnd, addr ps
    
    .elseif eax == WM_TIMER
        
        .if ColorFlag == TRUE

            lea    rdi,TxtColorTable
            mov    rax,dqColorCnt
            mov    rcx,[rdi+rax*4]
            mov    dwTxtColor,ecx
            
            invoke    UpdateWindow, hWnd
            invoke  InvalidateRect,hWnd,NULL,NULL

            inc    dqColorCnt
            .if    dqColorCnt == 6
                mov    dqColorCnt,0
            .endif
        .endif

    .elseif    eax == WM_CLOSE
        
        invoke    KillTimer, hWnd, 1
        invoke    DeleteObject, hFont
        invoke    EndDialog,hWnd,NULL

    .else
        mov    rax,FALSE
        ret
    .endif
    mov    rax,TRUE
    ret

_ProcDlgMain    endp

WinMainCRTStartup Proc
    
    invoke    GetModuleHandle,NULL
    mov    hInstance,rax
    invoke    DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
    invoke    ExitProcess,NULL
    ret

WinMainCRTStartup  Endp

AdjustToken proc lpszPrivilege:QWORD
    LOCAL hProcessHandle:QWORD
    LOCAL hToken:QWORD
    LOCAL sedebugnameValue:x_LUID_AND_ATTRIBUTES
    LOCAL tkp:x_TOKEN_PRIVILEGES

    invoke GetCurrentProcess       ; get the current process handle
    mov hProcessHandle,rax        ; save it to hProcessHandle

    invoke OpenProcessToken,hProcessHandle,TOKEN_ADJUST_PRIVILEGES OR TOKEN_QUERY,ADDR hToken
    .if rax==0
        mov    rax,FALSE
        ret
    .endif

    invoke LookupPrivilegeValue,NULL,lpszPrivilege,ADDR sedebugnameValue
    .if rax==0
        invoke    CloseHandle,hToken
        mov    rax,FALSE
        ret
    .endif
    
    lea rax, sedebugnameValue               ; address of sedebugnameValue into rax

    ; Contents of sedebugnameValue into ecx:edx
    mov ecx, (x_LUID_AND_ATTRIBUTES PTR [rax]).LowPart
    mov edx, (x_LUID_AND_ATTRIBUTES PTR [rax]).HighPart

    lea rax, tkp                   ; address of tkp into rax
    
    mov (x_TOKEN_PRIVILEGES PTR [rax]).privilegecount, 1
    mov (x_TOKEN_PRIVILEGES PTR [rax]).theluid.LowPart, ecx
    mov (x_TOKEN_PRIVILEGES PTR [rax]).theluid.HighPart, edx
    mov (x_TOKEN_PRIVILEGES PTR [rax]).theluid.attributes, SE_PRIVILEGE_ENABLED

    invoke AdjustTokenPrivileges,hToken,FALSE, addr tkp, sizeof tkp, NULL, NULL
    .if rax==0
        invoke    CloseHandle,hToken
        mov    rax,FALSE
        ret
    .endif
    
    mov    rax,TRUE
    ret

AdjustToken endp

GetProcessIdByProcessName proc @ProcessName:QWORD
    LOCAL pi:PROCESSENTRY32
    LOCAL @Pid:DWORD
    LOCAL hSnapshot:QWORD

    mov    pi.dwSize, sizeof pi
    invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS, 0
    mov    hSnapshot, rax
    invoke Process32First, rax, ADDR pi
    .while rax
        invoke lstrcmp,@ProcessName,ADDR pi.szExeFile
        .if rax == 0
            mov eax,pi.th32ProcessID
            mov @Pid,eax
            .break
        .endif
        invoke Process32Next,hSnapshot, ADDR pi
    .endw
    invoke    CloseHandle,hSnapshot
    mov    rax,qword ptr @Pid
    ret

GetProcessIdByProcessName endp

tlsfunc_1_Message PROC

    inc _tlsfuncRunCnt
    mov rax,_tlsfuncRunCnt
    .if rax == 1
        call GetCommandLine
        invoke MessageBox,0,rax,CStr("tlsfunc_1_Message"),MB_OK
    .endif
    ret

tlsfunc_1_Message ENDP

tlsfunc_2_Kdebug PROC

    inc _tlsfuncRunCnt
    mov rax,_tlsfuncRunCnt
    .if rax == 5
        invoke AdjustToken,CStr("SeDebugPrivilege")
        invoke GetProcessIdByProcessName,CStr("x64dbg.exe")
        invoke OpenProcess, PROCESS_TERMINATE, 1,eax    ; eax=process id
        invoke TerminateProcess, rax, 1            ;-1 for never
    .endif
    ret

tlsfunc_2_Kdebug ENDP

tlsfunc_3_notepad PROC
    LOCAL startInfo:STARTUPINFO
    LOCAL processInfo:PROCESS_INFORMATION

    inc _tlsfuncRunCnt
    mov rax,_tlsfuncRunCnt
    .if rax == 9
        invoke GetStartupInfo,ADDR startInfo
        invoke CreateProcess,CStr("c:\Windows\notepad.exe"),NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,ADDR startInfo,ADDR processInfo
        invoke CloseHandle,processInfo.hThread
    .endif
    ret

tlsfunc_3_notepad ENDP

.data     
    _tls_index    QWORD 0
    array_tls_index QWORD _tls_index, 0
    array_tls_func    QWORD tlsfunc_1_Message,tlsfunc_2_Kdebug,tlsfunc_3_notepad, 0
    _tlsfuncRunCnt    QWORD 0    ;控制何处运行哪个TLS回调函数

    _tls_used    x_IMAGE_TLS_DIRECTORY <0,0,array_tls_index,array_tls_func,0,0> ;TLS数据结构


end


#include <\UASM64\include\resource.h>

#define    ICO_MAIN        0x1000    
#define    DLG_MAIN        1

ICO_MAIN    ICON        "Main.ico"

DLG_MAIN DIALOG 293, 180, 260, 144
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "TextoutForColor"
FONT 9, "Cambria"
{
 PUSHBUTTON "ChangeColor", IDOK, 130, 125, 60, 14
 PUSHBUTTON "Exit", IDCANCEL, 195, 125, 60, 14
}

此贴的回复贴(直接):
TLS回调功能说明163 six_L 2020-7-5 14:33:21 319 正常