x64汇编案例5
x64汇编案例51)案例介绍咱们平时在公司开发软件或是自己写代码卖给客户的时候肯定都做过各种各样的软件防御和反调试检测保护吧像常见的调试类ODx64dbgIDA还有抓包类BurpFiddler都是我们重点要防范的对象。遇到这些逆向分析工具咱们是不是最常用的方法就是调用Win32API里的Process32Next函数遍历系统里正在运行的进程。一旦检测到上面这些风险进程名称存在咱们的程序就直接拒绝启动从源头阻止逆向破解。当然啦这种基础的进程检测防护放到现在来说防护力度已经比较简单很容易被绕过。各位不用着急等后面的进阶逆向课程还有驱动开发课程咱会一步步教大家更深入的技术带大家搞懂怎么从R3应用层到R0内核层甚至包括DMA相关的绕过和检测思路实现各种防护绕过和更强的安全对抗彻底吃透软件攻防的核心逻辑。题外话PCIe三层物理层排线金手指差分信号传输数据链路层校验重传帧封装事务层最重要发读写请求DMA指令都是走这层DMA板子插入PCIe插槽主板枚举PCIe设备系统分配BAR(BaseAddressRegister-基地址寄存器)地址板子通过PCIe事务层下发DMA读写TLP包直接跨过CPU绕过系统保护读写整机物理内存上位机软件再和DMA板子通信读游戏内存写内存2案例x64汇编案例51)案例介绍咱们平时在公司开发软件或是自己写代码卖给客户的时候肯定都做过各种各样的软件防御和反调试检测保护吧像常见的调试类ODx64dbgIDA还有抓包类BurpFiddler都是我们重点要防范的对象。遇到这些逆向分析工具咱们是不是最常用的方法就是调用Win32API里的Process32Next函数遍历系统里正在运行的进程。一旦检测到上面这些风险进程名称存在咱们的程序就直接拒绝启动从源头阻止逆向破解。当然啦这种基础的进程检测防护放到现在来说防护力度已经比较简单很容易被绕过。各位不用着急等后面的进阶逆向课程还有驱动开发课程咱会一步步教大家更深入的技术带大家搞懂怎么从R3应用层到R0内核层甚至包括DMA相关的绕过和检测思路实现各种防护绕过和更强的安全对抗彻底吃透软件攻防的核心逻辑。题外话PCIe三层物理层排线金手指差分信号传输数据链路层校验重传帧封装事务层最重要发读写请求DMA指令都是走这层DMA板子插入PCIe插槽主板枚举PCIe设备系统分配BAR(BaseAddressRegister-基地址寄存器)地址板子通过PCIe事务层下发DMA读写TLP包直接跨过CPU绕过系统保护读写整机物理内存上位机软件再和DMA板子通信读游戏内存写内存2案例x64汇编案例51)案例介绍咱们平时在公司开发软件或是自己写代码卖给客户的时候肯定都做过各种各样的软件防御和反调试检测保护吧像常见的调试类ODx64dbgIDA还有抓包类BurpFiddler都是我们重点要防范的对象。遇到这些逆向分析工具咱们是不是最常用的方法就是调用Win32API里的Process32Next函数遍历系统里正在运行的进程。一旦检测到上面这些风险进程名称存在咱们的程序就直接拒绝启动从源头阻止逆向破解。当然啦这种基础的进程检测防护放到现在来说防护力度已经比较简单很容易被绕过。各位不用着急等后面的进阶逆向课程还有驱动开发课程咱会一步步教大家更深入的技术带大家搞懂怎么从R3应用层到R0内核层甚至包括DMA相关的绕过和检测思路实现各种防护绕过和更强的安全对抗彻底吃透软件攻防的核心逻辑。题外话PCIe三层物理层排线金手指差分信号传输数据链路层校验重传帧封装事务层最重要发读写请求DMA指令都是走这层DMA板子插入PCIe插槽主板枚举PCIe设备系统分配BAR(BaseAddressRegister-基地址寄存器)地址板子通过PCIe事务层下发DMA读写TLP包直接跨过CPU绕过系统保护读写整机物理内存上位机软件再和DMA板子通信读游戏内存写内存2案例x64汇编案例51)案例介绍咱们平时在公司开发软件或是自己写代码卖给客户的时候肯定都做过各种各样的软件防御和反调试检测保护吧像常见的调试类ODx64dbgIDA还有抓包类BurpFiddler都是我们重点要防范的对象。遇到这些逆向分析工具咱们是不是最常用的方法就是调用Win32API里的Process32Next函数遍历系统里正在运行的进程。一旦检测到上面这些风险进程名称存在咱们的程序就直接拒绝启动从源头阻止逆向破解。当然啦这种基础的进程检测防护放到现在来说防护力度已经比较简单很容易被绕过。各位不用着急等后面的进阶逆向课程还有驱动开发课程咱会一步步教大家更深入的技术带大家搞懂怎么从R3应用层到R0内核层甚至包括DMA相关的绕过和检测思路实现各种防护绕过和更强的安全对抗彻底吃透软件攻防的核心逻辑。题外话PCIe三层物理层排线金手指差分信号传输数据链路层校验重传帧封装事务层最重要发读写请求DMA指令都是走这层DMA板子插入PCIe插槽主板枚举PCIe设备系统分配BAR(BaseAddressRegister-基地址寄存器)地址板子通过PCIe事务层下发DMA读写TLP包直接跨过CPU绕过系统保护读写整机物理内存上位机软件再和DMA板子通信读游戏内存写内存2案例;Project mouse right - Build Dependencies - Build Customizations;Project mouse file.asm - propertis - item type - Microsoft Macro Assembler; Only rely on VS2022 built-in tools, no need for external MASM32 libraryoption casemap:none; Link required libraries for x64 Windows resolve external symbolsincludelib ucrt.lib ; Universal C Runtime Library contains printf implementationincludelib legacy_stdio_definitions.lib ; Provides legacy stdio function symbols printf compatibilityincludelib kernel32.lib ; Windows Kernel32 library contains ExitProcessincludelib psapi.lib ; Process Status APIexterndef printf:proc; Windows apiexterndef MessageBoxA:procexterndef ExitProcess:procexterndef GetSystemTime:procexterndef Sleep:procexterndef CreateToolhelp32Snapshot:procexterndef Process32First:procexterndef Process32Next:procexterndef CloseHandle:procexterndef GetLastError:proc.dataszTitle db x64 Process Lister, 0szMsg db Process Listing Complete, 0; Print process info PID full process nameszProcFormat db Process ID: %lu, Name: %s, 0Ah, 0; Error message format strings include GetLastError() codeszSnapErr db Failed to create process snapshot (Error Code: %lu), 0Ah, 0szFirstErr db Failed to retrieve first process (Error Code: %lu), 0Ah, 0szNextErr db Failed to retrieve next process (Error Code: %lu), 0Ah, 0; STANDARD WINDOWS x64 PROCESSENTRY32 STRUCTURE; Size 304 bytes (0x130)PROCESSENTRY32 structdwSize dd ? ; 0x00: Size of the structurecntUsage dd ? ; 0x04: Number of references to the processth32ProcessID dd ? ; 0x08: Unique process ID PIDpad1 dd ? ; 0x0C: 4 byte paddingth32DefaultHeapID dq ? ; 0x10: Process default heap ID (x64 8 bytes)th32ModuleID dd ? ; 0x18: Process module IDcntThreads dd ? ; 0x1C: Number of threads in the processth32ParentProcessID dd ? ; 0x20: Parent process ID PPIDpcPriClassBase dd ? ; 0x24: Base priority of process threadsdwFlags dd ? ; 0x28: FlagsszExeFile db 260 dup(0) ; 0x2C: Full path/name of the process executable MAX_PATH260PROCESSENTRY32 ends; Align structure instance to 16 bytealign 16pe32 PROCESSENTRY32 ; Instance of PROCESSENTRY32 for process data.code;----------------------------------------------------------------------; Notes: - Follows x64 stack alignment rules sub rsp, 40h for shadow space; - Properly cleans up handles to avoid resource leaks; - Uses standard Windows API error handling GetLastError;----------------------------------------------------------------------; C function testGetProcess()testGetProcess proc; Allocate 32 bytes of shadow space 8 bytes for alignmentsub rsp, 40h; CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)mov rcx, 0Bh ; TH32CS_SNAPPROCESS 0x0B snapshot all processesmov rdx, 0 ; th32ProcessID 0 enumerate all processescall CreateToolhelp32Snapshot; Check if snapshot handle is INVALID_HANDLE_VALUE -1cmp rax, -1jne SnapshotSuccess ; Jump if snapshot created successfully; Snapshot failedcall GetLastErrormov rcx, offset szSnapErr ; Error format stringmov rdx, rax ; Error code from GetLastError()call printf ; Print error messagejmp Cleanup ; Jump to stack cleanupSnapshotSuccess:mov rbx, rax; Init PROCESSENTRY32 structure; Set dwSize to the correct size of PROCESSENTRY32 304 bytes 0x130mov dword ptr [pe32.dwSize], 304; Get first process in the snapshot Process32First(snapshot_handle, pe32)mov rcx, rbx ; 1 param snapshot handlelea rdx, [pe32] ; 2 param pointer to PROCESSENTRY32 instancecall Process32First; Check if Process32First succeededtest rax, raxjnz ProcessLoop ; Jump if first process retrieved; Process32First failedcall GetLastErrormov rcx, offset szFirstErrmov rdx, raxcall printfjmp CloseSnapshot ; Jump to close snapshot handleProcessLoop:; Print current process info (PID full executable name); printf(szProcFormat, PID, szExeFile)mov rcx, offset szProcFormat ; 1 param format stringmov edx, [pe32.th32ProcessID] ; 2 param PIDlea r8, [pe32.szExeFile] ; 3 parma pointer to full process namecall printf; Get next process in the snapshot Process32Next(snapshot_handle, pe32)mov rcx, rbx ; 1 parma snapshot handlelea rdx, [pe32] ; 2 param pointer to PROCESSENTRY32call Process32Next; Continue loop if next process exists non-zero return successtest rax, raxjnz ProcessLoop ; Repeat if more processes; Check if Process32Next failedcall GetLastErrorcmp rax, 18 ; ERROR_NO_MORE_FILES 18 normal end of listje CloseSnapshot ; No error skip print error; Process32Next failedmov rcx, offset szNextErrmov rdx, raxcall printfCloseSnapshot:; CloseHandle(snapshot_handle)mov rcx, rbxcall CloseHandleCleanup:add rsp, 40hrettestGetProcess endp2案例 其他案例请查看aes解码,密钥123456789密文U2FsdGVkX1/Bd4k8ZAij4D8oMKFwS3bBvmalzk3NT7UEJTw7/qemqhDLwG4nl9H9/nO3Xk0Ebmv0W50P9akHkb0F2ubxR31a6lldXh/T1P5UbUFht0mf2SUJwAKMq1bg