NtDll
がx86プロセスでどのように動作するかを見ていて、IDA PROを使用してNtCreateFile
関数をデバッグしました。そのためのコードは以下の通りです:x86- x64アセンブリコードスイッチを実装する
mov eax, 55h ; NtCreateFile
mov edx, offset [email protected] ;
call edx ; Wow64SystemServiceCall() ;
retn 2Ch
とWow64SystemServiceCall()
を:
mov edx, large fs:30h
mov edx, [edx+464h]
test edx, 2
jz short loc_7738B5C8
int 2Eh ; DOS 2+ internal - EXECUTE COMMAND
; DS:SI -> counted CR-terminated command string
retn
loc_7738B5C8: ; CODE XREF:
jmp far ptr byte_7738B8FF
私はjmp far ptr byte_7738B8FF
ためのコマンドコードを見上げると、それは別のセグメント、0x33のjmp 0x33:0x7738b5cf
へのジャンプであるEA CF B5 38 77 33 00
ました。だから、私がインターネットで読んだところでは、これは64ビットシステム上のプロセスのためのx64セグメントベースですよね?残念ながら私はさらにデバッグすることはできません。なぜなら、idaはジャンプに従わないからです。しかし、私は、x64用にコンパイルされ、別の単純なCアプリケーションを作って、CreateFile
と呼ばれる、添付のx64 IDA PROリモートデバッガ、および解体を見上げ、そしてNtCreateFile
はそうのように見ていた:
x64_NtCreateFile proc near
mov r10, rcx
mov eax, 55h
test byte ptr ds:7FFE0308h, 1
jnz short loc_7FFED6695B85
syscall
retn
loc_7FFED6695B85:
int 2Eh ; DOS 2+ internal - EXECUTE COMMAND
; DS:SI -> counted CR-terminated command string
retn
は、だから私はどうするか、いくつかの疑問を持っていますx86プロセスからのジャンプは、ntdllを遠くにジャンプjmp 0x33:0x7738b5cf
x64_NtCreateFile
最初の命令に土地をジャンプ?この場合、x86からx64への切り替えはどのように起こりますか?基本的には、私はちょうどx86アプリケーションを作成し、ジャンプセグメントを切り替えて、ちょうどdb (0x00) ; x64 machine code commands
のような何かを行うことによって作成することができますx64コードを実行する、これは正しいですか?
ここに。最初に16ビット→32ビットトランジション、その後で32→64ビットスイッチとなります。 – enhzflep
'残念ながら、私はさらにデバッグすることができません。なぜなら、idaは悪いデバッガであるため、idaはジャンプに従わないからです。 windbgを使用してください - あなたはジャンプに入ることができます – RbMm
@RbMmアドバイスのおかげで。私はそれを試して、それはあまり快適ではなかったが、分解の面ではより良い – Vlad