0

IDA pro で次の Win32 実行可能ファイルの逆アセンブリを見て、その部分を取得しましたが、ここsnwprintfでの命令の目的がわかりません(文字列の一部を破棄していますか?)。mov ecx, [eax+4]

loc_4018E7:
mov     eax, 0DEEDh
push    eax
push    offset asc_402270 ; "%X"
push    4               ; size_t no. chars
lea     ecx, [ebp+var_inpPassStr]
push    ecx             ; wchar_t * opBuffer
call    ds:_snwprintf   ; convert number to HEX string
add     esp, 10h
xor     edx, edx
mov     [ebp+var_8], dx
mov     eax, [ebp+arg_inpPass]
mov     ecx, [eax+4]
mov     [ebp+var_14], ecx
lea     edx, [ebp+var_inpPassStr]
push    edx             ; wchar_t *
call    ds:wcslen
add     esp, 4
mov     esi, eax
mov     eax, [ebp+var_14]
push    eax             ; wchar_t *
call    ds:wcslen
add     esp, 4
cmp     esi, eax
jnz     short loc_401984; this prints "invalid pass"

これに関する洞察は素晴らしいでしょう。

4

3 に答える 3

1

これ

mov     eax, [ebp+arg_inpPass]
mov     ecx, [eax+4]

eax関数の引数 (arg_inpPass逆アセンブラーによって名前が付けられます) の値 (たまたまポインター) をロードし、最初の 4 バイトをスキップして逆参照します。

コードが何をしているのかを知らなかったり、コードをもっと見たりしないと、最初の 4 バイトがスキップされる理由を知ることはできません。ポインターが構造体を指しており、関数がオフセット 4 でそのメンバーにアクセスすることに関心がある可能性があります。それは別のものである可能性があります。

于 2013-02-24T09:04:43.830 に答える
-1

まず、ebpこの逆アセンブリ ブロックでは設定されません。おそらく、この逆アセンブリ ブロックの前の行で設定されています。これがアセンブリで記述されている場合、通常は高レベル言語 (C、C++ など) で使用されるため、スタックではなく別の場所を指す可能性があります。

mov     eax, [ebp+arg_inpPass]    ; read a dword variable (it's a pointer)
                                  ; from the stack into eax
mov     ecx, [eax+4]              ; use that pointer plus 4 to read a dword value
                                  ; from memory into ecx
mov     [ebp+var_14], ecx         ; store the value read into ecx into
                                  ; a local variable (in the stack)
于 2013-02-24T09:02:59.020 に答える