问题描述
我发现在Linux内核中的下列片段(不对应的C code虽然),在启动阶段的某个地方。你可以清楚地看到 0F 0B
部分,其中立为运code(IDA拒绝拆解)。
有这里是这款运算code一些用法解释的。在这种情况下,然而,运算codeS该指令后,就没有真正意义。
seg000:000C059E测试EDX,EDX
seg000:000C05A0 JNZ短loc_C05AA
seg000:000C05A0; --------------------------------------------------
seg000:000C05A2分贝的0Fh
seg000:000C05A3分贝值0Bh
seg000:000C05A4 DB 73H
seg000:000C05A5 0分贝
seg000:000C05A6 DB 86H;一个
seg000:000C05A7分贝4Ah可; Ĵ
seg000:000C05A8 DB 27H;
seg000:000C05A9分贝0C0H; +
seg000:000C05AA; --------------------------------------------------
seg000:000C05AA
seg000:000C05AA loc_C05AA:
seg000:000C05AA CMP EAX,[EDI + 4]
seg000:000C05AD JBE短loc_C05B7
seg000:000C05AD; --------------------------------------------------
seg000:000C05AF分贝的0Fh
seg000:000C05B0分贝值0Bh
seg000:000C05B1 DB 75H
seg000:000C05B2 0分贝
seg000:000C05B3 DB 86H
seg000:000C05B4分贝4Ah可; Ĵ
seg000:000C05B5 DB 27H;
seg000:000C05B6分贝0C0H; +
seg000:000C05B7; --------------------------------------------------
seg000:000C05B7
seg000:000C05B7 loc_C05B7:
seg000:000C05B7加ECX,0FFFh过
seg000:000C05BD SHR ESI,0CH
seg000:000C05C0 SHR ECX,0CH
seg000:000C05C3子ECX,ESI
seg000:000C05C5 CMP ECX,EBX
seg000:000C05C7 JNB短loc_C05E9
seg000:000C05C9 LEA ESI,[ESI + 0]
seg000:000C05D0
seg000:000C05D0 loc_C05D0:
seg000:000C05D0 MOV EDX,[EDI + 8]
seg000:000C05D3 BTR [EDX],ECX
seg000:000C05D6 SBB EAX,EAX
seg000:000C05D8 TEST EAX,EAX
seg000:000C05DA JNZ短loc_C05E4
seg000:000C05DA; ------------------------------------------------
seg000:000C05DC分贝的0Fh
seg000:000C05DD分贝值0Bh
seg000:000C05DE分贝为7Fh
seg000:000C05DF 0分贝
seg000:000C05E0 DB 86H;一个
seg000:000C05E1分贝4Ah可; Ĵ
seg000:000C05E2 DB 27H;
seg000:000C05E3分贝0C0H; +
seg000:000C05E4; -------------------------------------------------
seg000:000C05E4
seg000:000C05E4 loc_C05E4:
seg000:000C05E4 INC ECX
这是BUG()宏从<一个href=\"http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/asm-i386/bug.h?v=2.6.11.8\">include/asm-i386/bug.h.
/ *
*告诉用户有一些问题。
*有问题的文件和线路都设有codeD之后的正式
*未定义运code在陷阱处理程序解析。
* /#IFDEF CONFIG_DEBUG_BUGVERBOSE
#定义BUG()\\
__asm__ __volatile __(UD2 \\ N\\
\\ t.word%C0 \\ N\\
\\ t.long%C1 \\ N\\
:I(__LINE__),I(__FILE__))
例如,一个在0C05AF是在0xC0274A86名称为文件和行号117(0x75)。
I have found the following fragment in the Linux kernel (not the corresponding C code though), somewhere during the start up phase. You can clearly see the 0F 0B
parts, which stand for the UD2 opcode (IDA refused to disassemble).
There are some possible usages for this opcode explained here and here. In this case, however, the opcodes after this instruction don't really make sense.
seg000:000C059E test edx, edx
seg000:000C05A0 jnz short loc_C05AA
seg000:000C05A0 ; --------------------------------------------------
seg000:000C05A2 db 0Fh
seg000:000C05A3 db 0Bh
seg000:000C05A4 db 73h
seg000:000C05A5 db 0
seg000:000C05A6 db 86h ; å
seg000:000C05A7 db 4Ah ; J
seg000:000C05A8 db 27h ; '
seg000:000C05A9 db 0C0h ; +
seg000:000C05AA ; --------------------------------------------------
seg000:000C05AA
seg000:000C05AA loc_C05AA:
seg000:000C05AA cmp eax, [edi+4]
seg000:000C05AD jbe short loc_C05B7
seg000:000C05AD ; --------------------------------------------------
seg000:000C05AF db 0Fh
seg000:000C05B0 db 0Bh
seg000:000C05B1 db 75h
seg000:000C05B2 db 0
seg000:000C05B3 db 86h
seg000:000C05B4 db 4Ah ; J
seg000:000C05B5 db 27h ; '
seg000:000C05B6 db 0C0h ; +
seg000:000C05B7 ; --------------------------------------------------
seg000:000C05B7
seg000:000C05B7 loc_C05B7:
seg000:000C05B7 add ecx, 0FFFh
seg000:000C05BD shr esi, 0Ch
seg000:000C05C0 shr ecx, 0Ch
seg000:000C05C3 sub ecx, esi
seg000:000C05C5 cmp ecx, ebx
seg000:000C05C7 jnb short loc_C05E9
seg000:000C05C9 lea esi, [esi+0]
seg000:000C05D0
seg000:000C05D0 loc_C05D0:
seg000:000C05D0 mov edx, [edi+8]
seg000:000C05D3 btr [edx], ecx
seg000:000C05D6 sbb eax, eax
seg000:000C05D8 test eax, eax
seg000:000C05DA jnz short loc_C05E4
seg000:000C05DA ; ------------------------------------------------
seg000:000C05DC db 0Fh
seg000:000C05DD db 0Bh
seg000:000C05DE db 7Fh
seg000:000C05DF db 0
seg000:000C05E0 db 86h ; å
seg000:000C05E1 db 4Ah ; J
seg000:000C05E2 db 27h ; '
seg000:000C05E3 db 0C0h ; +
seg000:000C05E4 ; -------------------------------------------------
seg000:000C05E4
seg000:000C05E4 loc_C05E4:
seg000:000C05E4 inc ecx
It's the BUG() macro from include/asm-i386/bug.h.
/*
* Tell the user there is some problem.
* The offending file and line are encoded after the "officially
* undefined" opcode for parsing in the trap handler.
*/
#ifdef CONFIG_DEBUG_BUGVERBOSE
#define BUG() \
__asm__ __volatile__( "ud2\n" \
"\t.word %c0\n" \
"\t.long %c1\n" \
: : "i" (__LINE__), "i" (__FILE__))
For example, the one at 0C05AF is for file with name at 0xC0274A86 and line number 117 (0x75).
这篇关于什么是Linux内核的运算UD2 code的目的是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!