@@ -525,15 +525,21 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {
525
525
switch (*(u16 *)(address)) {
526
526
case 0x018A : // 8A 01 : mov al, byte ptr [ecx]
527
527
case 0xFF8B : // 8B FF : mov edi, edi
528
+ case 0xDC8B : // 8B DC : mov ebx, esp
528
529
case 0xEC8B : // 8B EC : mov ebp, esp
529
530
case 0xc889 : // 89 C8 : mov eax, ecx
530
531
case 0xE589 : // 89 E5 : mov ebp, esp
531
532
case 0xC18B : // 8B C1 : mov eax, ecx
533
+ case 0xFF33 : // 33 FF : xor edi, edi
532
534
case 0xC033 : // 33 C0 : xor eax, eax
533
535
case 0xC933 : // 33 C9 : xor ecx, ecx
534
536
case 0xD233 : // 33 D2 : xor edx, edx
535
537
return 2 ;
536
538
539
+ case 0xEC83 : // 83 EC XX : sub esp, XX
540
+ case 0xE483 : // 83 E4 XX : and esp, XX
541
+ return 3 ;
542
+
537
543
// Cannot overwrite control-instruction. Return 0 to indicate failure.
538
544
case 0x25FF : // FF 25 XX XX XX XX : jmp [XXXXXXXX]
539
545
return 0 ;
@@ -577,44 +583,83 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {
577
583
case 0x018a : // mov al, byte ptr [rcx]
578
584
return 2 ;
579
585
586
+ case 0xE483 : // 83 E4 XX : and esp, XX
587
+ case 0xC1F6 : // F6 C1 XX : test cl, XX
588
+ return 3 ;
589
+
580
590
case 0x058B : // 8B 05 XX XX XX XX : mov eax, dword ptr [XX XX XX XX]
581
591
if (rel_offset)
582
592
*rel_offset = 2 ;
583
593
return 6 ;
584
594
}
585
595
586
596
switch (0x00FFFFFF & *(u32 *)address) {
587
- case 0xe58948 : // 48 8b c4 : mov rbp, rsp
588
- case 0xc18b48 : // 48 8b c1 : mov rax, rcx
589
- case 0xc48b48 : // 48 8b c4 : mov rax, rsp
590
- case 0xd9f748 : // 48 f7 d9 : neg rcx
591
- case 0xd12b48 : // 48 2b d1 : sub rdx, rcx
592
- case 0x07c1f6 : // f6 c1 07 : test cl, 0x7
593
- case 0xc98548 : // 48 85 C9 : test rcx, rcx
594
- case 0xd28548 : // 48 85 d2 : test rdx, rdx
595
- case 0xc0854d : // 4d 85 c0 : test r8, r8
596
597
case 0xc2b60f : // 0f b6 c2 : movzx eax, dl
597
- case 0xc03345 : // 45 33 c0 : xor r8d, r8d
598
- case 0xc93345 : // 45 33 c9 : xor r9d, r9d
599
- case 0xdb3345 : // 45 33 DB : xor r11d, r11d
600
- case 0xd98b4c : // 4c 8b d9 : mov r11, rcx
601
- case 0xd28b4c : // 4c 8b d2 : mov r10, rdx
602
- case 0xc98b4c : // 4C 8B C9 : mov r9, rcx
603
- case 0xc18b4c : // 4C 8B C1 : mov r8, rcx
604
598
case 0xd2b60f : // 0f b6 d2 : movzx edx, dl
605
- case 0xca2b48 : // 48 2b ca : sub rcx, rdx
606
- case 0x10b70f : // 0f b7 10 : movzx edx, WORD PTR [rax]
599
+ case 0x01b70f : // 0f b7 01 : movzx eax, word ptr [rcx]
600
+ case 0x02b70f : // 0f b7 02 : movzx eax, word ptr [rdx]
601
+ case 0x10b70f : // 0f b7 10 : movzx edx, word ptr [rax]
602
+ case 0xc2b70f : // 0f b7 c2 : movzx eax, dx
607
603
case 0xc00b4d : // 3d 0b c0 : or r8, r8
608
604
case 0xc08b41 : // 41 8b c0 : mov eax, r8d
605
+ case 0xc18b41 : // 41 8b c1 : mov eax, r9d
606
+ case 0xc28b41 : // 41 8b c2 : mov eax, r10d
607
+ case 0xc38b41 : // 41 8b c3 : mov eax, r11d
608
+ case 0xc48b41 : // 41 8b c4 : mov eax, r12d
609
+ case 0xc03345 : // 45 33 c0 : xor r8d, r8d
610
+ case 0xc93345 : // 45 33 c9 : xor r9d, r9d
611
+ case 0xdb3345 : // 45 33 db : xor r11d, r11d
612
+ case 0xca2b48 : // 48 2b ca : sub rcx, rdx
613
+ case 0xd12b48 : // 48 2b d1 : sub rdx, rcx
614
+ case 0xca3b48 : // 48 3b ca : cmp rcx, rdx
615
+ case 0xc08548 : // 48 85 c0 : test rax, rax
616
+ case 0xc98548 : // 48 85 c9 : test rcx, rcx
617
+ case 0xd28548 : // 48 85 d2 : test rdx, rdx
618
+ case 0xdb8548 : // 48 85 db : test rbx, rbx
619
+ case 0xe48548 : // 48 85 e4 : test rsp, rsp
620
+ case 0xed8548 : // 48 85 ed : test rbp, rbp
621
+ case 0xe58948 : // 48 89 e5 : mov rbp, rsp
622
+ case 0xc18b48 : // 48 8b c1 : mov rax, rcx
623
+ case 0xc48b48 : // 48 8b c4 : mov rax, rsp
609
624
case 0xd18b48 : // 48 8b d1 : mov rdx, rcx
610
- case 0xdc8b4c : // 4c 8b dc : mov r11, rsp
625
+ case 0xd9f748 : // 48 f7 d9 : neg rcx
626
+ case 0xc0ff48 : // 48 ff c0 : inc rax
627
+ case 0xc1ff48 : // 48 ff c1 : inc rcx
628
+ case 0xc2ff48 : // 48 ff c2 : inc rdx
629
+ case 0xc3ff48 : // 48 ff c3 : inc rbx
630
+ case 0xc6ff48 : // 48 ff c6 : inc rsi
631
+ case 0xc7ff48 : // 48 ff c7 : inc rdi
632
+ case 0xc0ff49 : // 49 ff c0 : inc r8
633
+ case 0xc1ff49 : // 49 ff c1 : inc r9
634
+ case 0xc2ff49 : // 49 ff c2 : inc r10
635
+ case 0xc3ff49 : // 49 ff c3 : inc r11
636
+ case 0xc4ff49 : // 49 ff c4 : inc r12
637
+ case 0xc5ff49 : // 49 ff c5 : inc r13
638
+ case 0xc6ff49 : // 49 ff c6 : inc r14
639
+ case 0xc7ff49 : // 49 ff c7 : inc r15
640
+ case 0xc22b4c : // 4c 2b c2 : sub r8, rdx
641
+ case 0xc18b4c : // 4c 8b c1 : mov r8, rcx
642
+ case 0xc98b4c : // 4c 8b c9 : mov r9, rcx
611
643
case 0xd18b4c : // 4c 8b d1 : mov r10, rcx
612
- case 0xE0E483 : // 83 E4 E0 : and esp, 0xFFFFFFE0
644
+ case 0xd28b4c : // 4c 8b d2 : mov r10, rdx
645
+ case 0xd98b4c : // 4c 8b d9 : mov r11, rcx
646
+ case 0xdc8b4c : // 4c 8b dc : mov r11, rsp
647
+ case 0xc0854d : // 4d 85 c0 : test r8, r8
648
+ case 0xc9854d : // 4d 85 c9 : test r9, r9
649
+ case 0xd2854d : // 4d 85 d2 : test r10, r10
650
+ case 0xdb854d : // 4d 85 db : test r11, r11
651
+ case 0xe4854d : // 4d 85 e4 : test r12, r12
652
+ case 0xed854d : // 4d 85 ed : test r13, r13
653
+ case 0xf6854d : // 4d 85 f6 : test r14, r14
654
+ case 0xff854d : // 4d 85 ff : test r15, r15
613
655
return 3 ;
614
656
615
657
case 0xec8348 : // 48 83 ec XX : sub rsp, XX
616
658
case 0xf88349 : // 49 83 f8 XX : cmp r8, XX
617
659
case 0x588948 : // 48 89 58 XX : mov QWORD PTR[rax + XX], rbx
660
+ case 0x245489 : // 89 54 24 XX : mov DWORD PTR[rsp + XX], edx
661
+ case 0x398366 : // 66 83 39 XX : cmp DWORD PTR [rcx], XX
662
+ case 0x428d44 : // 44 8d 42 XX : lea r8d , [rdx + XX]
618
663
return 4 ;
619
664
620
665
case 0xec8148 : // 48 81 EC XX XX XX XX : sub rsp, XXXXXXXX
@@ -636,6 +681,8 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {
636
681
}
637
682
638
683
switch (*(u32 *)(address)) {
684
+ case 0x01b70f44 : // 44 0f b7 01 : movzx r8d, WORD PTR [rcx]
685
+ return 4 ;
639
686
case 0x24448b48 : // 48 8b 44 24 XX : mov rax, QWORD ptr [rsp + XX]
640
687
case 0x246c8948 : // 48 89 6C 24 XX : mov QWORD ptr [rsp + XX], rbp
641
688
case 0x245c8948 : // 48 89 5c 24 XX : mov QWORD PTR [rsp + XX], rbx
@@ -645,6 +692,10 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {
645
692
case 0x24548948 : // 48 89 54 24 XX : mov QWORD PTR [rsp + XX], rdx
646
693
case 0x244c894c : // 4c 89 4c 24 XX : mov QWORD PTR [rsp + XX], r9
647
694
case 0x2444894c : // 4c 89 44 24 XX : mov QWORD PTR [rsp + XX], r8
695
+ case 0x244c8944 : // 44 89 4c 24 XX mov DWORD PTR [rsp + XX], r9d
696
+ case 0x24448944 : // 44 89 44 24 XX mov DWORD PTR [rsp + XX], r8d
697
+ case 0x24548966 : // 66 89 54 24 XX : mov [rsp + XX], dx
698
+ case 0x246c8d48 : // 48 8d 6c 24 XX : lea rbp, [rsp + XX]
648
699
return 5 ;
649
700
case 0x24648348 : // 48 83 64 24 XX : and QWORD PTR [rsp + XX], YY
650
701
return 6 ;
0 commit comments