4

問題は、32ビットのapplication.exeをビルドすると、16ビットのマシンコードを持つアプリケーションを取得することです。

コードは次のとおりです(本から取得):

        .386
    .model flat
    .const
URL db  "http://www.lionking.org/`cubbi/", 0
    .code

_start:
    xor ebx, ebx
    push ebx
    push ebx
    push ebx
    push offset URL
    push ebx
    push ebx
;        call ShellExecute 
    push ebx
;        call ExitProcess

end     _start

私がコンソールで書くアプリケーションを構築するために

  • ml winurl.asm(ml / c winurl.asmを試しましたが、他の結果はありません)
  • リンクwinurl.obj

次に、16ビットのマシンコードを含む実行可能ファイルがあります。

PU = ?86, Uirtual 8086 Mode, Id/Step = 0F62, A20 enabled
09E4:0000 33DB   XOR    BX,BX
09E4:0002 53     PUSH   BX
09E4:0003 53     PUSH   BX
09E4:0004 53     PUSH   BX
09E4:0005 680000 PUSH   0000h
09E4:0008 0000   ADD    [BX+SI],AL
09E4:000A 53     PUSH   BX
09E4:000B 53     PUSH   BX
09E4:000C 53     PUSH   BX
09E4:000D 0000   ADD    [BX+SI],AL
09E4:000F 006874 ADD    [BX+SI+74h],CH
09E4:0012 7470   JZ Short 0084

適切に機能するコードは必要ありません。32ビットコードでアプリケーションをアセンブリしたい、または自分が間違っていることを理解したい。

ご清聴ありがとうございました。

4

2 に答える 2

4

コードが16ビット(または32ビット)であることを逆アセンブラに通知しない限り、また何らかの方法で(実行可能ファイルの形式に基づいて)推測できない限り、逆アセンブラは2つのうちどちらであるかを知ることができません。 。

16ビット逆アセンブルから命令バイトを取得し、32ビットコードとして逆アセンブルしました。

00000000:i33DB                           xor       ebx,ebx
00000002:i53                             push      ebx
00000003:i53                             push      ebx
00000004:i53                             push      ebx
00000005:i6800000000                     push      00000000
0000000A:i53                             push      ebx
0000000B:i53                             push      ebx
0000000C:i53                             push      ebx
0000000D:i0000                           add       [eax],al ; 0s between code & data
0000000F:i006874                         add       [eax+74],ch ; db 0,"ht"
00000012:i7470                           je ; db "tp"

これは、アセンブリソースから生成された正しい32ビットマシンコードであり、正しく分解していません。どういうわけかあなたはそれを16ビットとして分解しています、それは間違っています。

于 2013-02-21T18:28:35.697 に答える
2

32ビットコードを作成したことを逆アセンブラに通知する必要があります。証明:
From:

push offset URL

逆アセンブラはこれを示しました:

09E4:0005 680000 PUSH   0000h  
09E4:0008 0000   ADD    [BX+SI],AL

2番目のコマンドのOPコードは0000hであり、これは最初の操作のパラメーターです。逆アセンブラは、これが4バイトであると考えています(OPコードのパラメータのサイズの正確な違いはわかりません。これは16〜32ビットによるものであると確信しています)。

于 2013-02-22T14:48:24.217 に答える