Cette question et cette réponse décrivent comment lire les données d'une section Mach-O avec Objective-C sur les versions modernes de OS X/macOS : Crash de la lecture des octets de getsectbyname
La réponse décrite fonctionne. J'essaie d'implémenter la même chose avec Swift. Je n'arrive pas à le faire fonctionner.
J'ai ce qui suit dans "Other linker flags" : -Wl,-sectcreate,__LOCALIZATIONS,__base,en.lproj/Localizable.strings,-segprot,__LOCALIZATIONS,r,r
.
Ce code Swift me permet d'obtenir un pointeur vers les données intégrées, jusqu'à ce que j'essaie d'exécuter le code en dehors de Xcode et que ASLR le casse :
var size: UInt = 0
let _localizationSection = getsectdata(
"__LOCALIZATIONS",
"__base",
&size)
Pour contourner le problème de l'ASLR, selon la question et la réponse ci-dessus, et sur la base de mes propres tests, je devrais utiliser getsectiondata
à la place. Cela fonctionne très bien en Objective-C, mais je n'ai pas de chance en Swift. Le texte suivant est la seule chose que j'ai réussi à faire passer au compilateur, mais il renvoie nil :
var size: UInt = 0
var header = _mh_execute_header
let localizationSection = getsectiondata(
&header,
"__LOCALIZATIONS",
"__base",
&size)
Est-ce que prendre une copie de _mh_execute_header
le problème et y a-t-il un moyen de l'éviter ? J'ai besoin d'un UnsafePointer<mach_header_64>
mais en utilisant &_mh_execute_header
comme premier paramètre de getsectiondata
provoque une erreur de compilation.
J'utilise Swift 3.0 et j'exécute mon code sous macOS 10.12.