8 votes

MacOS Big Sur Dictionary.app n'utilise pas le proxy du système

Lors de l'utilisation de Wikipédia dans Dictionary.app sur MacOS Big Sur 11.0.1, Dictionary.app envoie des requêtes HTTPS à *.b.akamaiedge.net et n'utilise pas de proxy système (HTTP ou socks5). Comment puis-je résoudre ce problème ?

3 votes

Une autre personne s'est trouvée confrontée à cet étrange cas de figure ! J'ai confirmé que Dictionnaire ignore également de manière flagrante le proxy système pour l'accès à Wikipédia sur 10.6 (Snow Leopard), 10.9 (Mavericks) et 10.14 (Mojave), et vraisemblablement sur tous les systèmes d'exploitation intermédiaires. Notamment, Hopper donne l'impression que Dictionary lit une clé booléenne nommée de façon suspecte DCSDisableProxyForWikipediaAccess de quelque part, mais rien de ce que j'ai défini via defaults write semble avoir un effet !

0 votes

@Wowfunhappy La connexion réelle se fait via NSURLConnection et ne semble pas vraiment sortir de l'ordinaire. NSUrlConnection doit respecter le proxy du système. La seule chose à laquelle je peux penser est que, parce qu'il accède à http://... qui 307 redirige vers la version HTTPS, il n'honore pas le proxy https dans ce cas.

1 votes

Oh apparemment ce code de mise en réseau dans l'application principale du dictionnaire n'est jamais utilisé. Le vrai code se trouve dans DictionaryServices.framework. Il utilise CFHTTP qui contourne le proxy du système : developer.apple.com/forums/thread/69452

4voto

Wowfunhappy Points 6021

Ce phénomène n'est pas propre à Big Sur - il remonte probablement à l'époque où l'application Dictionary a été introduite dans Tiger. @1110101001 a fait un peu d'ingénierie inverse pour comprendre ce qui se passe.

DictionaryServices.framework établit des connexions réseau par le biais de l'option désormais obsolète CFHTTPStream . Selon un ingénieur d'Apple y Le code propre d'Apple tout logiciel qui utilise CFHTTPStream ignorera les paramètres du proxy du système, à moins que le développeur ne fasse l'effort d'ajouter quelques lignes de code supplémentaires.

Pour résoudre ce problème, nous devrons injecter du code qui fait ce que les développeurs d'origine n'ont pas fait, à savoir demander à l'application d'appliquer les paramètres du proxy du système avant de lancer l'application CFHTTPStream .

Tout d'abord, compilez le code suivant (par ex. clang -framework AppKit -framework Foundation -o ProxyFix.dylib -dynamiclib /path/to/code.m ) pour créer une bibliothèque que nous pouvons injecter. Ceci a également été écrit en grande partie par 1110101001 ; je l'ai modifié pour qu'il fonctionne avec les applications qui utilisent des espaces de noms à deux niveaux.

#include <stdio.h>
#include <objc/runtime.h>
#include <Foundation/Foundation.h>
#include <dlfcn.h>
#include <AppKit/AppKit.h>

#define DYLD_INTERPOSE(_replacement,_replacee) \
    __attribute__((used)) static struct{ const void* replacement; const void* replacee; } _interpose_##_replacee \
                __attribute__ ((section ("__DATA,__interpose"))) = { (const void*)(unsigned long)&_replacement, (const void*)(unsigned long)&_replacee };

CFReadStreamRef myCFReadStreamCreateForHTTPRequest(CFAllocatorRef alloc, CFHTTPMessageRef request) {
    printf("Injected ProxyFix!\n");
    CFReadStreamRef ref = CFReadStreamCreateForHTTPRequest(alloc, request);
    CFDictionaryRef systemProxyDict = CFNetworkCopySystemProxySettings();
    CFReadStreamSetProperty(ref, kCFStreamPropertyHTTPProxy, systemProxyDict);
    return ref;
}

DYLD_INTERPOSE(myCFReadStreamCreateForHTTPRequest, CFReadStreamCreateForHTTPRequest);

Nous devons maintenant insérer cette bibliothèque dans l'application Dictionary. Heureusement, MacOS dispose d'un mécanisme intégré permettant d'injecter du code sous la forme de fichiers DYLD_INSERT_LIBRARIES . Si, comme moi, vous utilisez une version ancienne et adorablement piratable de MacOS telle que 10.9, il vous suffit de lancer votre application après avoir défini cette variable d'environnement. Par exemple, lancez dans Terminal :

DYLD_INSERT_LIBRARIES=/path/to/ProxyFix.dylib /Applications/Dictionary.app/Contents/MacOS/Dictionary

Si vous utilisez MacOS 10.6 ou une version inférieure, ou si l'application n'est pas signée (probablement parce que vous a supprimé la signature du code via optool ou similaire), vous pouvez également ajouter cette variable d'environnement au fichier Info.plist de l'application, afin que la bibliothèque soit injectée automatiquement.

defaults write /Applications/Dictionary.app/Contents/Info LSEnvironment -dict DYLD_INSERT_LIBRARIES @executable_path/../Frameworks/ProxyFix.dylib

Malheureusement, les versions plus récentes de MacOS disposent de fonctions de sécurité supplémentaires pour empêcher l'injection de code. À partir de la version 10.11, vous devrez désactiver la protection de l'intégrité du système afin d'utiliser DYLD_INSERT_LIBRARIES . Sur les systèmes d'exploitation les plus récents, tels que Big Sur, vous devrez peut-être (ou non) prendre des mesures supplémentaires, comme la désactivation de l'AMFI - je ne suis pas tout à fait familier avec tous les nouveaux contrôles de sécurité qu'Apple a ajoutés ces dernières années.


P.S. Si vous utilisez la version 10.6 - 10.9, j'ai regroupé tout cela dans un petit programme d'installation qui vous aide à configurer un proxy, puis applique le correctif ci-dessus à l'application Dictionary. Sans l'aide d'un proxy, la fonctionnalité Wikipedia de l'application Dictionary ne fonctionne plus du tout sur ces systèmes. <a href="https://jonathanalland.com/downloads/wowfunhappy-https-proxy.dmg" rel="nofollow noreferrer">https://jonathanalland.com/downloads/wowfunhappy-https-proxy.dmg</a>

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X