2011-09-14 4 views
0

NFQUEUE를 사용하여 다른 응용 프로그램의 트래픽을 필터링하는 C 프로그램에서 작업하고 있습니다. 내가해야 할 일 중 하나는 패킷 내에 포함 된 문자열을 다른 문자열로 대체하는 것입니다.문자열 검색 및 바꾸기 및 null 바이트 문자 무시

문제는 패킷에 널 터미네이터 바이트가 임의로 포함되어있는 것입니다 (문자열 중간에 있음). 이것은 strstr()을 사용하는 대부분의 솔루션이 작동하지 않는다는 것을 의미합니다. 널 터미네이터 바이트에 도달 할 때 멈추지 않는 비슷한 것을 찾아야하지만 길이를 지정하고이를 대신 사용합니다. (nfq_get_payload()는 길이를 반환합니다.)

교체를 수행하기 전에 null 바이트를 다른 바이트로 교체 한 다음 패킷이 전송되기 전에 null 바이트를 복원합니다. 이 접근 방식의 문제점은 패킷에 캐릭터가 포함될 가능성이 있으므로 최선의 방법이 아닐 수 있습니다. 나는 또한 패킷 내에 포함되지 않은 임의의 바이트를 찾을 수 있다고 생각하지만, 나는 그 모든 것을하는 것을 피하고자한다.

편집 : 원래 문자열과 대체 문자열은 모두 13자인 동일한 길이입니다.

+0

* 패킷에 null 종결 자 바이트가 임의로 포함되어있는 것 같습니다. * 프로토콜과 트래픽 사양을 가져 와서 언제 어디서 이러한 nuls가 있는지 정확히 알 수 있습니다. 형식을 이해하지 못하는 트래픽을 수정하면 응용 프로그램이 중단되어 사용자 데이터 손실을 비롯하여 모든 종류의 부작용이있는 디버깅 환경에 빠지게됩니다. – Secure

+0

개발자가 사용할 수있는 사양이없는 닫힌 소스 응용 프로그램이므로 불행히도 옵션이 아닙니다. – Mike

+0

그냥 문자열 대신 특수한 비트 패턴을 찾고 있지 않습니까? – Superlokkus

답변

1

한 문자를 찾을 수 있다면 memchr에 만족할 것입니다. 그렇지 않으면 직접 memmem 구현을하거나 온라인으로 찾아야합니다.

문자열 검색 알고리즘 (그 이유는 memmem이므로)은 다양한 성능 특성을 가질 수 있으므로 성능 알고리즘을 기준으로 문자열 검색 알고리즘을 찾고 싶습니다 (예 : this one는 허용되는 것처럼 보일 수 있지만 마일리지는 다를 수 있음) .