[TOC]
Este artigo é motivado pelo meu grande interesse em engenharia reversa. Li "Engenharia reversa de aplicativos iOS" e implementei uma função interessante que quero compartilhar com vocês e também é um simples resumo do meu próprio aprendizado. A propósito, iOS Reverse Forum iOSRe é uma boa comunidade de comunicação reversa para iOS.
Todo o código e ferramentas deste exemplo estão hospedados no GitHub. Verifique https://github.com/jackrex/FakeWeChatLoc.
Todo este artigo é puramente para entretenimento pessoal e valor de aprendizagem. A tecnologia relacionada é apenas para aprendizagem e comunicação. ! !
Fazer o jailbreak do sistema iOS, para ser franco, é semelhante ao Android Root. É equivalente a aumentar as permissões do telefone celular, permitindo que você controle coisas que antes não conseguia controlar.
Como Objective-C é uma linguagem de alto nível orientada a objetos, o formato de arquivo Mach-O usado pelo iOS contém muitas informações de metadados, permitindo-nos usar class-dump para restaurar seus arquivos de cabeçalho. engenharia reversa.
MobileSubstrate é uma estrutura que permite o desenvolvimento de iOS para facilitar a conexão. MobileSubstrate consiste nas três partes a seguir:
Substrato móvel
Este tipo de sistema operacional derivado do Unix geralmente tem a mesma hierarquia de diretórios. Você também pode comparar o Android e o MacOS e descobrirá que muitos nomes de diretório são iguais.
`/bin binnary` ,系统常用的基本二进制文件 例如 cd, ls, ps 等
`/usr` 包含大多用户工具库
`/var variable` 存放经常更改的东西,例如 logs,用户数据,/var/mobile/Applications 是纺织AppStore 下载的 App
`/Applications` 存放所有系统App,以及从Cydia下载的App路径
`/Library` 存放了系统App的数据,其中有一个/Library/MobileSubstrate 目录,MobileSubstrate 是一个hook 功能开发平台,其中内容如下图所示,我们所开发的插件都被放置到这个里面
`/Library/MobileSubstrate` 里面文件类型主要有 dylib,plist
dylib 是动态加载库,就是tweak
plist 配合dylib 使用的filter 文件,指定注入目标,及hook的目标
`/System` 存放iOS 各种系统framework
`/User` 指向 /var/mobile 即是我们一般用户的主目录
A estrutura Deb é na verdade o arquivo de controle em Aplicativos de Biblioteca gzip data.tar.gz e colocado em control.tar.gz
Ferramentas comumente usadas para depuração dinâmica e análise estática em engenharia reversa:
class-dump é uma ferramenta usada para despejar todos os arquivos de cabeçalho de um aplicativo desbloqueado.
IDA é a melhor ferramenta de descompilação. Na verdade, a engenharia reversa simples pode ser concluída usando apenas IDA.
Hopper Disassembler pode ser usado no OS X com uma baixa taxa de licenciamento
A poderosa ferramenta para depuração dinâmica funciona com o IDA para fazer tudo se mover e ficar parado.
Uma ferramenta de depuração que facilita a depuração e o posicionamento da UI. Podemos identificar rapidamente qual interface do aplicativo corresponde a uma determinada classe.
Software assistente de gerenciamento de arquivos conveniente
OpenSSH permite que seu computador faça login remotamente em seu telefone
Uma ferramenta muito poderosa que permite aos desenvolvedores interagir com aplicativos a partir da linha de comando e visualizar e modificar aplicativos em tempo de execução.
Um software que gerencia convenientemente o sistema de arquivos em telefones celulares, como iFunbox e Re manager do Android, que pode facilmente modificar arquivos e instalar binários Deb.
APPsync é o patch mais comumente instalado após o jailbreak do iPhone, iPad e iPod touch. Após a instalação, você pode ignorar a verificação da assinatura do sistema e instalar e executar o software ipa crackeado à vontade.
Com base no entendimento acima, como queremos simular o posicionamento no WeChat, utilizamos o WeChat como nosso objeto de análise. Use class-dump para exportar o arquivo de cabeçalho do WeChat Embora vejamos o método de exportação direta class-dump -H xxx -o output/ no site oficial do class-dump, não é possível descompactar diretamente o wechat no ipa e despeje-o. Verificou-se que havia apenas o arquivo CDStructures.h na pasta de saída e estava vazio.
A razão para isso é porque após o upload para a AppStore, a AppStore criptografa automaticamente todos os ipas, então precisamos shell o binário do WeChat antes de despejá-lo.
Deveríamos primeiro tentar a embreagem mais conveniente
Quando o Clutch falhar, tente as etapas a seguir. Precisamos de uma ferramenta como dumpdecrypted.dylib para despejar o shell em nosso aplicativo. Primeiro, fazemos ssh em nosso telefone iOS, encerramos todos os programas, abrimos o WeChat e executamos.
ps - e //列出当前运行的进程
TODO Você pode ver que o processo listado começando com /var/mobile/Containers/ é o processo WeChat. Sabemos que o caminho da sandbox de todos os aplicativos é /var/mobile/Containers/Bundle/Application/03B61840-2349-4559-B28E. -0E2C6541F879/ , mas não sabemos qual é o aplicativo 03B61840-2349-4559-B28E-0E2C6541F879 . Seria muito difícil se formos ao diretório para encontrá-los um por um.
Neste momento o cycript é útil, execute
cycript -p WeChat
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents/"
Desta forma, obtemos o diretório de documentos do WeChat. Em seguida, use scp ou ifunbox para copiar dumpdecrypted.dylib para o diretório de documentos do WeChat.
Comece a quebrar a casca
DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/executable
WeChat.decrypted será gerado no diretório atual. Este é o WeChat que foi descascado. Antes de despejá-lo, podemos usar a ferramenta otool para visualizar as informações do arquivo Match-o.
otool -H WeChat.descriptografado
Use otool -l WeChat.decrypted para encontrar o cryptid e use lipo para dividir a estrutura descriptografada.
implementar
./class-dump -H WeChat.decrypted --arch armv7 -o output/
Gere uma pasta de saída no diretório atual, que contém todos os arquivos de cabeçalho exportados pelo WeChat, incluindo SDK de terceiros, etc. Colocamos todos esses arquivos de cabeçalho em um projeto Xcode vazio para facilitar a visualização.
Com base na intuição, descobrimos que Appdelegate é o MircoMessengerAppDelegate do WeChat. Podemos ver aproximadamente a estrutura do projeto do WeChat, etc.
Então vamos pensar sobre a função que queremos implementar. Queremos alterar nossa localização para alterar as pessoas próximas. Podemos adivinhar aproximadamente que esta classe deve ser enviada para Local Próximo ou algo semelhante, e podemos procurar o arquivo de cabeçalho correspondente.
Descobrimos que existem tantos depois de pesquisar nas proximidades, qual é?
Na verdade, além do método de eliminação e da especulação um por um, podemos usar a poderosa ferramenta Reveal para nos ajudar a localizar
Pode-se dizer que o class-dump nos ajuda a listar todo o arquivo de cabeçalho, dando-nos uma compreensão geral da estrutura geral do projeto, mas o plano de implementação correspondente em .m ainda é uma caixa preta para nós. Neste momento precisamos de utilizar as poderosas ferramentas de análise da IDA.
Abra o IDA e selecione novo
Retiramos o binário WeChat do Wechat.app e o arrastamos para o IDA acima. Como estou usando a CPU itouch 5 e a arquitetura é armv7, uso o primeiro se for usado incorretamente, o deslocamento obtido pelo ponto de interrupção. estará errado, portanto, não será possível depurar normalmente.
Após a conclusão do processamento, ficará conforme mostrado na figura abaixo
Entre eles, podemos ver facilmente a implementação de métodos específicos no MicroMessengerAppDelegate. Pressione a barra de espaço para expandir para o modo de visualização.
Aqui podemos ver a implementação em .m
A depuração dinâmica é quando não temos o código fonte, usamos lldb para definir pontos de interrupção no local do código para depuração. O objetivo principal é calcular o endereço de execução do código correspondente e como depurar para obter o valor que desejamos. . Conforme mencionado acima, usamos os resultados da descompilação do IDA
iOS abre o debugserver e escuta a porta 1234 debugserver *:1234 -a "WeChat"
Execute lldb no Mac e mantenha-se conectado ao servidor iOS. Execute lldb process connect connect://iOSIP:1234.
o deslocamento é 0xd000
Obtenha o endereço do ponto de interrupção br s -a 0xd000+0x649D8 // Ponto de interrupção inferior
Comece a depurar ni po e outros comandos de depuração
Inicie um aplicativo diretamente: debugserver -x backboard *:1234 /path/to/app/executable
libsubstrato.dylib
Tweak significa "ajuste fino" na palavra. Na verdade, é a biblioteca de link dinâmico de terceiros que Tweak é escrita com base no MobileSubstrate e pode alterar o aplicativo do gancho em tempo de execução.
Theos é um kit de ferramentas de desenvolvimento de jailbreak. Este método também é apresentado no "Livro de engenharia reversa de aplicativos iOS", mas eu pessoalmente prefiro usar iOSOpenDev para criar projetos (ps: depois de me familiarizar com a linha de comando do git, pensei em usar sourceTree Mais intuitivo), então vou mencioná-lo brevemente aqui. Parece que o iOSOpenDev transforma o modelo NIC de linha de comando em um modelo visual.
A instalação é muito simples Baixe o instalador e instale-o.
Após a conclusão da instalação, crie um novo projeto e iOSOpenDev aparecerá no modelo iOS
Aqui escolhemos Logos Tweak e a criação é concluída da seguinte forma
Existe um arquivo fakeloc.xm, onde queremos escrever o código. Abra o arquivo fakeloc.xm e podemos ver que o código interno é concluído usando logotipos. Para logotipos, uma nova linguagem, você não precisa se preocupar. Sua sintaxe básica é semelhante ao Objc. atenção:
Sintaxe básica do logotipo: %hook especifica a classe que precisa ser conectada. Ela deve terminar com %end. %log grava informações da função no syslog para imprimir informações. .
fakeloc.xm corresponde a fakeloc.mm
Estamos acima
Como você pode ver nas configurações de compilação, há uma coluna na parte inferior chamada User-Define. Esta é a nossa parte personalizada. No local iOSOpenDevDevice , escreva o endereço IP do nosso dispositivo iOS (endereço LAN como 192.168.1.103). A premissa é que o dispositivo iOS esteja instalado OpenSSH
erro de autenticação ssh iosod sshkey -h 192.168.1.109
No início, pensei que a criação de um aplicativo jailbreak deveria ser escrita na sintaxe do Logos, o que me assustou até a morte. Na verdade, o desenvolvimento de um aplicativo jailbreak para iOS é quase exatamente igual a um aplicativo normal.
Primeiro, ainda criamos um projeto. Assim como criamos um projeto normal, você também pode usar o CocoaPods para gerenciar suas bibliotecas de terceiros.
Primeiro crie um novo projeto normalmente, configure-o como segue e depois altere as configurações de compilação.
Adicionar Run Script e remover o controle dos recursos do pacote de cópias
Estrutura geral do projeto
Construir para executor de criação de perfil
Depois de gerar App e Tweak, como chamamos Tweak em nosso App? A resposta é usar dlopen
void *handle = dlopen(TWEAK_PATH, RTLD_LAZY); //TWEAK_PATH 是dylib 的地址
if (handle) {
NSLog(@"handle");
if (0 != dlclose(handle)) {
printf("dlclose failed! %sn", dlerror());
}else {
}
} else {
NSLog(@"nohandle");
printf("dlopen failed! %sn", dlerror());
}
Em seguida, obtenha dinamicamente a classe personalizada correspondente
Classe TweakBridge = NSClassFromString(@"TweakBridge");
Fiquei intrigado com esse problema no início e finalmente adotei o método mais estável e simples para alcançá-lo, que é ler e gravar dados no mesmo arquivo. Este arquivo pode ser usado como meio de transmissão de dados. Mas no início coloquei o arquivo em /var/mobile/xxx.plist, mas o tweak não conseguiu ler o valor. O motivo é que o tweak e nosso App têm permissões diferentes, então precisamos encontrar um local onde ele possa estar. escrito publicamente. Este local é **/var/mobile/Library/Preferences/ ** Portanto, nossa interação de informações do App e do Tweak usa um método de escrita e outro método de leitura para atingir o objetivo de transmissão. método direto, você pode propor isso. Vamos discutir juntos.
Então o código final é:
- (void)setLocWithLat:(double)lat andLng:(double)lng {
NSLog(@"set lat & lng is %f &&&& %f", lat, lng);
Class TweakBridge = NSClassFromString(@"TweakBridge");
void *handle = dlopen(TWEAK_PATH, RTLD_LAZY);
if (handle) {
NSLog(@"handle");
TweakBridge = NSClassFromString(@"TweakBridge");
NSDictionary *dict = @{@"lat":[NSNumber numberWithDouble:lat], @"long":[NSNumber numberWithDouble:lng]};
BOOL isSuccess = [dict writeToFile:LOCATION_PATH atomically:YES];
NSLog(@"isSuccess, %d", isSuccess);
CLLocation *location = [[TweakBridge shareInstance] getCoreLocation];
if (0 != dlclose(handle)) {
printf("dlclose failed! %sn", dlerror());
}else {
}
} else {
NSLog(@"nohandle");
printf("dlopen failed! %sn", dlerror());
}
}
Então, como combinamos nosso Tweak com nosso aplicativo para que os usuários possam usá-lo diretamente após a instalação. Tendo em vista o formato deb que mencionamos acima, o método e a estrutura do pacote são na verdade os mesmos do zip e podem ser instalados pelo sistema iOS. Já explicamos o formato e estrutura do pacote acima, agora como gerar o pacote Deb
Retiramos os diretórios gerados de dylib e app respectivamente.
Coloque todos eles em um diretório Package separado. A estrutura final do diretório é a seguinte:
Organizamos todos os arquivos de acordo com a estrutura de diretórios organizada por Deb de acordo com a hierarquia mostrada abaixo e, em seguida, usamos o método dpkg-deb para empacotar. Observe que é melhor não ter arquivos .DS_Store no deb ao empacotar. seguinte script para removê-lo. Gere arquivos Deb ao mesmo tempo.
#!/bin/bash
find ./Package -name ".DS_Store" -depth -exec rm {} ;
dpkg-deb -Zgzip -b Package fakeLoc.deb
O pacote de instalação gerado é o seguinte, e então o enviamos para o dispositivo
Usamos o iFunbox para arrastar o fakeLoc .deb gerado para o diretório raiz, em seguida, abrimos o iFile no telefone e clicamos em fakeLoc.deb para instalar o programa. Após a instalação, reinstalamos o AppSync e reiniciamos o telefone, e então podemos abrir nosso aplicativo. , e também descobrimos que nosso aplicativo não pode ser desinstalado mantendo-o pressionado, assim como os aplicativos do sistema, Cydia, etc. Isso deve ser porque o instalamos em /Aplicativos. Para desinstalar, podemos usar a linha de comando para excluí-lo ou. use o Cydia.
Após a conclusão da instalação, basta reiniciar o dispositivo.
Abra o aplicativo, insira a precisão e a latitude e, em seguida, execute-o. Por fim, abra o WeChat People Near para ver se as pessoas próximas mudaram. Se fizermos melhor, selecione a precisão da latitude no mapa e deixe nossas funções principais. A explicação termina aqui. Nossos resultados de teste simples são os seguintes:
Podemos selecionar diferentes locais no seletor de endereço do mapa para teste
Você pode ver que a maioria das pessoas é de Pequim
Simulação de pessoas próximas com sucesso no WeChat
Isso não é como publicar na AppStore. Primeiro, você precisa de uma fonte de hospedagem. Se não quiser construí-lo sozinho, você pode usar thebigboss.org/hosting-repository-cydia/submit-your-app.
Preencha as informações relevantes, estas não serão descritas novamente.
Este artigo é uma introdução ao tópico. Espero que você tenha uma compreensão preliminar do jailbreak do iOS, seja capaz de completar qualquer um de seus próprios aplicativos e desenvolver ajustes mais divertidos. Por exemplo, o plug-in para pegar envelopes vermelhos no WeChat. parece não ser difícil de implementar. Este projeto de exemplo está todo hospedado no Github, onde fakeloc é dylib, ou seja, tweak TestFakeTweak é o projeto do aplicativo, HackAppTool. Nosso artigo acima descreve as ferramentas de terceiros que precisam ser usadas.
Endereço do projeto: https://github.com/jackrex/FakeWeChatLoc
重新安装下AppSync 并重启SpringBoard
由于iOS7之后引入一些新的类库等,在iOS6设备上的兼容性一般,所以在工程的framework 中把 require 改为 option
root密码文件存放地方: / etc / master . passwd
用iFile的文本编辑功能打开master . passwd ,更改之前记得权限
你会找到类似这样的一行字符—— root : UlD3amElwHEpc : 0 : 0 :: 0 : 0 : System
UlD3amElwHEpc就是加密过的密码
把它更替为ab3z4hnHA5WdU ,这是对应的密码就是abc123 。
保存,重启。
有了密码abc123你就可以进一步修改成其它的密码了