次のコードが与えられます:
L1 db "word", 0
mov al, [L1]
mov eax, L1
の括弧は何を[L1]
表していますか?
この質問は特にNASMに関するものです。Intel構文アセンブリのもう1つの主要なフレーバーは、MASMスタイルです。このスタイルでは、レジスターが含まれていない場合、ブラケットの動作が異なります。MASM32のブラケットの混乱
を参照してください。
次のコードが与えられます:
L1 db "word", 0
mov al, [L1]
mov eax, L1
の括弧は何を[L1]
表していますか?
この質問は特にNASMに関するものです。Intel構文アセンブリのもう1つの主要なフレーバーは、MASMスタイルです。このスタイルでは、レジスターが含まれていない場合、ブラケットの動作が異なります。MASM32のブラケットの混乱
を参照してください。
[L1]
アドレスL1のメモリの内容を意味します。mov al, [L1]
ここで実行した後、al
レジスタはアドレスL1のバイト(文字「w」)を受け取ります。
などのこのタイプのオペランドは、メモリオペランド[ebp]
と呼ばれます。
ここでのすべての答えは良いですが、これを厳格なルールとして従う際の警告については何も教えていないことがわかります-括弧の場合は、命令である場合を除いてlea
、逆参照します。
lea
上記の規則の例外です。私たちがやったと言う
mov eax, [ebp - 4]
の値はebp
4で減算され、括弧は結果の値がアドレスとして取得され、そのアドレスにある値がに格納されることを示しますeax
。ただし、lea
の場合、角かっこは次のことを意味するわけではありません。
lea eax, [ebp - 4]
の値はebp
4で減算され、結果の値はに格納されeax
ます。この命令は、アドレスを計算し、計算された値をデスティネーションレジスタに格納するだけです。MOVとLEAの違いは何ですか?を参照してください。詳細については。
単にラベルL1でマークされたアドレスでメモリを取得することを意味します。
Cが好きなら、次のように考えてください[L1]
。*L1
角かっこは、アドレスの参照を解除することを意味します。例えば
mov eax, [1234]
つまり、アドレス1234の内容をEAXに移動します。それで:
1234 00001
EAXには00001が含まれます。
直接メモリアドレス指定-al
メモリアドレスにある値がロードされますL1
。
多くのアセンブラ言語と同様に、これは間接参照を意味します。つまり、最初のmov
ロードには、アドレスではなく、 (つまりバイト)al
の内容がロードされます。L1
'w'
2番目mov
は実際にアドレスをロードeax
し、後でそのアドレス L1
を逆参照してそのコンテンツを取得または設定できます。
どちらの場合も、L1
概念的にはアドレスと見なされます。
これは、レジスタまたは数値をレジスタに移動する代わりにL1
、al
レジスタ値または数値L1
をメモリへのポインタとして扱い、そのメモリアドレスの内容をフェッチし、その内容をに移動することを意味しal
ます。
この場合、L1はメモリ位置ですが、レジスタ名が角かっこで囲まれている場合も同じロジックが適用されます。
mov al, [ebx]
負荷とも呼ばれます。
これは、レジスタ自体に作用するのではなく、レジスタを実際の場所へのポインタとして使用する必要があることを示しています。
MASMでは、ブラケットをレジスタとともに使用するとNASMのように機能し、その場合はオプションではありません。(レジスタを含まないアドレッシングモードでは、状況が異なります。MASM32の紛らわしい角かっこを参照してください) 。
括弧は、レジスターにポインターが含まれていること、およびマシン・コードがそのポインターの値を必要としていることを示します(ポインターはバイトアドレス指定にあります。ポインターはメモリーのx番目のバイトです。バイトは8桁の2進数です。1桁の16進数は4です。 2進数;バイトは2つの16進数であるため、そこから開始します); 命令のsrc部分にある場合。
バイナリマシンコードでは(notepad.exeで16進数を入力してから、16進数を\ xhexadecimal result〜python_referenceに変換します)、レジスタ内のポインタの値を取得します。これは、実行中の命令のModR/Mバイトで定義できます。私が信じている10文字であるnotepad.exeで書かれること。(最初にMASMの経験を終えてから、ウィンドウのカーネル/マルウェア分析を読んで、notepad.exeに入力する内容に関する情報を収集します。この投稿に戻って、例)
1 .686
2 .model flat, c
3 option casemap :none
4
5 include C:\masm32\include\kernel32.inc
6 includelib C:\masm32\lib\kernel32.lib
7
8 .data
9 message db "Hello world!", 0
10 .code
11
12 main proc
13 call testfunc
14 COMMENT @
15 push 0FFFFh
16 push testfunc
17 pop ax
18 @
19 invoke ExitProcess, 404
20 main ENDP
21
22 testfunc proc
23 sub esp, 1
24 mov al, 0FFh
25 mov [esp], al
26 COMMENT @
27 push 0FFFFh
28 push 05EFFB880h
29 push 0773BFF5Ch
30 push 0FB038Fh
31 mov al, [esp+8]
32 @
33 invoke ExitProcess, [esp]
34 testfunc ENDP
35
36 END main
Windows:
これを実行した結果を入力して比較する場合:
C:\ masm32 \ bin \ ml / c / Zd /coff script_name.asm
C:\ masm32 \ bin \ Link /SUBSYSTEM:CONSOLE script_name.obj
script_name.exe
echo%ERRORLEVEL%
プログラムの終了ステータス(で出力される)は、ExitProcessへの引数としてecho
スタックメモリに格納された数値であり、16進数のFFで終わります。mov [esp], al
(%ERRORLEVEL%
数値を16進数ではなく、10進数の文字列に変換しますが、同じ数値です。)
ただし、[]がない場合[esp]
:ALをEAXに変更する必要もあります(x86 CPUには8ビットレジスタを32ビットレジスタの一番下に移動する命令がないため)。そして、最後にコード行で文字「esp」が使用されたときの角かっこを削除します。これにより、espのスタック領域へのポインタが生成されます。
1 testfunc proc
2 mov eax, esp
3 mov bl, 0FFh
4 mov [eax], bl
5 COMMENT @
6 push 0FFFFh
7 push 05EFFB880h
8 push 0773BFF5Ch
9 push 0FB038Fh
10 mov al, [esp+8]
11 @
12 invoke ExitProcess, [esp]
13 testfunc ENDP
タグ:オプションのブラケット
上記のコードは、マシンコードをバイトではなく読み取り可能な方法に解釈し、Windowsカーネルがどのように実行されるかを知っている言語で、ブラケットが常に機能することを証明しています(コード内の値をポインターとして使用し、ポインターの値を取得します) exeファイル(リバースエンジニアリングウィンドウのカーネルを使用して、メモ帳内で独自のexeファイルを最初から作成します。これは十分なサポートがありませんが、マルウェア分析には十分なサポートがあります。)
(コードをテストする場合:最後のコードで行をtestfuncに置き換え、同じ方法で行を実行します):この場合、eaxはスタックセグメント(スタックセグメント)のメモリ内のespのポインターと同じです。独自の命令(イミディエート、レジスタ、またはメモリオペランドへの/からのPUSHおよびPOP 32ビット値)があるため、重要です。したがって、これを実行する場合、ベアesp
オペランドはESPレジスタの値であり、スタック上のメモリの内容ではなく、ポインタ値です。
たまに戻ってこの投稿を編集します(実際にアセンブリが上手になった場合)。したがって、これは組み立ての究極のガイドになります。アセンブリを始めたばかりで、アセンブリの特定の範囲のスクリプトで最上位ビットファインダーをすばやく作成しました。
これまでにこのスクリプトを作成するのに役立ったリソース
:C ++全体の5時間のチュートリアル:
DWORDのようなもの(unsigned long)を見つけるのに役立ちます。
https://www.bing.com
第3巻の半分まで読み、残りをざっと読みました
https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
Davy Wybrialのアセンブリ言語チュートリアルは、すべての視聴後に視聴でき
ます。https
://www.youtube.com/watch?v=wLXIWKUWpSs&ab_channel=DavyWybiral
「操作セクション」と呼ばれるIntelソフトウェア開発者マニュアルのセクション:
Windowsでコーディングアセンブリを開始する方法(MASM)
https://www.youtube.com/watch?v=lCjbwLeLNfs&ab_channel=CharlesClayton
繰り返しになりますが、私はここ(この投稿と今後の投稿)に戻って、すべての人を教育しようとします。そのため、私の知識はすべての人が読んでいるのと同じです。