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 回答
-1
mov     eax, [ebp+arg_inpPass]
mov     ecx, [eax+4]
mov     [ebp+var_14], ecx

第一行,从 [ebp+arg_inpPass] 指向的地址加载 4 个字节(32 位或 DWORD)

第二行从前一行地址加载 32 位值加 4,这意味着如果 eax 为 12345678h,则 ecx 变为地址 1234567Ch 指向的 32 位值

第三行将 ecx 的值移动到 [ebp+var_14] 指向的地址,

你确定第一行不是 LEA 指令吗?如果它真的是一个 mov 那么代码提供了一种访问用户提供的内存位置的方法。

于 2016-07-27T04:24:08.660 回答