특정 함수 호출에 대한 매개 변수 목록을 만들기 위해 프로그램의 이진 실행 파일을 분석하려고합니다. OllyDbg를 사용하여 함수에 대한 모든 호출 목록을 찾을 수는 있지만 실제로 코드를 실행하지 않고 매개 변수를 표시하는 것이 아무것도 표시되지 않습니다.이진 실행 파일에서 함수에 매개 변수 나열
함수가 매개 변수 2 개를 취하는 것처럼 보입니다. 각 매개 변수는 각 인스턴스의 CALL 바로 앞에 간단한 PUSH가 제공됩니다. DiStorm을 사용하여이 단일 인스턴스에 대한 코드를 숨길 수 있지만 다른 곳에서 사용할 수있는보다 일반적인 솔루션을 선호합니다. OllyDbg는 함수를 실행할 때 매개 변수의 수를 알고있는 것처럼 보이므로 정적 분석을 통해 매개 변수의 수를 결정할 수 있다고 생각하지만 x86 어셈블리에 대한 내 이해는 정직하게 매우 제한적입니다.
Diestorm을 사용하는 유일한 방법은 없습니까?이 함수를 호출하기 전에 마지막 2 PUSH 문을 잡아 둘 수 있습니까?
함수에 대한 인수를 PUSH 명령으로 스택에 배치 할 필요는 없습니다. 물론 표준 i386 C 함수 이외의 ABI에서 인수는 레지스터로 전달 될 수 있습니다. 사실 어떤 경우에는 얼마나 많은 인수가 전달되었는지를 아는 것이 불가능할 수도 있습니다. 일반적인 경우에이를 수행 할 방법이 없습니다. 가장 좋은 방법은 런타임에 호출을 트랩하고 인수를 기록하는 것입니다. –
가변 인수 함수로 제한된 수로 전달 된 함수의 수를 구별 할 수없는 경우가 있습니까? 그렇다면, 나는 그 중 어떤 것에도 뛰어들 것으로 예상하지 않습니다. 함수 인수가 PUSH를 거치지 않아도되고 스택에있을 필요가 없다는 것을 알고 있습니다. 이 특정 사례 (인수가 스택에 있고 PUSH로 넣는 위치)에 대한 솔루션이 필요하지만 더 일반적인 솔루션이있는 경우이를 선호합니다. 인수를 전달할 수있는 가능한 모든 방법을 설명 할 필요는 없습니다. – qazmlpok
메소드 또는 함수 정의가 고정되어 있지 않은 바이트 코드에서 매개 변수를 가져 오는 일반적인 솔루션을 정의하는 것은 어렵습니다 (Java 또는 .NET의 경우처럼). 모든 최적화 작업을 해제하려고하면 스택에 매개 변수를 밀어 넣을 수 있습니다. 하지만 최적화는 최적화이며 이러한 것은 프로세서마다 다릅니다. 예를 들어 ARM은 파라미터를위한 레지스터 (IIRC'r2'에서'r5')를 가지고 있습니다. – user35443