Cómo detectar y evitar el uso de APIs privadas en las bibliotecas de terceros
-
16-09-2019 - |
Pregunta
Ahora que Apple se está ejecutando algún tipo de análisis estático para comprobar automáticamente si el uso de la API privada, un número de personas que han sido capturados por la biblioteca Three20. Utilizo otra biblioteca de terceros (que yo puedo compilar a partir del código) y me gustaría para auditar automáticamente para uso API privada antes de enviarla a Apple, para que pueda eliminar / re-escribir esas partes.
Si me quedo en mi nm
ejecutable de la aplicación, me sale una lista de símbolos, y yo estoy viendo símbolos de ahí que no utilizo. Por ejemplo veo _AudioServicesPlaySystemSound, y si busco "AudioServicesPlaySystemSound" en XCode no da resultados positivos. ¿Hay alguna manera de discriminar automáticamente las llamadas a las API privadas, por ejemplo, puedo tener que Apple tiene la costumbre de nombrarlos con un guión inicial.
Sin embargo: si incluyo deliberadamente una llamada a una API privada que no aparece en la salida del nm
, pero sí muestra arriba si corro strings
en el binario. En base a esto, una idea que tenía era para compilar una lista enorme de todas las llamadas a la API privadas en una enorme mesa y buscar automáticamente en la salida de cadenas. No he hecho todavía.
¿Alguien tiene algún consejo sobre cómo coger automáticamente estas cosas, así que sólo voy a través del proceso de revisión una vez?
Solución
Se podría intentar ejecutar nm en los archivos de objeto en lugar del ejecutable enlazado:
nm -g -j *.o | sort | uniq
Los objetos deben estar en el subdirectorio de build/<app>.build/*/<app>.build/Objects-normal
.
Estás viendo una referencia a AudioServicesPlaySystemSound
porque una de las funciones que he llamado a su vez llama AudioServicesPlaySystemSound
.
Objetivo llamadas C no se mostrarán generalmente en vertederos nm
, tendrá que utilizar para que otool
:
otool -ov <object file>
Otros consejos
Utilice esta herramienta dev, aplicación de escáner . De analizar el archivo .app para los métodos de la API privadas. Una versión futura también va a buscar variables de instancia API privadas.