Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Browser-Pwning- — Una documentazione ben strutturata per iniziare con il pwning di Chrome e il pwning di V8. | Kitploit
Strumenti/GitHubGitHub/spiralbl0ck/browser-pwning-
Analisi delle VulnerabilitàExploitReverse EngineeringSicurezza WebApprendimento e FormazioneBinary Exploitation
GitHubspiralbl0ck/browser-pwning-

Browser-Pwning-

Una documentazione ben strutturata per iniziare con il pwning di Chrome e il pwning di V8.

Vedi Repository
197194 anni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Browser-Pwning

Una documentazione adeguata e ben strutturata per iniziare con il chrome pwning & il v8 pwning

Struttura del documento

Come è organizzato questo documento

  1. Motivazione
  2. Materiale di Studio Reale

Motivazione

I browser sono una delle tecnologie più utilizzate oggi. Su ogni computer standard, se facciamo plug and play vedremo un browser installato. Ecco perché, dalla prospettiva di un attaccante e di un modello di minaccia, è molto gratificante se l'attaccante riesce a compromettere il browser tramite una pagina dannosa. Dati gli argomenti precedenti, ho scelto di studiare il motore JavaScript di Google, in particolare v8.

Data la natura gigantesca del progetto v8, ho scelto come punto di partenza l'interprete, cioè d8. Sebbene su d8 sia già stata fatta una ricerca approfondita, speriamo di trovare almeno un bug e, in caso contrario, di poter andare avanti con la ricerca sullo sfruttamento dei browser, poiché v8 fornisce il terreno di ingresso per le strategie di base dello sviluppo di exploit utilizzate nell'esploitazione dei browser.

Un altro motivo per cui ho scelto v8 come bersaglio è che è usato su più browser.

Se guardiamo sotto il cofano, possiamo vedere che il motore è usato anche in MicrosoftEdge, quindi c'è la possibilità di multipli premi bug bounty. Per quanto riguarda il sistema operativo sottostante, il ricercatore userà un mix di Windows e Linux, poiché non ci sono restrizioni in termini di ottenimento di una shell, dato che i bug di v8 consentono l'esecuzione di codice tramite pagine wasm e non sono legati a una piattaforma specifica.

Purtroppo, anche se un bug sfruttato in v8 comporterebbe l'esecuzione di codice, non saremo in grado di eseguire alcun codice a causa della sandbox, e pertanto otterremmo l'esecuzione di codice nel contesto del renderer, il che non ci permetterebbe di eseguire codice sulla macchina. Per quello avremmo bisogno di un altro exploit per la sandbox, quindi avremmo bisogno di una full chain per compromettere il sistema.

E quindi definiamo i seguenti obiettivi per poter iniziare con il browser hacking

  • Imparare, mappare, padroneggiare le strutture interne usate dal motore V8 e i punti chiave dell'architettura di Chrome
  • Imparare e padroneggiare le procedure di base necessarie per lo sfruttamento dei browser

Imparare, mappare, padroneggiare le strutture interne usate dal motore V8 e i punti chiave dell'architettura di Chrome

Nella prima fase del progetto è necessario raccogliere quante più conoscenze possibili riguardo all'architettura di Chrome e a come ogni componente interagisce con gli altri. Per capire meglio questo, dobbiamo suddividere il Progetto Chromium in più sottocomponenti in modo da poter isolare tutto e analizzarlo correttamente. Più precisamente, in quanti sottocomponenti si suddivide ciascuno dei seguenti componenti

  • Architettura V8
  • Architettura Chromium
  • Architettura Blink

Ora, il passo più logico per un primo passo è capire l'architettura di Chromium. Ok, quindi vogliamo sfruttare il browser, ma cosa succede quando avviamo il browser? Beh, dopo aver fatto clic sull'eseguibile di Chromium, l'eseguibile avvia alcuni processi.

L'ordine e i loro nomi sono i seguenti:

Il primo si chiama content process. Cosa fa questo processo?

  • È conosciuto come il processo di avvio.
  • è anche il processo principale
  • è responsabile dell'avvio del vero processo principale chiamato browser process

Ora che sappiamo brevemente cosa fa, è il momento di approfondire:

  • Quindi, il modo in cui Chromium funziona, almeno su Windows, è che compila i file in una dll e poi la carica in memoria. Quindi la logica principale del browser Chromium è in chromium.dll.
    Questo è confermato anche dal codice
    2.
    Questo è tratto da chrome_exe_main_win.cc e se sei curioso di leggere tutto il codice si trova in chromium/src/chrome/app . Ok, proseguendo con l'esecuzione possiamo vedere che chiama MakeMainDllLoader() per chiamare la classe che carica la dll; dopo di che lancia il "loader", cioè carica la chrome.dll e, se necessario, la riavvia con le necessarie righe di comando. Per analizzare ulteriormente il Loader dobbiamo capire il suo codice, che si trova nella stessa directory, nel file mail_dll_loader_win.cc. Scorrendo fino in fondo al file possiamo vedere la chiamata a MakeMainDllLoader che a sua volta chiama, in base alla versione che hai, ChromeDllLoader o ChromiumDllLoader.
    3
    Possiamo vedere che ChromiumDllLoader è una classe che eredita da . Dalla definizione possiamo vedere che la classe semplicemente carica la dll in base agli argomenti passati alla riga di comando e al tipo di processo . Analizzando il metodo Launch possiamo capire alcune cose che accadono prima che chrome.dll parta: possiamo capire da questo commento che "// Launching is a matter of loading the right dll and calling the entry point. // Derived classes can add custom code in the OnBeforeLaunch callback." lanciare chrome è una questione di caricare un mucchio di dll che fanno effettivamente il lavoro. In secondo luogo, prende gli argomenti passati alla riga di comando e inizializza i servizi sandbox. . Prima controlla se è il browser a chiamare l'inizializzazione della sandbox, poi controlla se il processo che ha chiamato l'inizializzazione della sandbox è stato avviato come servizio di cloud print. Controlla anche se è stato passato al binario, il che dice fondamentalmente al binario di non girare in una sandbox. Controlla se uno qualsiasi di questi era impostato e, se uno dei due è vero, chiama la sandbox con le rispettive opzioni. Poi alla fine arriviamo a che è ciò che ci interessa, questo rappresenta il wrapper per chiamare .

root@kitploit:~
tracciando una fase del ciclo di vita di un processo che è definita come```
// The phases are generic and may have meaning to the tracker.
PROCESS_PHASE_UNKNOWN = 0,
PROCESS_LAUNCHED = 1,
PROCESS_LAUNCH_FAILED = 2,
PROCESS_EXITED_CLEANLY = 10,
PROCESS_EXITED_WITH_CODE = 11,
// Add here whatever is useful for analysis.
PROCESS_SHUTDOWN_STARTED = 100,
PROCESS_MAIN_LOOP_STARTED = 101,

registra appena possibile quando un processo esce, salva le informazioni relative al modulo, cioè quando un modulo (ovvero un componente di Chromium) viene caricato, e fondamentalmente la stessa funzionalità si ripete ma diversa per thread e classi differenti. Nel caso fossi interessato, puoi trovarlo in chromium/src/base/debug/activity_tracker.h
Successivamente controlla se "Main()" è stata chiamata prima. Qui penso intendano se ChromeMain() è stata chiamata prima. Controllano sostanzialmente se al processo content sono stati passati degli argomenti. E nel caso lo sia stato, si assicurano che il processo browser riceva gli stessi argomenti. Poi controllano le specifiche di piattaforma e, nel caso venga rilevato Windows, inizializzano il proprio handler chiamando CreateATLModuleIfNeeded; poi è la stessa storia: controllano le specifiche di piattaforma e passano gli argomenti usando SetupCRT e arriviamo alla parte in cui inizializziamo l'IPC per poter parlare con gli altri processi dopo averli generati. Ecco il codice responsabile di questo. Non entreremo nei dettagli, perché torneremo più avanti a discutere più a fondo del meccanismo IPC di Chrome. Per ora sappi solo che questo è il meccanismo che facilita la comunicazione tra i processi multi-architettura di Chrome. E nel caso non sapessi cosa significa IPC, sta per inter-process communication.
mojo.
Poi quello che fa è "inoltrare" più che impostare gli argomenti per la UI usando ui::RegisterPathProvider, chiama il tracker e ottiene il risultato usando content_main_runner->Initialize(std::move(params)), crea una console padre, che suppongo voglia dire che creano un processo padre, fa qualche altro controllo e poi arriviamo alla parte importante, cioè Capture2 .
Qui vediamo una chiamata a una funzione chiamata IsSubprocess. Capture3 In pratica, per evitare il vecchio codice boilerplate, controlla in un'unica funzione il tipo di processo che riceve dalla riga di comando e, nel caso sia stata passata un'opzione, sceglie tra i seguenti e crea il processo corrispondente.``` return type == switches::kGpuProcess || type == switches::kPpapiPluginProcess || type == switches::kRendererProcess || type == switches::kUtilityProcess || type == switches::kZygoteProcess;

root@kitploit:~
Da lì arriviamo a content_main_runner->Run(); che in sostanza fa tutta la magia. Esaminiamolo sotto il cofano. Quindi content_main_runner è della classe ContentMainRunner, ovviamente.. che si trova in `content\app\content_main_runner_impl.cc`  
Per riuscire davvero a capire il flusso del codice dobbiamo leggerlo dal basso verso l'alto. Detto questo, scorriamo di nuovo verso il basso e scopriamo che in realtà `ContentMainRunner::Create()` chiama `ContentMainRunnerImpl::Create()`; il che ci fa capire che dovremo cercare la definizione di ContentMainRunnerImpl e non quella di ContentMainRunner, che troviamo in `content_main_runner_impl.h` nella stessa cartella già menzionata.  
![Capture 4PNG](https://assets.kitploit.com/production/public/readmes/44338/e9d376e47b9cae2e6795e824b4205c91abf4347bfc1c39f9c4da9b4e282d2a47.png)  
Vediamo che eredita da ContentMainRunner e che possiamo vederne i metodi principali. In realtà non c'è molto qui, dato che il suo comportamento è per lo più sovrascritto in `content_main_runner_impl.cc`
Dentro `content_main_runner_impl.cc`, nel metodo run, prima fa alcuni controlli usando DCHECK (che diavolo è questa funzione? (```The CHECK() macro will cause an immediate crash if its condition is not met. DCHECK() is like CHECK() but is only compiled in when DCHECK_IS_ON is true (debug builds and some bot configurations, but not end-user builds).``` citazioni dai documenti Google :)) per verificare che is_initialized, content_main_params_, is_shutdown_ siano impostati.  
![Capture6](https://assets.kitploit.com/production/public/readmes/44338/97a2fe6cd17558505598c61d0c4e410bab035cd1cb1909328e0128e0dcb38143.png)   
Successivamente ottiene gli argomenti e determina il tipo di cui ho parlato prima![Capture7](https://assets.kitploit.com/production/public/readmes/44338/e99107372da2e525f9097db604ed957d4e4c44d230d92bb3a3a030eb0a7f5bf8.png)  
Poi, nel caso non riusciamo a trovarlo, chiamiamo InitializeFieldTrialAndFeatureList() e delegate_->PostFieldTrialInitialization(); e lo inviamo come messaggio usando mojo.  
![Capture8](https://assets.kitploit.com/production/public/readmes/44338/838d2099d0f3df872fbcf756068da9305bf8ba93025988048a6a15b717169fe4.png) .  
La cosa successiva che fa è impostare alcune cose per la ui![Capturze](https://assets.kitploit.com/production/public/readmes/44338/87c4249f834a3a9e235dbff90fe0810a6d441d074212d3c380f22b05de1a17d3.png)  
di nuovo in base a ciò che è stato passato dalla riga di comando, e chiama RegisterMainThreadFactories, che è un wrapper per RegisterUtilityMainThreadFactory, che imposta solo g_utility_main_thread_factory che, dal nome, penso crei il thread principale, cioè il thread che fa da osservatore per tutti gli altri thread, e infine lancia il processo del browser. ![Captu1re](https://assets.kitploit.com/production/public/readmes/44338/dae032f719f4c78e3d1e0a7564d10bbdb5861410393b5f8a7539ca3383001351.png)

Nel caso non ti fidi di me, ecco chromium disassemblato in binja e vedremo anche un po' di analisi in memoria di questo.
Fortuna nostra, abbiamo chome.exe.pdb che ci permette di avere i simboli di debug e non avremo alcuna difficoltà nel fare reverse engineering del binario.
Dato che lavoriamo con chrome su Windows, il punto di ingresso principale del programma è wWinMain:
Ecco come appare il grafo
![Captur3e](https://assets.kitploit.com/production/public/readmes/44338/eaa592d79ebca8ee99ab66cfcc2dfe0be97670d89f354514dd6d4a08b56b6826.png).  
La funzione in sé è enorme e quindi mostrerò solo le parti necessarie. Dopo una serie di inizializzazioni arriviamo a un punto in cui chiama `MakeMainDllLoader()`  
![Capture4](https://assets.kitploit.com/production/public/readmes/44338/d241275cc35a2beaaf9d3c62d25983471ec9e3027ff14307a9fa2e1605c3d337.png), di cui abbiamo già spiegato cosa fa. Giusto, quindi come facciamo a fare debug dinamico di chrome e dimostrare tutto ciò che ho già menzionato? Prima lo carichiamo in windbg, poi usiamo lm e cerchiamo il nome dell'eseguibile. Dopodiché cerchiamo una funzione chiamata chrome!MakeMainDllLoader, impostiamo un breakpoint e lasciamo proseguire l'esecuzione.![Captu2re](https://assets.kitploit.com/production/public/readmes/44338/a337333caf8ad82226b6db8751ed4354ee04e02c66646fb417d84dbcd385584a.png). Entriamo al suo interno ![Captu11re](https://assets.kitploit.com/production/public/readmes/44338/7204fe3097ce7fead87ec6e763cd58b95577b06d7d4dc437cdd85c8917a5a23f.png), la lasciamo girare finché non raggiunge ret, e usciamo finendo in chrome!wWinMain+0x764 ![Captur33e](https://assets.kitploit.com/production/public/readmes/44338/0dffe422210e01aa2da14a3830c358ac38ddefddc32449d21ccb2ef84b4ed60a.png). Poi la lasciamo girare fino a chrome!MainDllLoader::Launch e ci entriamo dentro. Da lì mettiamo un breakpoint su chrome!MainDllLoader::Load per vedere come chrome.dll viene caricata in memoria. E come possiamo vedere, tra le prime cose caricate c'è chrome.dll ![Captu123re](https://assets.kitploit.com/production/public/readmes/44338/592d31f64ced75f56dfb16ae9fcddf0404ae4e625b7a55ada0422e125de984e3.png). Da qui il flusso dell'analisi è lo stesso e l'analisi completa in memoria sarà lasciata come esercizio al lettore. Per uno scopo speciale farò l'analisi fino al punto in cui il content process è quasi completo e mi fermerò subito prima dell'avvio del browser process. Lo scopo è solo mostrare come l'IPC inizia a comunicare tra i processi. Dopo il caricamento della dll, dobbiamo cercare un'istruzione call rax. Quello che ho fatto è stato elencare 0x40 istruzioni a partire dall'eip corrente dopo il caricamento della dll.![Captur123e](https://assets.kitploit.com/production/public/readmes/44338/899f6fb7532d0914f486c10f15bd10df0538ac530a64cd31bafa8bfc258c6a64.png). A quell'indirizzo c'è in realtà ciò che stiamo cercando, cioè chrome!ChromeMain.![Capture123123](https://assets.kitploit.com/production/public/readmes/44338/0bd3b9459247450b124bc84d82e2fe99784b47ff28de673f64bf8695db945d96.png)
Da lì vogliamo fermarci su ![zCapture](https://assets.kitploit.com/production/public/readmes/44338/54fe080cf64daba53afb58c6ad40057408ebc79120b45adba7691fc534d33578.png) che è fondamentalmente un grosso controllo prima di saltare in content!content::ContentMain. Da lì vogliamo superare qualche istruzione e raggiungere content!content::ContentMain. Vogliamo entrare e fermarci su content!content::RunContentProcess![Captuare](https://assets.kitploit.com/production/public/readmes/44338/bd16901788ef952a6f7165f90082abf6618f392bea6de968d24062590db681d2.png), vogliamo entrare e impostare un breakpoint su content!content::ContentMainRunnerImpl::Run+0x430 e appena superiamo ![Capture442](https://assets.kitploit.com/production/public/readmes/44338/30ac05cc6d66cca61b8d471983093be82e4cd6dd93318ad2696c642bad841933.png) vediamo partire mojo ipc e concludiamo che il processo successivo, cioè il browser process, è responsabile dell'implementazione effettiva del browser e della gestione di tutti gli altri processi.![Captu1243re](https://assets.kitploit.com/production/public/readmes/44338/684e3466f25b57c74e3f1d48013f94157bc7b4058dd31ce5cfc2613966563c9d.png) 

===============================================================================================

2.
La volta scorsa ci eravamo fermati dopo aver capito il content process. oggi andremo sul browser process
è il processo che viene avviato dopo il content process ed è il secondo nei processi avviati da chrome.
Descriviamolo brevemente:
* possiamo considerarlo il processo principale, dato che il content process è più una routine di inizializzazione con qualche controllo delle dipendenze, ed è avviato dal content process
* rimane in vita per l'intera durata del browser.
* È il coordinatore centrale di tutti i processi e opera al più alto livello di privilegio disponibile per il browser.
* poiché gira al più alto livello di privilegio, se altri processi devono eseguire un'operazione di livello superiore, la richiesta viene gestita dal browser process.
* Controlla funzionalità come la barra degli indirizzi, i segnalibri e i pulsanti indietro/avanti/ricarica. Dato che è il processo con più privilegi, non si fida dei dati che riceve dagli altri processi.
* gestisce anche operazioni privilegiate come UI, rete o storage del filesystem per gli altri processi quando necessario.  
Ora che sappiamo brevemente cosa fa, è il momento di approfondire:
Il nostro viaggio inizia in `src\content\app` in un file chiamato content_main_runner_impl.cc, alla funzione int ContentMainRunnerImpl::RunBrowser(MainFunctionParams main_params,bool start_minimal_browser). La prima operazione che esegue è una TRACE_EVENT_INSTANT0![Captureq](https://assets.kitploit.com/production/public/readmes/44338/a00d341147931a7d9de17cec692eeb0b695feca87309a6f0ba3700517e5d13dd.png) .  
Cos'è? Prima di tutto, cos'è una trace function? Beh, se andiamo su https://lwn.net/Articles/379903/ possiamo vedere che la definiscono come ![Captur12348e](https://assets.kitploit.com/production/public/readmes/44338/c9f56f4e9bdcdd919eb5d3962909a3faa878ac5681a9227e92b27eb865bff5d8.png), facendo un po' di astrazione possiamo concludere che una trace function è una funzione che registra dati in un punto specifico di uno stackframe. Non si limita a registrare lo stack di esecuzione della funzione, ma può registrare anche le variabili locali dell'ultima funzione eseguita. Ora che sappiamo cos'è una trace function, vediamo cosa fa la nostra.
Se andiamo su https://chromium.googlesource.com/chromium/src/base/trace_event/common/+/refs/heads/main/trace_event_common.h vediamo che la definiscono come una funzione il cui unico scopo è "tracking application performance and resource usage". Andando un po' più a fondo per capire cosa fa, vediamo che è una macro ed è definita come ![Captureqq](https://assets.kitploit.com/production/public/readmes/44338/21eedc48fe46a60b7d3993678c5cad552353145afbc46c16d3272e92a9046be1.png). Possiamo vedere una breve definizione sopra la macro che dice che registra un singolo evento chiamato "name" immediatamente, con 0, 1 o 2 argomenti. E nel caso la categoria dell'evento non sia abilitata, non fa nulla. Possiamo vedere che come parametri abbiamo "startup" come categoria principale e come sottosistema abbiamo "ContentMainRunnerImpl::RunBrowser(begin)" e il terzo parametro è TRACE_EVENT_SCOPE_THREAD che è "#define TRACE_EVENT_SCOPE_THREAD (static_cast<unsigned char>(2 << 2))" che, penso in base al valore, sia un id per il rispettivo evento istantaneo. Quindi in sostanza ciò che fa è semplicemente tracciare (loggare) il fatto che siamo entrati con la nostra esecuzione nella funzione RunBrowser. Poi abbiamo un controllo per vedere se il main loop del browser è già partito e nel caso sia già partito usciamo dalla funzione ![Capturage](https://assets.kitploit.com/production/public/readmes/44338/7641b12af010d647dbadb291d12ca0c20b3c7a2170cefe05fbff2cfb6f609c88.png) . Poi impostiamo un flag e dopo di che arriviamo a una parte piuttosto interessante del codice. Controlliamo se abbiamo supporto per il meccanismo mojo_ipc e in tal caso usiamo ShouldCreateFeatureList che crea una feature list, prova a inizializzare i vari processi e infine cerca di inizializzare le funzionalità di mojo.![Capture123123123](https://assets.kitploit.com/production/public/readmes/44338/7bc27c995b7db489dee90771343bfea5effc59c3da26c128dd78421d322030c0.png). Poi creiamo un threadpool.![Captur``e](https://assets.kitploit.com/production/public/readmes/44338/f7f16fc6636f9f6340816a2be60cade841ed3524db4936f58347c203b43a2f3c.png) Ma che cavolo è un threadpool??! Citando da wikipedia: "a software design pattern for achieving concurrency of execution in a computer program". Spiegato in modo più corretto "a thread pool maintains multiple threads waiting for tasks to be allocated for concurrent execution by the supervising program" (anche questa è una citazione da wikipedia"). Spiegato ancora meglio, immagina due linee di persone che lavorano in una fabbrica. Chiamiamole linea a e linea b. Sono tutte supervisionate da un capo. Chiamiamolo linea c. La linea b deve aspettare che la linea a finisca il proprio lavoro ed essere avvisata dalla linea c per poter lavorare. E lo stesso vale per la linea a. E questo è un threadpool. Ecco anche un piccolo esempio in c ![Captuqweqre](https://assets.kitploit.com/production/public/readmes/44338/8e536782a06d3d08683f7714499c1c2d51747e7253e3b972e657babe4aeb5413.png). È preso spudoratamente da https://stackoverflow.com/questions/15752659/thread-pooling-in-c11 .Poi abbiamo una chiamata a PreBrowserMain(); che fa alcune inizializzazioni specifiche della piattaforma e dopo di che arriviamo a un punto in cui chiamiamo `BrowserTaskExecutor::Create()`;  
![Capture](https://assets.kitploit.com/production/public/readmes/44338/5f93ce2d99e7357045a446799952dfb74422a1f91293c1fe60ac280784b63a54.png). Facciamo un tuffo profondo in ciò che fa, dato che il nome è piuttosto interessante e basandoci su un'ipotesi ragionevole possiamo renderci conto che potrebbe essere interessante. La nostra deviazione inizia dentro content/browser/scheduler/browser_task_executor.h dove scopriamo che BrowserTaskExecutor è una classe che dovrebbe "to map base::TaskTraits to actual task queues for the browser process". Andando un po' più avanti nel file, prima di tutto  ![Capturea](https://assets.kitploit.com/production/public/readmes/44338/2afcfd256eb9112346bf7d2486b5a006dcd783b43738e3a9db669650c9808768.png) eredita da BaseBrowserTaskExecutor. Quindi ora, per capire cos'è BrowserTaskExecutor, dobbiamo capire BaseBrowserTaskExecutor. Possiamo vedere che eredita da TaskExecutor. Fortunatamente per noi, vediamo che sovrascrive i metodi di TaskExecutor con proprietà sovrascrivibili, il che significa che verranno sovrascritti da altre chiamate a metodi in seguito. Ma solo per i curiosi là fuori, possiamo trovarlo in base/task/task_executor.h e se lo ispezioniamo possiamo scoprire che TaskExecutor è una classe che " can execute Tasks with a specific TaskTraits extension id ![Captureb](https://assets.kitploit.com/production/public/readmes/44338/99ed031aad78ad64ec17e4d109850f4be243342074bd46f9ecd1494be7e7b82f.png)  .  
Cosa sono un task e i tasktraits. Abbiamo già menzionato cos'è un task, ma per rinfrescare: è uno dei processi di chrome, e ora cosa sono i TaskTraits? Si trovano in base/task/task_traits.h e sono definiti come segue "encapsulate information about a task that helps the thread pool make better scheduling decisions." Tornando al nostro BrowserTaskExecutor. Il metodo che chiamiamo è Create() e la sua analisi è la seguente ![browsertask_create](https://assets.kitploit.com/production/public/readmes/44338/c8cf0292e6e94a4681eaa19b9b2376c1a883ccf3ef627b6b7601cda246337c85.png) 
prima controlla se il task corrente deve essere eseguito da un SingleThreadTaskRunner. cioè se dobbiamo eseguire questo task usando un thread indipendente. Lo facciamo ottenendo un puntatore al tls. Poi inizializziamo una ui e uno scheduler di thread. In pratica qui inizializziamo uno scheduler per eventi futuri relativi alla ui.![browser2](https://assets.kitploit.com/production/public/readmes/44338/8c060bc8985259819bb6d06d5f4e3cc9f6934e0e18a6242b86fdc7100975a060.png).  
E questo è tutto per quella funzionalità. Proseguendo con l'analisi di content_main_runner_impl.cc arriviamo qui.![CreateVariationsIdsProvider](https://assets.kitploit.com/production/public/readmes/44338/d74fd0ea150a2217f8add998c72736864714acd35f7d83f0dd9c219f60b46441.png)  
cercando il file della classe variations ids provider lo troviamo in `components/variations/variations_ids_provider.h`, e lì vediamo qualcosa di piuttosto interessante. include un file `.mojom.h`. Possiamo trovare la sua definizione in `Debug/gen/components/variations/` variations.mojom.h , il che significa che ha a che fare con il meccanismo ipc. Ora andando sulla definizione effettiva della classe vediamo un commento che la descrive come "A helper class for maintaining client experiments and metrics state transmitted in custom HTTP request headers." guardando il suo comportamento e la definizione del sorgente concludiamo che è semplicemente usato come marcatore per una funzione, che segnala che "signed-in parameter supplied to GetClientDataHeaders()", il che significa che da qualche parte nello stack di esecuzione c'è una chiamata a GetClientDataHeaders e successivamente verrà chiamata con un parametro. Poi facciamo     delegate_->PostEarlyInitialization(!!main_params.ui_task); che semplicemente invia all'ipc di mojo il fatto che deve avviare i task della ui. facciamo altre inizializzazioni ![b](https://assets.kitploit.com/production/public/readmes/44338/5bbff517ff5783f1c180bb958543735aeca90d562c9bf261bea81a35b2ff713b.png) e poi arriviamo a chiamare RunBrowserProcessMain. ![a](https://assets.kitploit.com/production/public/readmes/44338/03a4459cbeb526e7a5e8d8a89e4829411647b8ca58d1692c116c353499bacaf6.png) . Se speravi come me che fosse qui che vediamo partire la gui, ti sbagli. Una citazione di maestro oogwgay ![8ae6dca28db7d3afa6f483349c879962a437435d3e852e3fea35ef422acb95c1_3](https://assets.kitploit.com/production/public/readmes/44338/9b4c6b1664c8747f4093bc7c739bdd560c234e3f2cb4648ca3314f36eac82708.jpg). Poi andiamo avanti e facciamo altri controlli e arriviamo a BrowserMain![c](https://assets.kitploit.com/production/public/readmes/44338/f5377d34d6990bd090884c7ce476f9f2cda4b67fd4d7c4f035cae5f0ee59fabd.png). esaminandolo vediamo che fa un po' di tracing e poi arriviamo a![init](https://assets.kitploit.com/production/public/readmes/44338/120c08c504cfc2cb6bf6f2d7e4486eb0507e8e86c83d08a1d4adb7491c41e465.png) che è il punto in cui avviamo davvero la gui. Ora, nel caso non ti fidi di me, dovrai avere un po' più di pazienza finché non arriviamo all'analisi dinamica. Poi arriviamo al metodo Run, che è la parte che ci interessa, e successivamente arriveremo al nostro prossimo punto per capire il browser process. Ma per ora facciamo un'altra breve deviazione e indaghiamo su come viene creato il metodo Initialize. Subito vediamo che traccia l'esecuzione del metodo init e prima ancora crea un istogramma![Capturez](https://assets.kitploit.com/production/public/readmes/44338/61086f31ec19789871368cf64034bdad22045c4aac46a8779a707150b4682a9e.png). Poi controlliamo il flag initialization_started_ per vedere se siamo arrivati alla fase di inizializzazione e in caso contrario inizializziamo skia, che è la libreria grafica usata da chrome, avviamo un "timer" per contare i secondi trascorsi per eseguire questo metodo per usarli successivamente in un istogramma, controlliamo se abbiamo passato un parametro al binario per aspettare che il debugger si attacchi al processo e infine avviamo un notification_service_ che, usando un'ipotesi ragionevole, notificherà al watcher principale del threadpool quando avviare un servizio. ![Captureaaa](https://assets.kitploit.com/production/public/readmes/44338/cce1c5850fc1c34bebd75e905ba733d1f46ddaab581bed2b6f2f5016c81bcac0.png). Poi inizializziamo i font necessari per chrome e creiamo il mainbrowserloop, che è il coordinatore di tutti i processi, e saltiamo tre metodi che non presentano alcun interesse per noi   main_loop_->CreateStartupTasks();
  int result_code = main_loop_->GetResultCode(); . Da qui ciò che ci interessa è entrare in CreateStartupTasks. Da lì guardiamo content\browser\browser_main_loop.cc, e siamo interessati a startup_task_runner_->RunAllTasksNow(); che si trova dentro il metodo createstartuptask. starup_task_runner_ è uno StartupTaskRunner che si trova nella stessa directory dentro il file startup_task_runner.cc. Ora se ispezioniamo il metodo RunAllTasksNow vediamo che ciò che fa è semplicemente iterare su tutti i task ed eseguirli![run](https://assets.kitploit.com/production/public/readmes/44338/3a4991537194491011f922d45981a178c4fe40c3e6f19533750bc07490d13370.png)

 ==========================================================================================
         Tempo per un po' di analisi dinamicaOra, per catturare il renderer, dovremo avviare il binario in windbg. Questo è semplicemente ottenibile facendo File->Open Executable e passando --renderer-startup-dialog --no-sandbox --wait-for-debugger-children=renderer --renderer-process-limit=1 come argomenti.![start](https://assets.kitploit.com/production/public/readmes/44338/622dfa07937a4b2f8f347b92110d8f80c93782c8c2419ead5ced38797a52e41b.png). Impostiamo quindi un bp a content!content::StartupTaskRunner::RunAllTasksNow+0x88 così possiamo catturare i messaggi ipc e successivamente il renderer. Solo come riferimento, ecco come dovrebbe apparire il tuo dbg dopo averlo eseguito una volta ![content](https://assets.kitploit.com/production/public/readmes/44338/c675643ca1a6ab2ab4e010b4bc2fc544070a9dea29450c6ce672329c6504474f.png) . Dovresti vedere il messaggio "chrome is running in full browser mode". Da lì conti da uno a cinque, quindi lo esegui altre quattro volte. E poi dovresti vedere qualcosa come ![debuugz](https://assets.kitploit.com/production/public/readmes/44338/dbd42e19a6f1c7c66d9302868af8517395db1203d4201ada448deae6c7d65082.png). Raccomando di usare procmon per monitorare il processo renderer quando si avvia. Dopo di che lo agganci a un altro debugger e, nel caso tu abbia usato gli argomenti precedenti, dovresti vedere un messaggio popup che ti indica il pid del renderer![helk](https://assets.kitploit.com/production/public/readmes/44338/6eceef790edb2a7b4c9f1c1c0a6ddaf8e5943193f6d6c2678b7985a159d88193.png). Da lì vorrai impostare un bp a base!base::RunLoop::Run. Sfortunatamente non puoi fermarti a content!content::RendererMain per qualche motivo. Forse perché agganciamo il processo subito dopo che esce dalla funzione renderemain ed è eseguito da un thread. In ogni caso, ecco come appare l'ipc dopo quattro esecuzioni.![ipc1](https://assets.kitploit.com/production/public/readmes/44338/f3ecb9c43685a150e1b030e45b3409fde22f73caf8cb3e65ad3749283fe5190e.png). Questo indica che la gui è stata avviata. Ed ecco come appare l'ipc dopo l'avvio del processo renderer.![renderer4](https://assets.kitploit.com/production/public/readmes/44338/88cba847d07fdf5fff64022151e616c38b40b6869669b57b697c4e4704a55e21.png). Impostiamo quindi un bp a 
content!content::StartupTaskRunner::RunAllTasksNow+0x88 e content!content::RunOtherNamedProcessTypeMain. Lascialo eseguire 

 
 ============================================================================================================
 
 3.Ora, per la seconda parte dell'analisi del processo browser, siamo arrivati al punto in cui saremo in grado di comprendere e fare debug del renderer, ma non ci arriviamo ancora. Ho lasciato esplicitamente un'altra funzione da analizzare dopo RunBrowserProcessMain; beh, teoricamente è dopo RunBrowser, ma come forse ricorderai, RunBrowser è un wrapper per RunBrowserProcessMain. Ora, ciò che ho lasciato fuori è che nel file chiamato content_main_runner_impl.cc nella cartella src/content/app c'è un'altra funzione che viene chiamata dopo che generiamo il renderer e si chiama RunOtherNamedProcessTypeMain. Questo processo è responsabile dell'esecuzione di tutti gli altri processi.![Captureother](https://assets.kitploit.com/production/public/readmes/44338/ff1888433235c48d23fff69a795e2c82dec9ddb5c1e82cd87faabe75264c0aa8.png). Ora capiamo cosa succede nel codice. Vediamo che il suo prototipo è ![Capturzaqe](https://assets.kitploit.com/production/public/readmes/44338/11ccd1d1fb5002f660d12b22b2f07c818fe33bcd8547fcd3433b998c88aaec80.png), il che indica che prenderà gli argomenti passati alla cmdline, quale tipo di processo aspettarsi e un chrome delegate. Arriviamo quindi all'inizio della funzione dove c'è una definizione di macro per verificare le specificità della piattaforma e controllare per quale processo istanziare un event handler. Cioè per verificare se esegue alcune funzioni per il processo console o per il processo browser. ![Capturqqqqqqqqe](https://assets.kitploit.com/production/public/readmes/44338/2d3a600011753b06d460126b40b0efc7d9d037665d1cecaf6157a56828644faa.png). Iteriamo quindi sui processi passati e li confrontiamo con un elenco di processi noti ed eseguiamo il processo corrispondente. ![Captuqaxzcre](https://assets.kitploit.com/production/public/readmes/44338/8806bd2644c3f2403b720e3ab145c05228d2f876549c3220e8e30cc3fbde7e92.png) Nel caso in cui non otteniamo il processo corrispondente, allora è un processo personalizzato implementato da qualcuno![Captureshaveica](https://assets.kitploit.com/production/public/readmes/44338/8e6f6ac907e65b05431214e4a65eb4284683b9b5a6c747dedfcbc64f978daaf0.png)
Ecco un link per implementare un processo personalizzato e useremo questo esempio per la seconda parte dell'analisi dinamica . https://bitbucket.org/chromiumembedded/cef/wiki/Tutorial . 

=====================================================================

Parte di analisi dinamica 
 
 La prima parte dell'analisi dinamica inizia come segue: prima esegui da un cmd.exe con diritti di amministratore il seguente comando: windbg.exe chrome.exe -G -o --renderer-startup-dialog --no-sandbox --wait-for-debugger-children=renderer --renderer-process-limit=1 --allow-pre-commit-input --allow-sandbox-debugging . Dopo di che imposta .childdbg 1 così possiamo fare debug dei nuovi processi figli generati. In sostanza, ciò che fa il comando precedente è "assicurati di essere agganciato a tutti i processi figli". Un ringraziamento va a @spoofyroot e @_coreDump per avermi indirizzato nella giusta direzione con il debug multiprocesso. Ecco come dovrebbe apparire dopo aver impostato .childdbg 1 ![debugzzzzzz](https://assets.kitploit.com/production/public/readmes/44338/768870a772194a3f32a00be9ed2b7b2e17f5d7253da51975309a1125680ce119.png) Dato che non sono riuscito a catturare in nessun altro modo cosa succede dopo, ho fatto un video in cui spiego cosa succede. https://streamable.com/9t4iof . Fondamentalmente, dopo l'ultima esecuzione di content!content::StartupTaskRunner::RunAllTasksNow+0x88 generiamo nuovi processi che gestiscono roba ipc e dovremo continuare a impostare un bp a content!content::RunContentProcess finché non lo colpisce. Questo è ciò che chiamo tentativi ed errori ragionati :)) . 

 
=====================================================================

4.Analisi del Renderer 
 
 !Avvertenza
    Mentre eseguiremo l'analisi del codice del Renderer, ci addentreremo un po' anche nel codice di blink per capire cosa succede esattamente nel renderer

 Mentre scrivevo questa parte del corso, mi sono reso conto di aver dimenticato di descrivere brevemente cosa fa questo processo e perché mai dovremmo guardarlo. Come sappiamo, questo è il terzo processo avviato da chromium e si chiama renderer. Ma perché si chiama "renderer"? Si chiama così perché il suo compito è rendere (disegnare) tutto ciò che vediamo su un sito web. Fondamentalmente è il motivo per cui la tua tabella sembra una tabella quando visiti un sito web, o il tuo css permette di personalizzare un pezzo di testo, o perché il tuo js è in grado di fare magie nere*. Un altro importante motivo per cui lo analizziamo è che è da qui che provengono la maggior parte dei bug. Che parliamo di html, css, js o qualsiasi altro componente, li vedrai tutti sotto blink su chrome bugs.chromium.org

   
* Ci sono più processi renderer. Un processo completamente separato per ogni scheda che il browser ha attualmente aperto.
 
* Questo processo controlla qualsiasi cosa all'interno della scheda del sito web effettivo
 
* a partire dal 2018, gli iframe hanno ricevuto un aggiornamento in cui tutti possono avere schede. e così ogni scheda di un iframe ha un processo renderer individuale. Questa cosa si chiama Site-Isolation
* La sua responsabilità è analizzare un sito web, disegnare sullo schermo ciò che il sito web contiene al suo interno, es. tabelle, immagini, eseguire javascript
* è in sandbox
* al suo interno usa un motore di rendering chiamato Blink.
* crea e gestisce url-schemes come: chrome://,  devtools://,  chrome-error://
* Inizializza il motore Blink che farà effettivamente tutto il parsing e il lavoro pesante per il processo renderer.
 
 
L'ultima volta ci eravamo lasciati dopo aver finito l'analisi del processo browser e ora è arrivato il momento che tutti aspettavamo di passare alla parte di analisi del renderer. Già, mentre giocavo con chromium sono riuscito a farlo crashare e ho ottenuto il seguente stack trace. ![numberunu](https://assets.kitploit.com/production/public/readmes/44338/f2630f0d90cc14b1cd00e65da78a62e6879789c2bbd76914cf96a60e7598ce7d.png) Sulla base di questo sappiamo che il nostro viaggio inizia a content::RendererMain che si trova in `\content\renderer\renderer_main.cc` . Hai indovinato, il punto di partenza è RendererMain. Iniziamo analizzando come è definita e un po' del suo interno ![rendereranalysis](https://assets.kitploit.com/production/public/readmes/44338/2a5dd98c5dee7df60650563bf0c07d9fc7fcba9322a81ef46f1a4b57a7dfe5be.png) . Possiamo vedere che accetta un parametro di tipo MainFunctionParams, il che significa che questa funzione accetterà gli argomenti passati al binario. Poi aggiungiamo un trace point così possiamo sapere che siamo arrivati a chiamare RendererMain, e quindi dereferenziamo il valore di parameters e lo salviamo in command_line. Poi abbiamo alcune macro che controllano l'architettura specifica della piattaforma, che possiamo ignorare  ![macro](https://assets.kitploit.com/production/public/readmes/44338/bc66a44c8a54f70658fcddae67df178adb913d01feec405cedbe4ddb5d16eac6.png), controlliamo il valore passato a kTimeZoneForTesting che è un fuso orario da usare per i test, poi incontriamo una nuova classe e un nuovo tipo di dato chiamato icu. 
 ![habarnam](https://assets.kitploit.com/production/public/readmes/44338/d289a7befe64a2b1114f8e06266ba6475f7db0ef4ac356a522911e861fa75c08.png)
Ora, cercando una qualsiasi fonte di definizione per questo, arriviamo a https://unicode-org.github.io/icu-docs . Se guardiamo l'inizio del file dove si trova la direttiva include, possiamo vedere che è una libreria di terze parti. Quindi fino ad ora sappiamo che è una libreria di terze parti che gestisce componenti internazionali per unicode, cioè la usiamo per il supporto unicode. Ok, ma cosa fa quella funzione? Andando su https://unicode-org.github.io/icu-docs vediamo ![icu](https://assets.kitploit.com/production/public/readmes/44338/ad73d2a9b1d8656816f2982cc6587a14bce9766251fc64430cb313789b46f4ee.png), cioè imposta il fuso orario predefinito in base a ciò che impostiamo come parametri. Poi inizializziamo la libreria skia e gestiamo --renderer-startup-dialog 
![curumare](https://assets.kitploit.com/production/public/readmes/44338/702d8f539ca85edb1ae59697341a01f04389e06e6e498e7a1334cfad02e252e2.png). Poi incontriamo una nuova classe, RendererMainPlatformDelegate.![delegaterenderer](https://assets.kitploit.com/production/public/readmes/44338/d731ed1f19a1fafea38b72fa2e1497290d67e08401df5edfc28399ff6ea5a740.png)

Cosa fa? Beh, prima di tutto dobbiamo specificare che è una classe astratta specifica per piattaforma. Nel nostro caso si troverà in /content/renderer dentro il file chiamato renderer_main_platform_delegate_win.cc . Si presenta così 
 ![rendererhelper](https://assets.kitploit.com/production/public/readmes/44338/0485301ff6d305f624279d1a525f1c825089f0e3ff3a7f0085eb5ad7392fbd24.png). Quindi possiamo concludere che è solo una funzione helper che abilita la sandbox, e nel caso passiamo --no-sandbox esegue le azioni necessarie e basta. Poi impostiamo il nome del nostro thread a CrRendererMain![name](https://assets.kitploit.com/production/public/readmes/44338/742fe969e84708598663853d3c02f4cc59018df41e333cc9ec91dd17e49a2ad5.png). Poi incontriamo un'altra nuova classe chiamata RenderThread. ![renderthread](https://assets.kitploit.com/production/public/readmes/44338/6e55410f6d599d6d150e2919462909dbe2420662a068fac9f2699c0d8878f4d4.png)
Di nuovo, dato che fondamentalmente non sappiamo cosa fa, esploriamola un po'. La nostra ricerca per capire come è fatto RendererThread inizia da content/public/renderer/render_thread.h. Guardando dentro il file render_thread.h vediamo che è definita come ![fain_de_an](https://assets.kitploit.com/production/public/readmes/44338/e7d383ccbcabd6ae781af9e4d17a8ab917e98907506b371bc93f45e78e630c73.png). Di tutto quel file siamo interessati a IsMainThread, che è definita nel file rendere_thread.cc e appare così ![rendererrrrr](https://assets.kitploit.com/production/public/readmes/44338/63f12c226fa518ad874a559c04f45a8c786aeec8a8fd718eccd559e680b15aee.png) (aggiungi una lunga descrizione su questo meccanismo). Ora, proseguendo con l'analisi del codice del renderer, possiamo vedere il momento più atteso: finalmente vediamo un po' di codice di blink. Il primo del suo genere, e quello che fa è inizializzare la libreria.![blink](https://assets.kitploit.com/production/public/readmes/44338/fb534f9bde56b9c68d0c05f815ef94e4c7bbf5cddcb16bbfaaff56a75156f21c.png). Dietro le quinte la funzione si presenta così ![blink2](https://assets.kitploit.com/production/public/readmes/44338/f53753b2451d0f753ed3923a05c359a28735348873cd4671da761778502d6672.png). Ora la domanda naturale che sorge è: che diavolo sono queste classi? Cosa sono WTF e Platform. Fortunatamente, i documenti di blink ci dicono effettivamente cosa sono.
 https://docs.google.com/document/d/1aitSOucL0VHZa9Z2vbRJSyAIsAz24kX8LFByQ5xQnUg/edit . Guardando "Directory structure and dependencies" possiamo dedurre che platform è una classe che aiuta con geometria e grafica. Passiamo ora alle classi WTF e Partitions. I documenti di Blink dicono anche di WTF: deriva da Web Template Framework ed è in pratica un "wrapper" della libreria stl, nel senso che "è una libreria di base per Blink che fornisce una varietà di funzionalità di base, come contenitori, librerie di stringhe, meccanismi di conteggio dei riferimenti, funtori, primitive di threading ecc." (citazioni dai documenti di blink (https://chromium.googlesource.com/chromium/src/+/refs/heads/main/third_party/blink/renderer/platform/wtf/README.md)). Aggiungi altri dettagli su blink 
 Ok, ora proseguendo con l'analisi di renderer_main.cc vediamo di nuovo qualcosa di cui non sappiamo cosa faccia, ed è ![schedulerchrome](https://assets.kitploit.com/production/public/readmes/44338/55024776fdbf2c9495b0266d28ae8433538497624724504a4903601b792fb983.png) Aggiungi dettagli domani. Poi chiamiamo ![a;a](https://assets.kitploit.com/production/public/readmes/44338/f2a61eaa5512e8ac3badfbc780f86c342cafda8372af2f6c008cb80507fa4e9c.png). Poi controlliamo se abbiamo abilitato i plugin durante la compilazione e, in caso affermativo, li carichiamo.
![huila](https://assets.kitploit.com/production/public/readmes/44338/7b51d932acce11c8d367808a938f5c8af4a9f8e9720dd9321bdc05237485d2aa.png) Poi facciamo altri controlli che ho deciso di saltare perché la spiegazione si sta facendo piuttosto lunga e non sono necessari in questa fase. Ma in versione TL;DR servono a capire se abilitare o meno la sandbox prima dell'inizializzazione di RenderProcess. E infine arriviamo a  ![final](https://assets.kitploit.com/production/public/readmes/44338/1e4ea62032e862e25736f59014bfc8e8903a2007a75b6b77d27878e33ecd48b6.png). (aggiungi il resto dei dettagli sul resto delle funzioni). Anche se questa non è la fine dell'analisi del renderer, possiamo considerarla il punto di partenza dell'analisi vera e propria del renderer, perché come vedremo più avanti è qui che succede la maggior parte delle cose interessanti, quindi possiamo considerarla come il codice del renderer. Siamo interessati a RenderThreadImpl, che appare così ![bitch_please](https://assets.kitploit.com/production/public/readmes/44338/d58479f510698f2a27ebb3cf15387fb4f5a8970a165d4c451e01fb2d83b536ef.png). Di tutto quel codice siamo interessati alla funzione Init(), che appare così:
 ![yeee](https://assets.kitploit.com/production/public/readmes/44338/5f7e2779325766d3a7a367a6fe7b4388014cc921b27d0645a762d558ba790238.png), ma è molto più lunga. :) sfortunatamente non possiamo catturarla in una singola immagine, e quindi ne abbiamo catturato l'inizio. A parte questo, tutto il resto che succede dopo InitializeWebKit() non è realmente di nostro interesse, dato che per la maggior parte è solo comunicazione ipc con il processo gpu, che al momento non è nel nostro radar. La fortuna ci sorride perché in quella funzione abbiamo catturato anche una delle funzioni a cui siamo interessati, precisamente InitializeWebKit(), che ancora una volta appare così ![blink3](https://assets.kitploit.com/production/public/readmes/44338/db3ea73c39662df6c46b3ca99039a029da60ced698b23a3d4870cd19aa56cfd0.png). Ci allontaniamo un po' dalla nostra missione di spiegare renderer_main.cc per capire meglio cosa succede dentro InitializeWebKit. Ora, so che è tanto da capire, ma abbi pazienza mentre cerchiamo di dare un senso a questo pasticcio. Quindi vediamo che InitializeWebKit() inizia prendendo qualunque argomento sia stato passato a questo processo; poi controlliamo se abbiamo abilitato durante la compilazione -dENABLE_VTUNE_JIT_INTERFACE, e in caso affermativo controlliamo l'opzione passata alla cmdline, cioè enable-vtune-support. Che diavolo è? Abbiamo cercato su google e abbiamo trovato un link a https://www.intel.com/content/www/us/en/develop/documentation/vtune-help/top.html e in quella pagina dice che è: "uno strumento di analisi delle prestazioni per applicazioni seriali e multithread". Quindi in breve, qualcosa che migliora le prestazioni del tuo chrome. Poi inizializziamo blink ![blininit](https://assets.kitploit.com/production/public/readmes/44338/adf0c7b62a95e9fb9b9ab173000234c79d6371c53585555597069d7ee8059b9b.png). Ora, per capire il processo di inizializzazione di blink, spieghiamo brevemente dato che entreremo nei dettagli nel prossimo capitolo, che esaminerà blink in profondità. Incontriamo un'altra classe che ci è estranea, cioè RendererBlinkPlatformImpl, che appare così 
![RENDERETHREADINML](https://assets.kitploit.com/production/public/readmes/44338/f274dbb509aee456eda88dd3734c7967183e0a79b4fd15f5390648a176bcf3cd.png) e si trova in 
 content/renderer/renderer_blink_platform_impl.cc . In base al nome possiamo concludere che è una classe astratta implementata in base alla piattaforma e possiamo anche vedere che eredita da ![muielumii](https://assets.kitploit.com/production/public/readmes/44338/e99ee9bc21c9dfdec8da178d025c9e2661a92d192625cfc86ce1073bf62cacd4.png) Esaminando cosa fa effettivamente RendererBlinkPlatformImpl, vediamo che controlla la piattaforma e in base ai risultati del controllo imposta un flag,![kacl](https://assets.kitploit.com/production/public/readmes/44338/9d27c89e80d496dd6e1f48eac0dc89fc9f86c3d2203af5a4e66967cf42000521.png) poi controlla se il thread corrente è un RendererThread ottenendo un puntatore al tls


 blah blah blah, vedi se aggiungi altro contenuto sulle classi. Poi arriviamo a qualcosa che forse tutti aspettavamo: il primo pezzo di codice v8. Che è ![v8](https://assets.kitploit.com/production/public/readmes/44338/9a7cad1284388b39bdc4a690d51e1bc110edae1d2f3f94513615a333276ca800.png). Cosa fa? Prima di tutto sappiamo dai documenti che un v8::isolate è un'istanza del motore V8. Cioè (una copia indipendente del runtime V8, che include un heap manager, un garbage collector, ecc.) non sufficiente per eseguire script. vediamo blink::MainThreadIsolate() definita come 
 ![diablo](https://assets.kitploit.com/production/public/readmes/44338/a906a0b07c5591d66c677458b6bbc0b0593e2ea45501fc027a5bdd52a42e715a.png) che si trova nel file blink/renderer/platform/bindings/v8_per_isolate_data.cc , che a sua volta V8PerIsolateData::MainThreadIsolate() appare così 
 ![v8x](https://assets.kitploit.com/production/public/readmes/44338/2a7c9d9cf93bbd7fe5f5f40450d8c8ec62f236ca2e210404d895ae7ad26000ca.png) , V8PerIsolateData che, come avrai intuito, è anche essa una 
classe che si trova in bindings/core/v8/V8PerIsolateData.h appare più o meno come ![ahahah](https://assets.kitploit.com/production/public/readmes/44338/14149464fb2f7ccc2775f46a5bb8ad52cacfa21d764084b814cf894e1bccb67e.png)blah blah blah, aggiungi dettagli. Poi controlliamo se abbiamo passato kDisableThreadedCompositing (aggiungi domani come è fatto realmente il flag) alla command line![compositor](https://assets.kitploit.com/production/public/readmes/44338/a075f0ab5e33b80fc423277d5480fd0819a2bad2e8ea383e7d7a8982b66a6096.png). nel caso in cui non l'abbiamo passato, avviamo un thread compositor. Che diavolo è? Citando da https://frontendmasters.com/courses/web-performance/the-compositor-thread/ , è un thread il cui "unico compito è disegnare bitmap, prenderle, inviarle alla GPU e metterle sullo schermo". Poi registriamo quello che viene chiamato scheme.![scheme](https://assets.kitploit.com/production/public/readmes/44338/255b57a5b7b3859d64dbfa1e19c469a3b06ad3b731788d137598d2d623ad2b33.png) In pratica ti ricordi quando guardi il codice sorgente e hai qualcosa davanti all'url, tipo: "view-source:website" . Sì, in realtà è gestito dal renderer. E ci sono molti altri di questi scheme. Cosa intendono con registrare? Non ne sono ancora sicuro, ma penso intendano qualcosa come: ehi, questa è una cosa che voglio che tu gestisca quando l'utente arriva e fa questa cosa. Comunque, ecco come appare.![register_real](https://assets.kitploit.com/production/public/readmes/44338/db57b85fe3e1f2e9a073270a3a01dd54b60d429e5551acb7691204c2b34b5da1.png) aggiungi più dettagli. bene, ora quando aggiungo, dettaglia anche l'ultimo pezzo di codice ![doxxx](https://assets.kitploit.com/production/public/readmes/44338/d944ca271bfe728007601039f78f9e1d1009133df79d7b9573590c94ab03901d.png)
. blah blah blah e finalmente siamo arrivati alla parte finale di renderer_main, aggiorna con i dettagli

![finalz](https://assets.kitploit.com/production/public/readmes/44338/cbf43950855fbf0d9d57956eb53f79efd87e660896a810bebbcce366d19aa280.png)

 



 


 
=====================================================================

Parte di analisi dinamicaOra, per poterlo debuggare dinamicamente, nel caso tu sia un novellino come me, vorrai eseguire windbg da cmd.exe come segue: windbg.exe chrome.exe -G -o --renderer-startup-dialog --no-sandbox --wait-for-debugger-children=renderer --renderer-process-limit=1 --allow-pre-commit-input --allow-sandbox-debugging --time-zone-for-testing="US/Pacific", e impostare .childdbg 1 per poter debuggare il processo figlio generato. Da lì vorrai eseguire bp content!content::RendererMain e lasciarlo eseguire per circa 5 o 6 volte. (modifica per fare riferimento al 4 nel video, è più chiaro così) dopo di che arriviamo a ![reaaa](https://assets.kitploit.com/production/public/readmes/44338/a1dc34419754290a575622235cf0bd1c386456707618dbe133f18f09884cb9f9.png). 




![zanbakto3](https://assets.kitploit.com/production/public/readmes/44338/0dd1ef026636b93acad429402213ae8151260b28c9e12de587504d3b1a58e338.png)
![zanbakto](https://assets.kitploit.com/production/public/readmes/44338/d9386c0d504742ad876bb654da6d8116105243108177039f6a64da9ab42782cd.png)
![zanbakto2](https://assets.kitploit.com/production/public/readmes/44338/b659418beff6582fbf15e15e5b63aa2d97519a0eb439268c732593a4b7470ec4.png)


 
 
              
              
![soulk2](https://assets.kitploit.com/production/public/readmes/44338/5d7fd64ab712e9cb34a98045c8d1334738099065158b9d536ead9c640d2ce573.png)
![soukl](https://assets.kitploit.com/production/public/readmes/44338/3a0f297f8e88fbbdc0d8bed8ef77ad51a1260e3839f1e87cba9799b52a1a9473.png)
Scarica lo strumento
MainDllLoader

6


q

--no-sandbox

8

chrome_main
  • Ora vediamo cosa fa. apriamo chromium.dll in binja. Basandoci su questa immagine da https://blogs.igalia.com/jaragunde/files/2019/03/chrome-init-sequence.png abbiamo un'idea approssimativa di cosa dovremmo cercare in binja.
    Ecco come appare il grafico in binja
    research.
    Per riuscire a rintracciarlo meglio, cerca una funzione chiamata ChromeMain. Questa è la logica principale (aka core) di Chrome. Al suo interno possiamo vedere le fasi già menzionate di come chrome.dll viene eseguita all'avvio:
    Qui possiamo vedere che prima chiama alcune funzioni come sub_180001420,sub_180017020,sub_180017020, che fanno alcuni controlli per vedere alcuni dettagli su come chrome è stato installato/compilato. Usando il codice sorgente possiamo tracciare i loro attributi. La prima funzione, sub_180001420, corrisponde a UmaHistogramEnumeration, poi abbiamo sub_180017020 che è InitializeFromPrimaryModule e la terza e ultima sub_180017020 è chrome_main_delegate.
    Continuiamo a ripetere chrome_main_delegate ma non abbiamo mai definito quale sia il suo scopo. ChromeMainDelegate è una classe che eredita da ContentMainDelegate e fornisce principalmente funzioni relative all'avvio e l'elaborazione delle chiamate di processo. Se vuoi, puoi implementare un'interfaccia ContentMainDelegate personalizzata per cambiare il comportamento predefinito del modulo Content e usare una classe ChromeMainDelegate personalizzata in Chromium per personalizzare il comportamento del processo di avvio.
    Capture
    Al suo interno ci sono alcune chiamate a funzioni che fanno uno xor su alcune regioni di dati e le concatenano con alcuni registry per ottenere alcune opzioni riguardanti l'avvio di chrome
    Capture.
    Nota anche che la funzione sub_180001510 crea un riferimento a puntatore scoped con due callback. Non è una cosa davvero importante, ma è interessante imparare cos'è un BindStateBase. Lo incontreremo spesso nel basecode di chrome. Ora ti starai chiedendo cosa fanno le ultime tre righe, precisamente
    Capture9 do. Quindi la prima riga crea fondamentalmente un std::unique_ptr<> per le closure. WTF è una closure!? Beh, se dovessimo citare da Mozilla Dev: "una closure è la combinazione di una funzione insieme (racchiusa) con riferimenti al suo stato circostante (l'ambiente lessicale). In altre parole, una closure ti dà accesso allo scope di una funzione esterna da una funzione interna. In JavaScript, le closure vengono create ogni volta che viene creata una funzione, al momento della creazione della funzione." Se dovessimo usare un linguaggio umano, è una funzione dentro una funzione che accede a una variabile all'interno della funzione esterna. Es.1 .
    Quindi in sostanza fa sì che la closure venga eseguita. e le altre due righe impostano solo un comportamento specifico per i dump quando chrome crashes.InstallDetails::Get().VersionMismatch() patch qui Andando avanti, controlla la propria versione in esecuzione e, nel caso non corrisponda, va in crash e arriviamo al parsing della riga di comando commandline
    Entrando in sub_184171800 possiamo vedere che non è così grande commandline2 Prima prende gli argomenti passati al processo corrente, poi chiama una funzione che prende una StringPiece, fondamentalmente un wrapper di classe per std::string ma un po' più figo, e quella funzione controlla fondamentalmente se il binario è stato chiamato headless, confronta se il nome del binario che è stato eseguito è chrome, controlla se USE_HEADLESS_CHROME è impostato e poi va avanti al passo successivo che è content main.
    In base agli argomenti forniti, il compito di content main è avviare la rispettiva shell.
    Ora, nel caso in cui non forniamo alcun argomento alla shell, il flusso di esecuzione va a 10.
    Per capire cosa fa, dobbiamo verificarne il codice sorgente. Possiamo trovarlo in /src/content/app/content_main.cc
    Dovremo scorrere fino in fondo e lì troveremo la definizione della funzione ContentMain. Lì vediamo che chiama due funzioni. Una che inizializza un ContentMainRunner, che è la classe che gestisce tutta la "creazione di processi" nel contesto della creazione del browser, di ipc sqli net e del resto. E l'altra che fondamentalmente controlla il tipo di sottoprocessi e lo passa alla classe ContentMainRunner.
    Ora facciamo un passo indietro per capire il flusso di codice. Prima esaminiamo RunContentProcess perché ContentMainRunner è piuttosto complesso. La prima cosa che fa è creare un GlobalActivityTracker. Omg !!! avete indovinato, Google ti traccia :))) Nah, sto scherzando, per favore non citatemi in giudizio, Google. Ma parlando sul serio, questo tiene traccia di ogni thread, cioè è un thread tracker, e fa un paio di cose carine per un debugging migliore, come:Capture che in sostanza significa che ci sarà un intero univoco usato come identificatore per ogni thread per capire meglio cosa causa l'interruzione del processo.
    ad es:``` kTypeIdActivityTracker = 0x5D7381AF + 4, // SHA1(ActivityTracker) v4 kTypeIdUserDataRecord = 0x615EDDD7 + 3, // SHA1(UserDataRecord) v3 kTypeIdGlobalLogMessage = 0x4CF434F9 + 1, // SHA1(GlobalLogMessage) v1 kTypeIdProcessDataRecord = kTypeIdUserDataRecord + 0x100,