Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Thomas Steinacher - Hakovanje Planinskog Lava

Hakovanje Planinskog Lava: Dovođenje starog Web inspektora nazad 2012-08-27

Problem

U Planinskom Lavu, Apple je predstavio novog Web inspektora za Safari. Međutim, novi inspektor dolazi sa užasnim UI. U poređenju sa starim inspektorom, potrebna su još dva dodatna klika da biste otvorili konzolu i još dva da pogledate HTTP zahtev (nakon što je uspešno dešifrovao ikone). Po standardnoj vrednosti, novi inspektor takođe neočekivano pada na izuzecima, što je veoma zbunjujuće. Zahtevi okna mreže ne dozvoljavaju da se vidi za šta je zahtev metod korišćen za određeni zahtev i ne pokazuje telo zahteva koji je poslat, zbog čega je veoma teško naći POST zahtev i ispraviti ga.

Hakerisanje okolo

Ispostavilo se da WebKit Nightly builds imaju opciju u Developer meniju, pod nazivom Use WebKit Web Inspector. Izborom ove opcije rešava se problem i vraća se stari inspektor. Međutim ovo radi samo u noćnom Safari-ju. Nije korisno za moj slučaj, jer sam ja razvijao Cocoa aplikaciju i hteo sam da koristim WebKit inspektora u jednoj od svojih WebViews.

Naravno, koristio sam dtrace da vidim šta se dešava:

% cat inspector.d
pid$target::*nspector*:entry {}
pid$target::*nspector*:return {}

% sudo dtrace -s inspector.d -F -c /Applications/Safari.app/Contents/MacOS/SafariForWebKitDevelopment

Osnovna sintaksa dtrace skripte je pid:class-name:method-name:entry/return, a detalji se mogu naći u man dtrace. Evo, komanda pokreće Safari i sluša bilo koji Objective - C poruke kоje sadrže žice nspector.

Nakon kliktanja okolo, evo šta je našao:

  0  <- -[NSWindow(NSInspectorBarSupport) inspectorBar] 
  0  -> -[DevelopMenuController useWebKitWebInspector] 
  0    -> Safari::WK::Preferences::inspectorUsesWebKitUserInterface() const 
  0      -> WKPreferencesGetInspectorUsesWebKitUserInterface 
  0        -> WebKit::WebPreferences::inspectorUsesWebKitUserInterface() const 
  0          -> WebKit::WebPreferencesKey::inspectorUsesWebKitUserInterfaceKey() 
  0          <- WebKit::WebPreferencesKey::inspectorUsesWebKitUserInterfaceKey() 
  0        <- WebKit::WebPreferences::inspectorUsesWebKitUserInterface() const 
  0      <- WKPreferencesGetInspectorUsesWebKitUserInterface 
  0    <- Safari::WK::Preferences::inspectorUsesWebKitUserInterface() const 
  0  <- -[DevelopMenuController useWebKitWebInspector] 
  0  -> Safari::BrowserContentViewController::canShowInspector() const 
  0  <- Safari::BrowserContentViewController::canShowInspector() const 
  0  -> -[NSWindow(NSInspectorBarSupport) inspectorBar] 

Sada moramo da pronađemo način za druge Cocoa aplikacije da koriste starog inspektora. Srećom, WebKit je open source. Nakon pretrage za ključnim rečima, zanimljiv kod fajl je iskočio i sadrži sledeće upadljive funkcije:

static bool useWebKitWebInspector()
{
    // Call the soft link framework function to dlopen it, then [NSBundle bundleWithIdentifier:] will work.
    WebInspectorLibrary();

    if (![[NSBundle bundleWithIdentifier:@"com.apple.WebInspector"] pathForResource:@"Main" ofType:@"html"])
        return true;

    if (![[NSBundle bundleWithIdentifier:@"com.apple.WebCore"] pathForResource:@"inspector" ofType:@"html" inDirectory:@"inspector"])
        return false;

    return [[NSUserDefaults standardUserDefaults] boolForKey:@"UseWebKitWebInspector"];
}

Nakon pokušaja očigledne stvari koja je bila defaults write -g UseWebKitWebInspector -bool YES, koja nije uradila ništa, kao i pomeranje /System/Library/PrivateFrameworks/WebInspector.framework/Resources/Main.html na drugo mesto, što je slomilo Safari, shvatio sam da mi je potrebno da instaliram noviju verziju WebKit na mom kompjuteru.

Rešenje

Instaliranje novog WebKit iz noćnog izgrađenog širokog sistema, nije bilo toliko teško. Posle malo pokušavanja i grešaka (uglavnom koristeći grep da identifikuje nestale simbole u okvirima Safari crash tracebacks), sledeći raspored je trik:

% cd /System/Library/Frameworks
% sudo mv WebKit.framework WebKit.framework.old
% sudo cp  -a /Applications/WebKit.app/Contents/Frameworks/10.8/WebKit.framework .
% sudo mkdir -p WebKit.framework/Versions/A/Frameworks
% sudo cp -a /Applications/WebKit.app/Contents/Frameworks/10.8/WebCore.framework WebKit.framework/Versions/A/Frameworks
% sudo mv JavaScriptCore.framework JavaScriptCore.framework.old
% sudo cp -a /Applications/WebKit.app/Contents/Frameworks/10.8/JavaScriptCore.framework .
% cd /System/Library/PrivateFrameworks
% sudo mv WebKit2.framework WebKit2.framework.old
% sudo cp  -a /Applications/WebKit.app/Contents/Frameworks/10.8/WebKit2.framework .

Nakon toga, sve što je potrebno je da se uradi postavljanje globalne prednosti:

% defaults write -g UseWebKitWebInspector -bool YES

Sada svaka Cocoa aplikacija koristi starog WebKit inspektora, uključujući originalni Safari. Problem rešen.

 

Koje su druge stvari koje vas nerviraju u Planinskom Lavu i koje biste hteli da hakujete?


Published (Last edited): 23-01-2013 , source: http://thomasst.ch/webinspector/