SwiftShield는 name obfuscation에 사용되는 툴이다.
이름을 공격자가 의미있는 형태로 되돌릴 수 없도록 무작위 난독화를 시키는데 사용된다.
⇒ class-dump 혹은 Frida 등으로 얻은 정보가 덜 유용하도록 만든다
⇒ 리버서의 요구 실력을 높히는 효과 (raise the bar)
주의 : 소스코드를 꼭 백업해두고, release용 소스에만 적용하도록
샘플 프로젝트
SwiftSheld 의 사용법 설명을 위한 샘플 프로젝트가 있다.
설치과정
- Xcode로 프로젝트를 열고 빌드가 성공적으로 되는지 확인한다.
- 최신 버전의 SwiftShield를 다운받고 압축푼다.
- 압축 푼 폴더에서 swiftshield 실행바이너리를 /usr/local/bin 으로 옮긴다.
$ cp swiftsheld/swiftshield /usr/local/bin
도구 사용
# 난독화 하고자하는 앱의 디렉토리로 이동 $ cd SwiftSecurity #테스트 앱 # 난독화 도구 적용 $ swiftshield -automatic -project-root . -automatic-project-file SwiftSecurity.xcodeproj -automatic-project-scheme SwiftSecurity # [결과 로그] SwiftShield 3.4.0 Automatic mode Building project to gather modules and compiler arguments... -- Indexing ReverseEngineeringToolsChecker.swift -- Found declaration of ReverseEngineeringToolsChecker (s:13SwiftSecurity30ReverseEngineeringToolsCheckerC) Found declaration of amIReverseEngineered (s:13SwiftSecurity30ReverseEngineeringToolsCheckerC20amIReverseEngineeredSbyFZ) Found declaration of checkDYLD (s:13SwiftSecurity30ReverseEngineeringToolsCheckerC9checkDYLD33_D6FE91E9C9AEC4D13973F8ABFC1AC788LLSbyFZ) Found declaration of checkExistenceOfSuspiciousFiles (s:13SwiftSecurity30ReverseEngineeringToolsCheckerC31checkExistenceOfSuspiciousFiles33_D6FE91E9C9AEC4D13973F8ABFC1AC788LLSbyFZ) ...
swiftshield 도구를 사용하면 class, method, field 이름을 탐지해서 암호화된 식별자로 대체한다.
[원본]

읽기 좋은 형태로, 작성한 그대로 있는 상태.
[난독화 적용 후]

읽기 힘들고, 원래 함수 이름이 뭔지 추측할 수 없는 형태로 대체되었다.
공격자는 함수 내부를 분석한 후, 알아서 본인이 추측할 수 있는 이름으로 명명하는 등 일이 많아진다.
[conversionMap.txt]
swiftshield 도구를 거친 후에는 swiftshield-output/<timestamp>/ 폴더가 추가되고, 내부에는 conversionMap.txt 텍스트 파일을 볼 수 있다.
문자열이 어떻게 변환되었는지 문자열 변환 맵핑 정보를 저장한 파일이다.
$ cat conversionMap.txt // // SwiftShield Conversion Map // Automatic mode for SwiftSecurity, 2020-01-02 13.51.03 // Deobfuscate crash logs (or any text file) by running: // swiftshield -deobfuscate CRASH_FILE -deobfuscate_map THIS_FILE // #변환 정보가 보인다. ViewController ===> hTOUoUmUcEZUqhVHRrjrMUnYqbdqWByU viewDidLoad ===> DLaNRaFbfmdTDuJCPFXrGhsWhoQyKLnO sceneDidBecomeActive ===> SUANAnWpkyaIWlGUqwXitCoQSYeVilGe AppDelegate ===> KftEWsJcctNEmGuvwZGPbusIxEFOVcIb Deny_Debugger ===> lKEITOpOvLWCFgSCKZdUtpuqiwlvxSjx Button_Emulator ===> akcVscrZFdBBYqYrcmhhyXAevNdXOKeG
이 파일은 개발자도 crash log를 분석하려면 난독화를 해제할 필요가 있으므로 맵핑정보를 기록해 둔 것이다.