奇怪的问题,mov cl,byte ptr [eax],后发现cl=0xcc 地址处明明不是0xcc

本文深入探讨了在代码内存读取过程中,如何通过设置断点int3来触发异常行为,并解释了断点设置与恢复的原理。详细解析了在特定代码入口增加int3的作用,以及其对程序执行流程的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

导致这种灵异事件的原因很可能是在读取代码的code内存时,哪个代码入口处被增加了断点int 3 ,int 3=0xcc,请检测断点

 

断点设置的时候会改成int3,当命中的时候会被替换回来

 

 

 

[PTE_HOOK] Driver loaded [PTE_HOOK] NtCreateFile found at 0xFFFFF8057B1FF090 [PTE_HOOK] Initializing PTE hook engine [PTE_HOOK] PTE base: 0xFFFFE271389C4000, Trampoline: 0xFFFFBD0464FE5000 [PTE_HOOK] Hooking function: original=0xFFFFF8057B1FF090, target=0xFFFFF805802B1850 [PTE_HOOK] Current CR3: 0x1ad000 [PTE_HOOK] Aligned isolation address: 0xFFFFF8057B1FF000 [PTE_HOOK] Large page detected, splitting... [PTE_HOOK] Split large page: PFN=0x2800 -> new PT at 0xFFFFCF812F9FF000 [PTE_HOOK] CR0 WP disabled (0x80040033) [PTE_HOOK] Isolating page table for address: 0xFFFFF8057B1FF000 [PTE_HOOK] CR3 value: 0x1ad000 [PTE_HOOK] PML4 physical address: 0x1ad000 [PTE_HOOK] Using split large page PT: 0xFFFFCF812F9FF000 (PFN: 0x239de6) [PTE_HOOK] Mapped PML4: physical=0x1ad000, virtual=0xFFFFE271389C4000 [PTE_HOOK] Page table isolation completed for 0xFFFFF8057B1FF000 [PTE_HOOK] CR0 WP restored (0x80050033) [PTE_HOOK] Instruction at 0xFFFFF8057B1FF090: length=1, total=1 [PTE_HOOK] Instruction at 0xFFFFF8057B1FF091: length=1, total=2 [PTE_HOOK] Instruction at 0xFFFFF8057B1FF092: length=1, total=3 [PTE_HOOK] Instruction at 0xFFFFF8057B1FF093: length=1, total=4 [PTE_HOOK] Instruction at 0xFFFFF8057B1FF094: length=1, total=5 [PTE_HOOK] Instruction at 0xFFFFF8057B1FF095: length=1, total=6 [PTE_HOOK] Instruction at 0xFFFFF8057B1FF096: length=1, total=7 [PTE_HOOK] Instruction at 0xFFFFF8057B1FF097: length=1, total=8 [PTE_HOOK] Instruction at 0xFFFFF8057B1FF098: length=1, total=9 [PTE_HOOK] Instruction at 0xFFFFF8057B1FF099: length=3, total=12 [PTE_HOOK] Instruction at 0xFFFFF8057B1FF09C: length=1, total=13 [PTE_HOOK] Instruction at 0xFFFFF8057B1FF09D: length=1, total=14 [PTE_HOOK] Hook recorded at index 0 [PTE_HOOK] Hook installed: trampoline at 0xFFFFBD0464FE5000, used=34 bytes [PTE_HOOK] Hook successful: original function at 0xFFFFBD0464FE5000 [PTE_HOOK] NtCreateFile called Access violation - code c0000005 (!!! second chance !!!) 00000000`00000000 ?? ??? kd> u FFFFBD0464FE5000 ffffbd04`64fe5000 4881ec88000000 sub rsp,88h ffffbd04`64fe5007 33c0 xor eax,eax ffffbd04`64fe5009 4889442478 mov qword ptr [rsp+78h],rax ffffbd04`64fe500e 6a00 push 0 ffffbd04`64fe5010 3ec7042400000000 mov dword ptr ds:[rsp],0 ffffbd04`64fe5018 3ec744240400000000 mov dword ptr ds:[rsp+4],0 ffffbd04`64fe5021 c3 ret ffffbd04`64fe5022 0000 add byte ptr [rax],al
07-17
.text:100F8C1E ?getFunctionIndirectType@UnDecorator@@CA?AVDName@@ABV2@@Z proc near .text:100F8C1E ; CODE XREF: UnDecorator::getPrimaryDataType(DName const &)+13C↓p .text:100F8C1E ; UnDecorator::getPtrRefType(DName const &,DName const &,char const *)+63↓p .text:100F8C1E .text:100F8C1E var_38 = DName ptr -38h .text:100F8C1E var_30 = DName ptr -30h .text:100F8C1E returnType = DName ptr -28h .text:100F8C1E var_20 = DName ptr -20h .text:100F8C1E rd = DName ptr -18h .text:100F8C1E thisType = DName ptr -10h .text:100F8C1E fitType = DName ptr -8 .text:100F8C1E result = dword ptr 8 .text:100F8C1E superType = dword ptr 0Ch .text:100F8C1E .text:100F8C1E push ebp .text:100F8C1F mov ebp, esp .text:100F8C21 mov ecx, ?gName@UnDecorator@@0PBDB ; char const * const UnDecorator::gName .text:100F8C27 sub esp, 38h .text:100F8C2A mov al, [ecx] .text:100F8C2C test al, al .text:100F8C2E jnz short loc_100F8C48 .text:100F8C30 push [ebp+superType] ; rd .text:100F8C33 push 1 ; st .text:100F8C35 push [ebp+result] ; result .text:100F8C38 call ??H@YA?AVDName@@W4DNameStatus@@ABV0@@Z ; operator+(DNameStatus,DName const &) .text:100F8C3D add esp, 0Ch .text:100F8C40 .text:100F8C40 loc_100F8C40: ; CODE XREF: UnDecorator::getFunctionIndirectType(DName const &)+40↓j .text:100F8C40 mov eax, [ebp+result] .text:100F8C43 jmp loc_100F9023 .text:100F8C48 ; --------------------------------------------------------------------------- .text:100F8C48 .text:100F8C48 loc_100F8C48: ; CODE XREF: UnDecorator::getFunctionIndirectType(DName const &)+10↑j .text:100F8C48 cmp al, 36h ; '6' .text:100F8C4A jl short loc_100F8C50 .text:100F8C4C cmp al, 39h ; '9' .text:100F8C4E jle short loc_100F8C60 .text:100F8C50 .text:100F8C50 loc_100F8C50: ; CODE XREF: UnDecorator::getFunctionIndirectType(DName const &)+2C↑j .text:100F8C50 cmp al, 5Fh ; '_' .text:100F8C52 jz short loc_100F8C60 .text:100F8C54 mov ecx, [ebp+result] ; this .text:100F8C57 push 2 ; st .text:100F8C59 call ??0DName@@QAE@W4DNameStatus@@@Z ; DName::DName(DNameStatus) .text:100F8C5E jmp short loc_100F8C40 .text:100F8C60 ; --------------------------------------------------------------------------- .text:100F8C60 .text:100F8C60 loc_100F8C60: ; CODE XREF: UnDecorator::getFunctionIndirectType(DName const &)+30↑j .text:100F8C60 ; UnDecorator::getFunctionIndirectType(DName const &)+34↑j .text:100F8C60 push ebx .text:100F8C61 movsx ebx, al .text:100F8C64 sub ebx, 36h ; '6' .text:100F8C67 inc ecx .text:100F8C68 mov ?gName@UnDecorator@@0PBDB, ecx ; char const * const UnDecorator::gName .text:100F8C6E cmp ebx, 29h ; ')' .text:100F8C71 jnz short loc_100F8CA2 .text:100F8C73 mov al, [ecx] .text:100F8C75 test al, al .text:100F8C77 jz short loc_100F8C90 .text:100F8C79 movsx ebx, al .text:100F8C7C sub ebx, 3Dh ; '=' .text:100F8C7F inc ecx .text:100F8C80 mov ?gName@UnDecorator@@0PBDB, ecx ; char const * const UnDecorator::gName .text:100F8C86 cmp ebx, 4 .text:100F8C89 jl short loc_100F8CAB .text:100F8C8B cmp ebx, 7 .text:100F8C8E jmp short loc_100F8CA9 .text:100F8C90 ; --------------------------------------------------------------------------- .text:100F8C90 .text:100F8C90 loc_100F8C90: ; CODE XREF: UnDecorator::getFunctionIndirectType(DName const &)+59↑j .text:100F8C90 push [ebp+superType] ; rd .text:100F8C93 push 1 ; st .text:100F8C95 push [ebp+result] ; result .text:100F8C98 call ??H@YA?AVDName@@W4DNameStatus@@ABV0@@Z ; operator+(DNameStatus,DName const &) .text:100F8C9D add esp, 0Ch .text:100F8CA0 jmp short loc_100F8CBD .text:100F8CA2 ; --------------------------------------------------------------------------- .text:100F8CA2 .text:100F8CA2 loc_100F8CA2: ; CODE XREF: UnDecorator::getFunctionIndirectType(DName const &)+53↑j .text:100F8CA2 test ebx, ebx .text:100F8CA4 js short loc_100F8CAB .text:100F8CA6 cmp ebx, 3 .text:100F8CA9 .text:100F8CA9 loc_100F8CA9: ; CODE XREF: UnDecorator::getFunctionIndirectType(DName const &)+70↑j .text:100F8CA9 jle short loc_100F8CAE .text:100F8CAB .text:100F8CAB loc_100F8CAB: ; CODE XREF: UnDecorator::getFunctionIndirectType(DName const &)+6B↑j .text:100F8CAB ; UnDecorator::getFunctionIndirectType(DName const &)+86↑j .text:100F8CAB or ebx, 0FFFFFFFFh .text:100F8CAE .text:100F8CAE loc_100F8CAE: ; CODE XREF: UnDecorator::getFunctionIndirectType(DName const &):loc_100F8CA9↑j .text:100F8CAE cmp ebx, 0FFFFFFFFh .text:100F8CB1 jnz short loc_100F8CC5 .text:100F8CB3 mov ecx, [ebp+result] ; this .text:100F8CB6 push 2 ; st .text:100F8CB8 call ??0DName@@QAE@W4DNameStatus@@@Z ; DName::DName(DNameStatus) .text:100F8CBD .text:100F8CBD loc_100F8CBD: ; CODE XREF: UnDecorator::getFunctionIndirectType(DName const &)+82↑j .text:100F8CBD mov eax, [ebp+result] .text:100F8CC0 jmp loc_100F9022 .text:100F8CC5 ; --------------------------------------------------------------------------- .text:100F8CC5 .text:100F8CC5 loc_100F8CC5: ; CODE XREF: UnDecorator::getFunctionIndirectType(DName const &)+93↑j .text:100F8CC5 and [ebp+thisType.node], 0 .text:100F8CC9 and dword ptr [ebp+thisType._bf_4], 0FFFF0000h .text:100F8CD0 push esi .text:100F8CD1 mov esi, [ebp+superType] .text:100F8CD4 push edi .text:100F8CD5 mov edi, ebx .text:100F8CD7 mov eax, [esi] .text:100F8CD9 mov [ebp+fitType.node], eax .text:100F8CDC mov eax, [esi+4] .text:100F8CDF mov dword ptr [ebp+fitType._bf_4], eax .text:100F8CE2 and edi, 2 .text:100F8CE5 jz loc_100F8DD7 .text:100F8CEB cmp byte ptr [ecx], 40h ; '@' .text:100F8CEE jz loc_100F8D96 .text:100F8CF4 lea eax, [ebp+fitType] .text:100F8CF7 push eax ; rd .text:100F8CF8 lea eax, [ebp+rd] .text:100F8CFB push eax ; result .text:100F8CFC push offset asc_10131938 ; "::" .text:100F8D01 lea ecx, [ebp+var_20] ; this .text:100F8D04 call ??0DName@@QAE@PBD@Z ; DName::DName(char const *) .text:100F8D09 mov ecx, eax ; this .text:100F8D0B call ??HDName@@QBE?AV0@ABV0@@Z ; DName::operator+(DName const &) .text:100F8D10 mov eax, [ebp+rd.node] .text:100F8D13 mov [ebp+fitType.node], eax .text:100F8D16 mov eax, dword ptr [ebp+rd._bf_4] .text:100F8D19 mov dword ptr [ebp+fitType._bf_4], eax .text:100F8D1C mov eax, ?gName@UnDecorator@@0PBDB ; char const * const UnDecorator::gName .text:100F8D21 cmp byte ptr [eax], 0 .text:100F8D24 jz short loc_100F8D69 .text:100F8D26 lea eax, [ebp+var_30] .text:100F8D29 push eax ; result .text:100F8D2A call ?getScope@UnDecorator@@CA?AVDName@@XZ ; UnDecorator::getScope(void) .text:100F8D2F pop ecx .text:100F8D30 push eax ; rd .text:100F8D31 lea eax, [ebp+var_20] .text:100F8D34 push eax ; result .text:100F8D35 push 20h ; ' ' ; ch .text:100F8D37 lea ecx, [ebp+var_38] ; this .text:100F8D3A call ??4DName@@QAEAAV0@D@Z ; DName::operator=(char) .text:100F8D3F mov ecx, eax ; this .text:100F8D41 call ??HDName@@QBE?AV0@ABV0@@Z ; DName::operator+(DName const &) .text:100F8D46 mov eax, [ebp+var_20.node] .text:100F8D49 lea ecx, [ebp+rd] ; this .text:100F8D4C mov [ebp+rd.node], eax .text:100F8D4F mov eax, dword ptr [ebp+var_20._bf_4] .text:100F8D52 mov dword ptr [ebp+rd._bf_4], eax .text:100F8D55 lea eax, [ebp+fitType] .text:100F8D58 push eax ; rd .text:100F8D59 call ??YDName@@QAEAAV0@ABV0@@Z ; DName::operator+=(DName const &) .text:100F8D5E mov eax, [ebp+rd.node] .text:100F8D61 mov [ebp+fitType.node], eax .text:100F8D64 mov eax, dword ptr [ebp+rd._bf_4] .text:100F8D67 jmp short loc_100F8D8B 崩溃点在.text:100F8D1C mov eax, ?gName@UnDecorator@@0PBDB ; char const * const UnDecorator::gName 怎么查找崩溃原因 这个跟栈溢出有关系嘛
07-06
<think>好的,我需要帮助用户理解汇编语言中MOV指令的用法,特别是将值0FFH写入BX寄存器指向的内存地址的操作。首先,我需要回忆MOV指令的基本结构和操作数类型。根据用户提供的引用,特别是引用[2]和引用[3],MOV指令有不同的操作数组合,包括寄存器到寄存器、寄存器到内存、内存到寄存器,以及常量的移动。 用户的问题涉及内存操作数,因此需要关注MOV指令中内存地址的使用方式。根据引用[3],当操作内存时,需要使用PTR关键字来指定数据的大小,比如BYTE PTR、WORD PTR或DWORD PTR。例如,mov BYTE PTR [ebx], 2是将字节值2写入EBX指向的地址。 现在,用户的具体情况是使用BX寄存器指向内存地址,并将0FFH写入该地址。首先,BX寄存器在16位汇编中通常用作基址寄存器,特别是在像实模式这样的环境中。这里需要注意,在x86架构中,使用[BX]作为内存操作数时,默认的段寄存器是DS,即数据段。 接下来,需要确定数据的大小。因为用户提到的是byte ptr,所以应该写入一个字节。因此,正确的指令应该是mov byte ptr [bx], 0FFH。这里,0FFH是一个十六进制的立即数,表示十进制的255。由于是字节操作,0FFH在8位范围内是有效的(0到255)。 此外,需要注意汇编语法的差异。用户提供的引用[1]提到,Intel语法和AT&T语法有所不同,例如在操作数的顺序上。但用户的问题中没有指定具体的汇编器语法,所以假设使用的是Intel语法,即目标操作数在前,源操作数在后。 还需要确认的是,BX寄存器中存储的地址是否有效,是否有权限写入该内存位置。这在实模式或保护模式下的编程中可能涉及不同的段权限,但用户的问题可能更关注指令的正确格式,而不是运行时环境的具体细节。 最后,可能需要提醒用户关于不同数据大小的影响。例如,使用byte ptr、word ptr等会影响写入的内存字节数。例如,mov word ptr [bx], 0FFH会写入两个字节(0FFH和00H,取决于汇编器的理方式),但使用byte ptr则只写入一个字节。 总结下来,用户的指令应为mov byte ptr [bx], 0FFH,这会将字节值0FFH写入BX指向的内存地址。需要确保语法正确,包括使用方括号表示内存地址PTR关键字指定数据大小,以及正确的操作数顺序。</think>在汇编语言中使用`MOV`指令向`BX`寄存器指向的内存地址写入值`0FFH`时,需明确操作数类型和内存寻址方式。具体实现如下: --- ### **语法解析** 指令格式为: `MOV 目标操作数, 源操作数` - **目标操作数**:`BYTE PTR [BX]` 表示以`BX`寄存器值为地址的**字节类型**内存单元。`BYTE PTR`显式声明操作大小为1字节[^3]。 - **源操作数**:`0FFH` 十六进制立即数`FFH`(十进制255),需确保其值在字节范围内(0-255)。 完整指令: ```assembly MOV BYTE PTR [BX], 0FFH ``` --- ### **关键细节** 1. **内存寻址** `[BX]`表示间接寻址,操作的是`BX`寄存器中存储的地址对应的内存位置。默认段寄存器为`DS`(数据段)[^4]。 2. **数据类型声明** - `BYTE PTR`:写入1字节(如`0FFH`) - `WORD PTR`:写入2字节(需确保源操作数为16位值) - `DWORD PTR`:写入4字节(32位值) 3. **立即数范围** 若使用`BYTE PTR`,源操作数需在`0x00-0xFF`范围内;超出范围会导致汇编错误。 --- ### **示例对比** | 指令 | 行为描述 | |------|----------| | `MOV BYTE PTR [BX], 0FFH` | 将`0FFH`写入`BX`指向的1字节内存单元 | | `MOV WORD PTR [BX], 0FFH` | 将`00FFH`(小端序)写入`BX`指向的2字节内存单元 | | `MOV [BX], AL` | 将`AL`寄存器的值写入`BX`指向的内存单元(隐式字节操作) | --- ### **常见错误** 1. **未指定数据类型** ```assembly MOV [BX], 0FFH ; 错误:未声明操作数大小 ``` 2. **立即数越界** ```assembly MOV BYTE PTR [BX], 1000H ; 错误:1000H超出字节范围 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值