<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
A ferramenta pode ser usada como uma **substituição** para **codesign**, **otool** e **objdump**, e oferece algumas funcionalidades adicionais. [**Baixe-a aqui**](http://www.newosxbook.com/tools/jtool.html) ou instale-a com `brew`.
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) é uma ferramenta útil para inspecionar arquivos **.pkg** (instaladores) e ver o que há dentro antes de instalá-los.\
Esses instaladores possuem scripts bash `preinstall` e `postinstall` que autores de malware geralmente abusam para **persistir****o****malware**.
Observe que programas escritos em Objective-C **mantêm** suas declarações de classe **quando****compilados** em [binários Mach-O](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Tais declarações de classe **incluem** o nome e tipo de:
Quando uma função é chamada em um binário que usa Objective-C, o código compilado, em vez de chamar essa função, chamará **`objc_msgSend`**. Que estará chamando a função final:
* O primeiro parâmetro (**self**) é "um ponteiro que aponta para a **instância da classe que vai receber a mensagem**". Ou, de forma mais simples, é o objeto sobre o qual o método está sendo invocado. Se o método for um método de classe, isso será uma instância do objeto da classe (como um todo), enquanto que para um método de instância, self apontará para uma instância instanciada da classe como um objeto.
* O segundo parâmetro, (**op**), é "o seletor do método que lida com a mensagem". Novamente, de forma mais simples, isso é apenas o **nome do método.**
* Os parâmetros restantes são quaisquer **valores que são necessários pelo método** (op).
Com binários Swift, já que há compatibilidade com Objective-C, às vezes é possível extrair declarações usando [class-dump](https://github.com/nygard/class-dump/), mas nem sempre.
Você pode encontrar mais informações sobre a [**informação armazenada nestas seções neste post do blog**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html).
Além disso, **binários Swift podem ter símbolos** (por exemplo, bibliotecas precisam armazenar símbolos para que suas funções possam ser chamadas). Os **símbolos geralmente têm informações sobre o nome da função** e atributos de uma forma não atraente, então eles são muito úteis e existem "**demanglers**" que podem recuperar o nome original:
Observe que, para depurar binários, **SIP precisa ser desativado** (`csrutil disable` ou `csrutil enable --without debug`) ou copiar os binários para uma pasta temporária e **remover a assinatura** com `codesign --remove-signature <caminho-do-binário>` ou permitir a depuração do binário (você pode usar [este script](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b))
Observe que, para **instrumentar binários do sistema**, (como `cloudconfigurationd`) no macOS, **SIP deve ser desativado** (apenas remover a assinatura não funcionará).
Além disso, existem alguns logs que conterão a tag `<private>` para **ocultar** algumas informações **identificáveis** do **usuário** ou do **computador**. No entanto, é possível **instalar um certificado para divulgar essas informações**. Siga as explicações de [**aqui**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log).
No painel esquerdo do Hopper é possível ver os símbolos (**Labels**) do binário, a lista de procedimentos e funções (**Proc**) e as strings (**Str**). Essas não são todas as strings, mas as definidas em várias partes do arquivo Mac-O (como _cstring ou_`objc_methname`).
No painel do meio, você pode ver o **código desmontado**. E você pode vê-lo como desmontagem **bruta**, como **gráfico**, como **decompilado** e como **binário** clicando no ícone respectivo:
Clicando com o botão direito em um objeto de código, você pode ver **referências para/de esse objeto** ou até mudar seu nome (isso não funciona no pseudocódigo descompilado):
No painel direito, você pode ver informações interessantes, como o **histórico de navegação** (para saber como chegou à situação atual), o **gráfico de chamadas** onde você pode ver todas as **funções que chamam esta função** e todas as funções que **esta função chama**, e informações sobre **variáveis locais**.
Permite aos usuários acesso a aplicativos em um nível **extremamente baixo** e fornece uma maneira de **rastrear****programas** e até alterar seu fluxo de execução. O dtrace usa **probes** que são **colocados em todo o kernel** e estão em locais como o início e o fim de chamadas de sistema.
O DTrace usa a função **`dtrace_probe_create`** para criar um probe para cada chamada de sistema. Esses probes podem ser ativados no **ponto de entrada e saída de cada chamada de sistema**. A interação com o DTrace ocorre através de /dev/dtrace, que está disponível apenas para o usuário root.
O nome da sonda consiste em quatro partes: o provedor, o módulo, a função e o nome (`fbt:mach_kernel:ptrace:entry`). Se você não especificar alguma parte do nome, o Dtrace aplicará essa parte como um curinga.
Uma explicação mais detalhada e mais exemplos podem ser encontrados em [https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html)
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor) é uma ferramenta muito útil para verificar as ações relacionadas a processos que um processo está executando (por exemplo, monitorar quais novos processos um processo está criando).
Você precisa monitorar seu mac com um comando como **`sudo eslogger fork exec rename create > cap.json`** (o terminal que lança isso requer FDA). E então você pode carregar o json nesta ferramenta para visualizar todas as relações:
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor) permite monitorar eventos de arquivos (como criação, modificações e exclusões), fornecendo informações detalhadas sobre tais eventos.
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) é uma ferramenta GUI com uma aparência que usuários do Windows podem reconhecer do _Procmon_ da Microsoft Sysinternal. Ela permite iniciar e parar a gravação de eventos de todos os tipos, filtrá-los por categorias (arquivo, processo, rede, etc) e salvar os eventos gravados como arquivo json.
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html) fazem parte das ferramentas de desenvolvedor do Xcode – usadas para monitorar o desempenho de aplicativos, identificar vazamentos de memória e rastrear atividade do sistema de arquivos.
[**TaskExplorer**](https://objective-see.com/products/taskexplorer.html) é útil para ver as **bibliotecas** usadas por um binário, os **arquivos** que está utilizando e as conexões de **rede**.\
Também verifica os processos binários contra o **virustotal** e mostra informações sobre o binário.
Neste [**post do blog**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html), você pode encontrar um exemplo de como **depurar um daemon em execução** que usou **`PT_DENY_ATTACH`** para prevenir a depuração mesmo com o SIP desativado.
<tabledata-header-hidden><thead><tr><thwidth="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Comando</strong></td><td><strong>Descrição</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Inicia a execução, que continuará ininterrupta até que um ponto de interrupção seja atingido ou o processo termine.</td></tr><tr><td><strong>continue (c)</strong></td><td>Continua a execução do processo em depuração.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Executa a próxima instrução. Este comando irá ignorar chamadas de função.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Executa a próxima instrução. Ao contrário do comando nexti, este comando irá entrar nas chamadas de função.</td></tr><tr><td><strong>finish (f)</strong></td><td>Executa o restante das instruções na função atual ("frame") e retorna e para.</td></tr><tr><td><strong>control + c</strong></td><td>Interrompe a execução. Se o processo foi iniciado (r) ou continuado (c), isso fará com que o processo pare... onde quer que esteja executando atualmente.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main #Qualquer função chamada main</p><p>b <binname>`main #Função principal do bin</p><p>b set -n main --shlib <lib_name> #Função principal do bin indicado</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l #Lista de pontos de interrupção</p><p>br e/dis <num> #Habilitar/Desabilitar ponto de interrupção</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Obter ajuda do comando breakpoint</p><p>help memory write #Obter ajuda para escrever na memória</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<ahref="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <endereço reg/memória></strong></td><td>Exibe a memória como uma string terminada em nulo.</td></tr><tr><td><strong>x/i <endereço reg/memória></strong></td><td>Exibe a memória como instrução de montagem.</td></tr><tr><td><strong>x/b <endereço reg/memória></strong></td><td>Exibe a memória como byte.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Isso imprimirá o objeto referenciado pelo parâmetro</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Note que a maioria das APIs ou métodos Objective-C da Apple retornam objetos, e assim devem ser exibidos através do comando "print object" (po). Se po não produzir uma saída significativa, use <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Escrever AAAA nesse endereço<br>memory write -f s $rip+0x11f+7 "AAAA" #Escrever AAAA no endereço</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Desmontar função atual</p><p>dis -n <funcname> #Desmontar função</p><p>dis -n <funcname> -b <basename> #Desmontar função<br>dis -c 6 #Desmontar 6 linhas<br>dis -c 0x100003764 -e 0x100003768 # De um endereço até o outro<br>dis -p -c 4 #Começar no endereço atual desmontando</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Verificar array de 3 componentes no reg x1</td></tr></tbody></table>
Ao chamar a função **`objc_sendMsg`**, o registro **rsi** contém o **nome do método** como uma string terminada em nulo ("C"). Para imprimir o nome via lldb, faça:
* Como observado neste artigo, “[Derrotando Técnicas Anti-Depuração: variantes do macOS ptrace](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
“_A mensagem Processo # saiu com **status = 45 (0x0000002d)** é geralmente um sinal claro de que o alvo de depuração está usando **PT\_DENY\_ATTACH**_”
ReportCrash **analisa processos que estão falhando e salva um relatório de falhas no disco**. Um relatório de falhas contém informações que podem **ajudar um desenvolvedor a diagnosticar** a causa de uma falha.\
Para aplicações e outros processos **executados no contexto de lançamento por usuário**, o ReportCrash funciona como um LaunchAgent e salva relatórios de falhas no `~/Library/Logs/DiagnosticReports/` do usuário\
Para daemons, outros processos **executados no contexto de lançamento do sistema** e outros processos privilegiados, o ReportCrash funciona como um LaunchDaemon e salva relatórios de falhas no `/Library/Logs/DiagnosticReports` do sistema
Se você está preocupado com relatórios de falhas **sendo enviados para a Apple**, você pode desativá-los. Se não, relatórios de falhas podem ser úteis para **descobrir como um servidor falhou**.
Se você está realizando fuzzing via uma conexão SSH, é importante garantir que a sessão não seja interrompida. Portanto, altere o arquivo sshd_config com:
**Consulte a seguinte página** para descobrir como você pode encontrar qual aplicativo é responsável por **manipular o esquema ou protocolo especificado:**
Ele "**simplesmente funciona**" com ferramentas GUI do macOS. Note que alguns aplicativos do macOS têm requisitos específicos como nomes de arquivos únicos, a extensão correta, precisam ler os arquivos do sandbox (`~/Library/Containers/com.apple.Safari/Data`)...
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).