能力值:
( LV2,RANK:10 )
2 楼
确实是的,我也发现了intel手册的错误.
能力值:
( 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]
能力值:
( 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是按照什么手册写的呢?因为这里不是一条两条指令,有很多指令都让人琢磨不透。。。
能力值:
( LV4,RANK:50 )
5 楼
WinDbg 可能参考的是Intel的内部手册,Confidential的跟public的不一样
能力值:
( LV7,RANK:110 )
6 楼
发信给Olly,他说这不是一条指令。那就按intel指令手册来好了。。
能力值:
( 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.
能力值:
( 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]
能力值:
( LV2,RANK:10 )
9 楼
太强了。。手册都错。。。那正确的该怎么验证呢
能力值:
( 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]
上传的附件:
能力值:
( 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。
能力值:
( 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字段了。
能力值:
( 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
能力值:
( 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才可以解。
能力值:
(RANK:10 )
15 楼
Support.
Программное обеспечение выпуска и Windows Crack Обучение Нам-Dabei Guanyin Бодхисаттва Нам без митабха
能力值:
( 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
能力值:
(RANK:1060 )
17 楼
很多undocumented大家都在用,慢慢只好变成documented了
能力值:
( 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.
能力值:
(RANK:170 )
19 楼
支持Alex的工作,可以具体看几款开源的引擎,与商业工具和手册对比修改,为大家造福
能力值:
( LV2,RANK:10 )
20 楼
太厉害了。给interl文档挑错!
能力值:
( 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旧版手册是一样的。不清楚啊不清楚。。请高手出来证实一下哪个是对的吧。
能力值:
( 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]
能力值:
( LV2,RANK:10 )
23 楼
不能编程验证吗?
能力值:
( 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
能力值:
( 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]
此贴属于关注收藏。。只是不知道该怎么验证。。只能顶了。。