吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 109|回复: 1
收起左侧

[讨论] 编写shellcode遇到的问题ntdll

[复制链接]
xiaoyeHE 发表于 2026-1-4 04:08
事情是这样的我原本计划采用PEB遍历获取ntdll基址后,手动解析其导出表以定位LdrGetProcedureAddress,进而通过该函数动态获取其他API。这样写的优势在于代码更短、稳定性更高、兼容性更好,且能有效绕过传统shellcode的检测机制。然而,在实现过程中发现,Windows 11(22H2及以上版本)对ntdll.dll的导出表实施了“只读/隐藏”保护,直接通过[rcx+0x90]读取导出表RVA时会返回0。这是由于系统拦截了相关内存读取,且用户态调试器默认不具备访问ntdll内核内存的权限,导致我的shellcode在尝试通过ntdll.dll获取Ldr系列函数、进而加载kernel32.dll并哈希匹配导出函数的路径完全受阻。大家有什么好的想法咱们一起可以交流一下唉{:1_893:}
详情如下所示:
1. PEB-InMemoryOrderModuleList-ntdll.ll基址成功---->在写这段代码的时候也遇到小坑了。匹配模块名"ntdll.ll"(大写与系统内存一致)这是部分windows10系统上的,调试的时候发现模块名是小写,索性就同时匹配大小写。
shellcode_entry:
    push rbp                 
    mov rbp, rsp            
    push r15                 
    push r14
    push r13
    push r12
    push r11
    push r10
    push r9
    push r8
    push rcx
    push rbx
    and rsp,0xfffffffffffffff0  
    ; Step 1: Get PEB via GS:[0x60]
    mov rax, [gs:0x60]          ; PEB
    test rax, rax
    jz cleanup


    mov rax, [rax + 0x18]       ; PEB.Ldr (PEB_LDR_DATA*)
    mov rax, [rax + 0x20]       ; PEB_LDR_DATA.InMemoryOrderModuleList (LIST_ENTRY*)
   

    mov r9, rax                 ; r9 = current LIST_ENTRY*
.find_ntdll:
    mov r9, [r9]               
    test r9, r9
    jz cleanup
    cmp r9, rax               
    je cleanup

   
    mov r10, r9
    sub r10, 0x10               
    test r10, r10
    jz .find_ntdll            


    mov rdx, [r10 + 0x58 + 0x08] ; BaseDllName.Buffer
    test rdx, rdx
    jz .find_ntdll              

  

    mov cl, [rdx]
    cmp cl, 'N'
    je .check_char2
    cmp cl, 'n'
    jne .find_ntdll

.check_char2:
  
    mov cl, [rdx + 2]
    cmp cl, 'T'
    je .check_char3
    cmp cl, 't'
    jne .find_ntdll

.check_char3:
   
    mov cl, [rdx + 4]
    cmp cl, 'D'
    je .check_char4
    cmp cl, 'd'
    jne .find_ntdll

.check_char4:

    mov cl, [rdx + 6]
    cmp cl, 'L'
    je .check_char5
    cmp cl, 'l'
    jne .find_ntdll

.check_char5:
  
    mov cl, [rdx + 8]
    cmp cl, 'L'
    je .check_char6
    cmp cl, 'l'
    jne .find_ntdll

.check_char6:
    mov cl, [rdx + 10]
    cmp cl, '.'
    jne .find_ntdll

.check_char7:
    mov cl, [rdx + 12]
    cmp cl, 'D'
    je .check_char8
    cmp cl, 'd'
    jne .find_ntdll

.check_char8:
    mov cl, [rdx + 14]
    cmp cl, 'L'
    je .check_char9
    cmp cl, 'l'
    jne .find_ntdll

.check_char9:
    mov cl, [rdx + 16]
    cmp cl, 'L'
    je .ntdll_found
    cmp cl, 'l'
    jne .find_ntdll

.ntdll_found:
    ;找到ntdll.dll 获取基址
    mov r11, [r10 + 0x30]       ; DllBase  ->获得ntdll地址
    test r11, r11
    jz cleanup

关键代码

关键代码


2. 获取到nt头地址
关键代码如下所示
; 1. 读取e_lfanew地址
mov edx, [rdi + 0x3c]       ; e_lfanew
test edx, edx
jz .not_found

; 2. 修正导出表偏移为0x90   -->计算nt头地址
mov rcx, rdi
add rcx, rdx                 ; NT Headers VA
cmp dword [rcx], 0x4550 ; 'PE\0\0'签名
jne .not_found
成功获取
b43911df014cab8ede24883199cc70b2.png
3. 获取导出表唉问题就出现在这里
d4f9e4c40e1b4afb458054a81acfa741.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| xiaoyeHE 发表于 2026-1-4 04:13
3. 获取导出表唉问题就出现在这里(补充)
    mov r8d, [rcx + 0x90]        ; nt头+0x90是导出表RVA
    int3
    test r8d, r8d
    jz .not_found
    add r8, rdi   
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-1-6 13:15

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表