문제

저는 현재 어셈블리에서 쓴 프로그램을 분석하고 있으며 어셈블리에서 코드를 옮기는 것에 대해 생각하고있었습니다. 하나의 인수를 취하는 절차가 있지만 스택이나 레지스터에 전달되는지 확실하지 않습니다.

IDA Pro에서 프로그램을 열면 절차의 첫 번째 줄은 다음과 같습니다.

ThreadID= dword ptr -4

선언을 통해 커서를 마우면 다음도 나타납니다.

ThreadID dd ?
 r db 4 dup(?)

스택 변수를 가리킬 것이라고 생각하는 것은 무엇입니까?

그러나 OLLYDBG에서 동일한 프로그램을 열면 스택 의이 지점에는 큰 값이 있으며, 이는 전달 될 수있는 매개 변수와 일치하지 않아 레지스터에 전달되었다고 믿게됩니다.

누구든지 나를 올바른 방향으로 가리킬 수 있습니까?

도움이 되었습니까?

해결책

인수가 함수로 전달되는 방식은 함수의 전화 컨벤션. 기본 통화 규칙은 언어, 컴파일러 및 아키텍처에 따라 다릅니다.

나는 당신이 제공 한 정보에 대해 확실히 아무 말도 할 수는 없지만, ollydbg와 같은 어셈블리 수준의 디버거 및 IDA와 같은 분리기가 종종 휴리스틱을 사용하여 프로그램을 리버스 엔지니어링한다는 것을 잊지 말아야합니다. 컴파일러가 생성 한 코드를 연구하는 가장 좋은 방법은 어셈블리 목록을 작성하도록 지시하는 것입니다. 대부분의 컴파일러에는이를 수행 할 수있는 옵션이 있습니다.

다른 팁

확실히 로컬 변수입니다. 인수를 확인하려면 [ESP+XXX] 값을 찾으십시오. IDA는 [ESP+arg_xxx]를 자동으로 이름을 지정합니다.

.text:0100346A sub_100346A     proc near               ; CODE XREF: sub_100347C+44p
.text:0100346A                                         ; sub_100367A+C6p ...
.text:0100346A
.text:0100346A arg_0           = dword ptr  4
.text:0100346A
.text:0100346A                 mov     eax, [esp+arg_0]
.text:0100346E                 add     dword_1005194, eax
.text:01003474                 call    sub_1002801
.text:01003474
.text:01003479                 retn    4
.text:01003479
.text:01003479 sub_100346A     endp

위의 의견에 요약 된 FastCall 협약은 레지스터를 사용하여 인수를 전달합니다. 더 널리 사용되는 Microsoft 또는 GCC 컴파일러에 베팅했습니다. 따라서 ECX 및 EDX 레지스터를 먼저 확인하십시오.

Microsoft 또는 GCC [2] __fastCall [3] 컨벤션 (일명 __msfastCall)은 ECX와 EDX에 맞는 첫 두 인수 (왼쪽에서 오른쪽으로 평가)를 통과합니다. 나머지 인수는 오른쪽에서 왼쪽으로 스택에 밀려납니다. http://en.wikipedia.org/wiki/x86_calling_conventions#fastcall

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top