首页
社区
课程
招聘
[原创]intel指令手册、OD、WinDBG引擎中发现的错误
发表于: 2010-9-23 16:20 18244

[原创]intel指令手册、OD、WinDBG引擎中发现的错误

2010-9-23 16:20
18244

最近在学习intel指令,发现一些错误,供大家修正。

intel指令手册错误:
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z
页码:A-10 Vol. 3B

Table A-2. One-byte Opcode Map
0xA4 : MOVS/B             Xb,Yb
0xA5 : MOVS/W/D/Q      Xv,Yv
0xAF : SCAS/W/D/Q      rAX,Xv

改正:
0xA4 : MOVS/B             Yb,Xb
0xA5 : MOVS/W/D/Q      Yv,Xv
0xAF : SCAS/W/D/Q      rAX,Yv

Table A-3.  Two-byte Opcode Map
0x0F11 : (F2前缀) MOVSD   Vsd, Wsd
0x0F82 : Jcc B/CNAE

改正:
0x0F11 : (F2前缀) MOVSD   Wsd, Vsd
0x0F82 : Jcc B/C/NAE

知道的几个undocument指令(在手册里面为Reserved):
0xD6 : SALC
0xF1 : INT1
0x0F0B : UD2

Table A-6.  Opcode Extensions for One- and Two-byte Opcodes by Group Number
Group2中的reg==110时为Reserved,实际上应该是指令SAL

OD1.10版bug:
0x6E            OUTS DX,BYTE PTR ES:[EDI]   
0x6F            OUTS DX,DWORD PTR ES:[EDI]
对0x0F XX指令很多都解析错误

OD2.0版修正:
0x6E                      OUTS DX,BYTE PTR DS:[ESI]
0x6F                      OUTS DX,DWORD PTR DS:[ESI]
对0x0F XX指令解析错误修正

WinDBG最新版6.12.2.633 bug:
66f20f38f11501e84703 crc32 dx,word ptr ds:[347E801h]

正确的(取自OD2.0):
66F20F38F11501E84703  CRC32 EDX,WORD PTR DS:[347E801]

希望大家发现错误一起共享。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (26)
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
确实是的,我也发现了intel手册的错误.
2010-9-24 09:07
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
继续更新:
od2.0 引擎解码错误:
01012467     \F3            REP
01012468      0FC730        VMPTRLD QWORD PTR DS:[EAX]               ; Privileged instruction

正确(取自WinDBG):
01012475 f30fc730        vmxon   qword ptr [eax]
2010-9-25 13:58
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
高手帮忙:

OD2.0:
01012559      F20FD600      MOVDQ2Q MM0,QWORD PTR DS:[EAX]

在intel手册里定义是:
movdq2q Pq,Uq
P : reg field select MMX
U : rm field select XMM

所以这条指令只能是: movdq2q mmx,xmm,并且mod必须等于11.
所以我认为F20FD600不能构成一条指令,但是用IDA与WINDBG解码得到的者不同:

IDA5.2.0:
.text:01012475 F2 0F D6 00                             movdq2q mm0, xmm0   //这里很明显错了
IDA5.5.0:
.text:01012475 F2 0F D6                start           db 0F2h, 0Fh, 0D6h     //说它不是一条指令
.text:01012478 00 15 00 01                             dd offset dword_1001370+190h

WinDBG:
01012475 f20fd600        movdq2q mm0,xmmword ptr [eax]

同事说windbg的对。intel手册写错了,但是AMD手册也是这样定义的。可能两个手册都写错了。但是windbg是按照什么手册写的呢?因为这里不是一条两条指令,有很多指令都让人琢磨不透。。。
2010-9-26 18:03
0
雪    币: 195
活跃值: (20)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
WinDbg 可能参考的是Intel的内部手册,Confidential的跟public的不一样
2010-9-28 13:03
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
发信给Olly,他说这不是一条指令。那就按intel指令手册来好了。。
2010-10-2 15:46
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
继续更新:
OD2.0:
01012498      66:0FC8               BSWAP AX                                 ; Undocumented instruction or encoding

WinDBG:
7c92118b 660fc8          bswap   eax

IDA:
.text:01012475                                         db      66h
.text:01012475 66 0F C8                                bswap   eax

Reference intel manual:
Reverses the byte order of a 32-bit or 64-bit (destination) register. This instruction is
provided for converting little-endian values to big-endian format and vice versa. To
swap bytes in a word value (16-bit register), use the XCHG instruction. When the
BSWAP instruction references a 16-bit register, the result is undefined.
2010-10-2 15:54
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
8
继续更新:
WinDBG:
0F 60~0F 6E如果有F3或F2前缀则是无效指令,但WinDBG都翻译成了有效。
7c92118b f30f681500000000 rep punpckhbw mm2,mmword ptr ds:[0]

OD2.0:
010124F6      F3                    REP
010124F7      0F6815 00000000       PUNPCKHBW MM2,QWORD PTR DS:[0]
2010-10-2 16:38
0
雪    币: 3278
活跃值: (3119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
太强了。。手册都错。。。那正确的该怎么验证呢
2010-10-2 20:24
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
10
继续更新:
intel指令手册错误:
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z
页码:4-12 Vol. 2B
图中所有带66前缀的指令都应该是word而不是dword,因为nop指令描述是可以有16和32位的。




举其中一例:
OD2.0:
0101249A      66:0F1F4400 00       NOP WORD PTR DS:[EAX+EAX]

WinDBG:
01012490 660f1f440000    nop     word ptr [eax+eax]
上传的附件:
2010-10-3 18:58
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
11
继续更新:
0D2.0在翻译0F1F指令nop时,只翻译reg==00时的情况,其他情况不翻译。
010124CE      0F1F00               NOP DWORD PTR DS:[EAX]
010124D1      0F                   DB 0F                                    ; Unknown command
010124D2      1F                   POP DS                                   ; Modification of segment register
010124D3      0800                 OR BYTE PTR DS:[EAX],AL
可以看到0F1F00正常翻译,0F1F08不翻译,直接导致后续指令翻译错乱。

WinDBG则全部翻译:
01012490 0f1f00          nop     dword ptr [eax]
01012493 0f1f08          nop     dword ptr [eax]

尚不明确谁对谁错,个人感觉应该是winDBG是对的,因为intel手册里没有发现说只能reg==00。
2010-10-3 19:16
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=AlexLong;866656]继续更新:
0D2.0在翻译0F1F指令nop时,只翻译reg==00时的情况,其他情况不翻译。
010124CE      0F1F00               NOP DWORD PTR DS:[EAX]
010124D1      0F                   DB 0F...[/QUOTE]

已经证实OD是对的。WinDBG错了。因为nop指令在intel手册里定义是:
0F 1F /0 NOP r/m32
那个/0原本不知道什么意思,问过Olly后他说:Here /0 replaces Reg field in the Mod Reg R/M byte,这在intel手册里没有记录,或者应该说我没有找到相关说明,又看一下AMD手册,可以很清楚了:NOP reg/mem32 0F 1F /0这里已经表明只能是reg字段了。
2010-10-6 14:27
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
13
继续更新:
OD2.0:
01012498      62C0          BOUND EAX,EAX                            ; Illegal use of register
01012498      C4C0          LES EAX,EAX                              ; Illegal use of register
01012498      C5C0          LDS EAX,EAX                              ; Illegal use of register
......

WinDBG:
010124b7 62              ???
010124b8 c00000          rol     byte ptr [eax],0

OD在解码包含M标记的opcode时没有正确解码,M的意思是:The ModR/M byte may refer only to memory。
mod != 00
2010-10-6 15:07
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
14
继续更新:
OD2.0:
010124D7      0F2000        MOV DWORD PTR DS:[EAX],CR0               ; Privileged instruction

WinDBG:
010124b7 0f              ???
010124b8 2000            and     byte ptr [eax],al

0F 20~23都是有R标志的opcode,R:The R/M field of the ModR/M byte may refer only to a general register.所以mod == 11才可以解。
2010-10-6 16:24
0
雪    币: 99705
活跃值: (201149)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
15
Support.

Программное обеспечение выпуска и Windows Crack Обучение
Нам-Dabei Guanyin Бодхисаттва Нам без митабха
2010-10-6 16:34
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
16
找到关于/0的定义了:
/digit — A digit between 0 and 7 indicates that the ModR/M byte of the
instruction uses only the r/m (register or memory) operand. The reg field
contains the digit that provides an extension to the instruction's opcode.
大意是/0~/7代表reg可取的值是0~7,即/0的意思是reg只能等于0,等于其他的时候不可解码,/0 /3 /7则代表reg == 0 || reg == 3 || reg == 7
2010-10-7 11:06
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
17
很多undocumented大家都在用,慢慢只好变成documented了
2010-10-7 12:51
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
18
继续更新:
下面的OD与WinDBG都错了。
OD2.0:
01012509      F20FD600      MOVDQ2Q MM0,QWORD PTR DS:[EAX]

WinDBG:
7c92122b f20fd600        movdq2q mm0,xmmword ptr [eax]

intel manual:
F2 0F D6 MOVDQ2Q mm, xmm
Move low quadword from
xmm to mmx register.
2010-10-7 17:23
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
19
支持Alex的工作,可以具体看几款开源的引擎,与商业工具和手册对比修改,为大家造福
2010-10-9 04:50
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
太厉害了。给interl文档挑错!
2010-10-9 06:45
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
21
继续更新:
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z

Table A-3.  Two-byte Opcode Map: 00H — 77H (First Byte is 0FH) *
     51 SQRTPS Wps,Vps
66 51 SQRTPD Wpd,Vpd
F3 51 SQRTSS  Vss,Wss
F2 51 SQRTSD  Vsd,Wsd

正确的:
   51 SQRTPS Vps,Wps
66 51 SQRTPD Vpd,Wpd
F3 51 SQRTSS  Vss,Wss
F2 51 SQRTSD  Vsd,Wsd

老版本的手册是正确的,但新版本手册反倒修改错了。

注:
现在已经不确定是老版本对还是新版本对了,因为改动的必竟是最新手册,如果老的是对的新版本应该是会再改成错的,上面的信息是参考OD2.0与WinDBG得来的,现在怕OD与WinDBG使用的是旧版本的手册而造成错误,看了一下AMD的手册,和intel旧版手册是一样的。不清楚啊不清楚。。请高手出来证实一下哪个是对的吧。
2010-10-26 18:16
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
22
唉。。根本没人理我。。问题也没人帮解决一下。。。

继续更新:
OD2.0:
010124A9      0F6000        PUNPCKLBW MM0,QWORD PTR DS:[EAX]

0F 60/61/62/68/69/6A/6B  这些指令定义都是Pq,Qd,所以应该是DWORD而不应该是QWORD

正确的:
WinDBG:
7c921170 0f6000          punpcklbw mm0,dword ptr [eax]
2010-10-28 17:50
0
雪    币: 732
活跃值: (192)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
不能编程验证吗?
2010-10-28 18:14
0
雪    币: 209
活跃值: (83)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
24
继续更新:
OD2.0:
010124CE      0FC4C0 00     PINSRW MM0,AX,0

正确:
WinDBG:
7c921186 0fc4c000        pinsrw  mm0,eax,0

intel manual:
PINSRW mm, r32/m16, imm8
2010-11-7 16:55
0
雪    币: 3278
活跃值: (3119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
[QUOTE=AlexLong;880223]唉。。根本没人理我。。问题也没人帮解决一下。。。

继续更新:
OD2.0:
010124A9      0F6000        PUNPCKLBW MM0,QWORD PTR DS:[EAX]

0F 60/61/62/68/69/6A/6B  这些指...[/QUOTE]

此贴属于关注收藏。。只是不知道该怎么验证。。只能顶了。。
2010-11-7 21:35
0
游客
登录 | 注册 方可回帖
返回
// // 统计代码