8 votos

MacOS Big Sur Dictionary.app no utiliza el proxy del sistema

Al utilizar Wikipedia en Dictionary.app en MacOS Big Sur 11.0.1, Dictionary.app envía solicitudes HTTPS a *.b.akamaiedge.net y no está utilizando el proxy del sistema (HTTP o socks5). ¿Cómo puedo arreglar esto?

3 votos

¡Vaya, otra persona se encontró con este extraño caso límite! He confirmado que Dictionary también ignora descaradamente el proxy del sistema para acceder a Wikipedia en 10.6 (Snow Leopard), 10.9 (Mavericks) y 10.14 (Mojave), y presumiblemente lo hace en todos los sistemas operativos intermedios. En particular, Hopper hace que parezca que el Diccionario está leyendo una clave booleana sospechosamente llamada DCSDisableProxyForWikipediaAccess de alguna parte, pero nada de lo que establezca a través de defaults write ¡parece tener algún efecto!

0 votos

@Wowfunhappy Deberías poder configurarlo a través de defaults write -g , pero de cualquier manera esa clave no controla realmente el comportamiento del proxy. En cambio, controla si las solicitudes se envían a " lookup-api.apple.com/es.wikipedia.org ..." o simplemente a es.wikipedia.org directamente.

0 votos

@Wowfunhappy La conexión real se realiza a través de NSURLConnection y no parece realmente fuera de lo común. NSUrlConnection debe respetar el proxy del sistema. Lo único que se me ocurre es que como accede a http://... que 307 redirige a la versión HTTPS, de alguna manera no honra el proxy https en ese caso.

4voto

Wowfunhappy Puntos 33

Este fenómeno no es exclusivo de Big Sur, sino que probablemente se remonta a la introducción de la aplicación Dictionary en Tiger. @1110101001 hizo algo de ingeniería inversa para averiguar qué está pasando.

DictionaryServices.framework hace conexiones de red a través del ahora obsoleto CFHTTPStream . Según un ingeniero de Apple y Código propio de Apple cualquier software que utilice CFHTTPStream ignorará la configuración del proxy del sistema, a menos que el desarrollador se esfuerce en añadir unas líneas de código adicionales.

Para solucionar este problema, tendremos que inyectar algo de código que haga lo que los desarrolladores originales no hicieron: decirle a la aplicación que aplique la configuración del proxy del sistema antes de ejecutar CFHTTPStream .

En primer lugar, compila el siguiente código (por ejemplo clang -framework AppKit -framework Foundation -o ProxyFix.dylib -dynamiclib /path/to/code.m ) para crear una biblioteca que podamos inyectar. Esto también fue escrito en su mayor parte por 1110101001; lo ajusté para que funcione con aplicaciones que utilizan espacios de nombres de dos niveles.

#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);

Ahora tenemos que insertar esta biblioteca en la aplicación del Diccionario. Por suerte, MacOS viene con un mecanismo incorporado para inyectar código en forma de DYLD_INSERT_LIBRARIES . Si usted, como yo, está ejecutando una versión antigua y adorablemente hackeable de MacOS como la 10.9, todo lo que necesita hacer es ejecutar su aplicación después de establecer esta variable de entorno. Por ejemplo, ejecutar en Terminal:

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

Si está ejecutando MacOS 10.6 o inferior, o si la aplicación no está firmada (posiblemente porque usted eliminó la firma del código a través de optool o similar), también puedes añadir esta variable de entorno al Info.plist de la aplicación, para que la biblioteca se inyecte automáticamente.

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

Desafortunadamente, las nuevas versiones de MacOS tienen características de seguridad adicionales para evitar la inyección de código. A partir de la versión 10.11, tendrá que desactivar la protección de la integridad del sistema para poder utilizar DYLD_INSERT_LIBRARIES . En los sistemas operativos más recientes, como Big Sur, es posible que tengas que tomar otras medidas (o no), como desactivar AMFI; no estoy del todo familiarizado con todos los nuevos controles de seguridad que Apple ha incorporado en los últimos años.


P.D. Si usted está ejecutando 10.6 - 10.9, envolví esto en un pequeño instalador que le ayuda a configurar un proxy, y luego aplica el parche anterior a la aplicación Diccionario. Sin la ayuda de un proxy, la funcionalidad de Wikipedia de la aplicación Diccionario ya no funciona en absoluto en estos sistemas. <a href="https://jonathanalland.com/downloads/wowfunhappy-https-proxy.dmg" rel="nofollow noreferrer">https://jonathanalland.com/downloads/wowfunhappy-https-proxy.dmg</a>

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X