4

それで構造物の作り方のマニュアルを読んでいました..

最初に、私はしました:

struc point X, Y
{
   .X dw X
   .Y dw Y
}



section '.code' code readable executable
main:
   push ebp
   mov ebp,esp

   PP Point 0, 0   ;Crashes here..

   mov esp, ebp
   pop ebp
   mov eax, 0x0
ret

だから私はそれがローカル変数であるのでよく考えましたsub esp, sizeof(Point).

そのため、Point 構造内で実行したところ、クラッシュする代わりに削除されました。

section '.data' data readable writeable
Response db 13, 10, "Value: %d", 13, 10, 0

struc Point X, Y
{
   sub esp, 0x8
   mov dword[esp + 0x00], X
   mov dword[esp + 0x04], Y
}



section '.code' code readable executable
main:
   push ebp
   mov ebp,esp

   PP Point 0, 0        ;create a point
   push PP
   call Point_Valid
   add esp, 0x04



   mov esp, ebp
   pop ebx

   call [getchar]

   mov eax, 0x00
ret


Point_Valid:
   push ebp
   mov ebp, esp

   mov eax, [ebp + 0x8]
   push eax              ;Not sure how to get Point from eax or Point.X..
   push Response
   call [printf]
   add esp, 0x08


   mov esp, ebp
   pop ebp
ret                         

ただし、上記が失敗するだけでなく、これもトリガーされます。

ここに画像の説明を入力 Malware Defender for Windows 8.1 内から

理由がわかりません:Sしかしsub esp、構造体内で使用した場合にのみ発生します。を使用する.X dw Xと、クラッシュするだけで、マルウェア ディフェンダーはトリガーされません。

ポイントを関数に渡す方法を教えてください。または、ローカル ポイントを作成して関数に渡し、そのフィールドにアクセスしますか?

4

2 に答える 2

1

最初の例では、スペルミスがあったpointためPoint、アセンブルしませんでした (アセンブラに大文字と小文字を区別しないように指示しない限り)。

それを無視すると、あなたがここで何をしているのか:

main:
push ebp
mov ebp,esp

PP point 0, 0   ;Crashes here..

mov esp, ebp
pop ebp
mov eax, 0x0

あなたが書いた場合とほとんど同じです:

main:
push ebp
mov ebp,esp

dw 0,0

mov esp, ebp
pop ebp
mov eax, 0x0

これらの 2 つの 0 ワードを、それらを置く命令「ストリーム」に挿入するだけです。これをアセンブルしてから出力を逆アセンブルすると、次のようになります。

00000000  6655              push ebp
00000002  6689E5            mov ebp,esp
00000005  0000              add [bx+si],al  ; <- the first 0
00000007  0000              add [bx+si],al  ; <- the second 0
00000009  6689EC            mov esp,ebp
0000000C  665D              pop ebp
0000000E  66B800000000      mov eax,0x0
00000014  C3                ret

変数ppは、コード パスで終わらないように (つまりeip / rip、変数に到達しないように)、別の場所で宣言する必要があります。


スタック割り当てが本当に必要な場合は、point次を使用できますvirtual at

virtual at esp-0x10  ; use whatever address is appropriate in your case
  pp point 1,2
end virtual

mov ax,[pp.X]

pointこれは;にスペースを割り当てたり、初期化したりしないことに注意してください。名前とアドレスのマッピングを設定するだけです。

于 2014-03-18T12:46:08.770 に答える
1

これら 2 つのバリアントでは、異なるものを定義します。最初のバリアントでは、コード内にデータを作成し、それを実行しようとします。変数にランダムな命令が含まれている限り (デバッガーで確認してください)、コードはクラッシュします。プログラムのデータセクションに変数を移動することをお勧めします-デフォルトで存在する必要があります。

2 回目の試行では、データを命令に置き換えます (ただし、ここでは構造を使用する必要はありません)。その後、コードは適切に実行されます。そしてそれは有効なコードです。

AV がこのコードを気に入らないという事実は、AV メーカーの私見の問題です。私の提案は、それをまったくアンインストールすることです。

実際、FASM は、「適切なコード」とは何か、ウイルスとは何かを想定している AV に問題を抱えていることがよくあります。これらはすべて偽陽性であることに注意してください。

于 2014-03-18T12:43:46.453 に答える