2013-11-09 4 views
0

실행중인 응용 프로그램과 대화중인 SSL 서버 간의 대화를보기 위해 MacOS X 10.8.5에서 dtruss을 사용하고 있습니다. 리눅스에서 strace과 달리, 출력에서 ​​데이터의 전체 문자열을 볼 수 없습니다. 프로그램에서 파일 디스크립터에 sendrecv을 찾을 것으로 예상합니다.dtruss 출력에서 ​​전체 문자열을 보려면 어떻게해야합니까?

dtruss은 앱이 SSL 서버와주고받는 데이터를 어떻게 표시합니까?

누구나 내가 제어하는 ​​SSL 서버에 대한 연결을 프록시하도록 알려주기 전에이 트릭을 알고 있으며이 특정 앱은 너무 스마트하지 않아서 사용할 수 없습니다.

답변

2

dtruss은 모두 DTrace 용으로 작성된 스크립트의 훌륭한 예이며 DTrace가 수행 할 수있는 방법을 보여줍니다. 그러나 상대적으로 불건전 한 OS X에 대한 truss 또는 strace과의 유사성은 매우 환영 스럽지만, 나는 dtruss이 둘 중 하나의 완전한 대체품이 될 수 없다고 생각합니다.

어쨌든 질문이 약간 모호합니다. 보시는 문자열이 잘리지 않거나 sendto() 또는 recvfrom() (근원이되는 문자열)이 전혀 표시되지 않을지 잘 모르겠습니다. DTrace로 공개 된 인터페이스). 나는 둘 다 다룰 것이다.

첫째, DTrace는 커널에서 데이터를 수집합니다. 사용자 - 랜드 버퍼는 D 언어의 copyin() 또는 copyinstr()으로 얻어지기 전에 기록되고 다시 소비자에게 전송됩니다. 일반적으로 dtrace(1) 명령입니다. DTrace는 컴파일시 커널 버퍼 크기를 알아야하기 때문에 예측할 수없는 길이의 문자열에 한계가 있습니다. 이 제한은 기본적으로 256 바이트입니다. 당신은 절단을보고있는 경우에 당신은 dtruss의이 pragma 기존 이하, 예를 들면 추가하여

#pragma D option strsize=512 

을 제한을 변경할 수 있습니다.

두 번째로 dtruss은 다양한 시스템 호출의 형식 요구 사항을 알기 위해 하드 코딩되어 있습니다. sendto() 또는 recvfrom()에 대한 버퍼 해석이 소스에서 명시 적으로 처리되지 않기 때문에 출력에 버퍼 해석이 표시되지 않습니다. 거기에 추가하기에 적합한 곳을 찾는 당신을 막을 아무것도 없습니다하지만 당신은 대신 자신의 스크립트를 작성할 수 있습니다 문자열로, 우리가 tracemem()의 사용의 DTrace의에 하드 제한을 제공 할 의무가있는 것을

bash-3.2# cat sr.d 
#pragma D option rawbytes 

syscall::sendto:entry, 
syscall::recvfrom:entry 
/pid == $target/ 
{ 
    self->bufp = arg1; 
    self->size = arg2; 
} 

syscall::sendto:return, 
syscall::recvfrom:return 
/pid == $target && self->bufp && self->size/ 
{ 
    printf("%s():\n", probefunc); 
    tracemem(copyin(self->bufp, self->size), 64); 
    printf("\n"); 
    self->bufp = self->size = NULL; 
} 
bash-3.2# dtrace -qs ./sr.d -p 16988 
sendto(): 

      0 1 2 3 4 5 6 7 8 9 a b c d e fabcdef 
     0: 68 65 6c 6c 6f 00 00 00 00 00 00 00 00 00 00 00 hello........... 
     10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
     20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
     30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 

^C 

bash-3.2# 

주 데이터 기록 버퍼. 한계에 거의 다가 가지 않는다면 이것은 결과가 압도적이며 대부분 중복 될 수 있다는 자극적 인 결과를 낳습니다. 문자열을 찾고 있다는 것을 알고 있다면 간단히 copyinstr()을 대신 사용할 수 있습니다. 당신이 내 OS 다음 X 10.6.8보다 더 현대적인 DTrace를 구현 한 경우에는 두 번째 인수는 여전히 바이트 기록하지만 숫자의 수에 엄격한 제한입니다 당신이

tracemem(copyin(self->bufp, self->size), 64, self->size); 

를 쓸 수 있습니다 찾을 수 있습니다 으로 표시되며은 선택 사항 인 세 번째 인수로 제한됩니다.

마지막으로, 사용자 - 땅 주소는 시스템 호출에 기록되지만 종료시에만 사용된다는 점에 유의하십시오.필요한 경우 시스템 호출이 데이터를 폴트 할 수있게하는 일반적인 관용구입니다. DTrace는 자체적으로 그렇게하지 않으며 비거주 주소를 추적하라는 메시지가 표시되면 런타임에 오류가 발생합니다.