[목차]
이 글은 리버스엔지니어링에 대한 나의 강한 관심에서 비롯되었습니다. 저는 "iOS 애플리케이션 리버스엔지니어링"을 읽고 흥미로운 기능을 구현했습니다. 이 글은 제가 배운 내용을 간단하게 요약한 것이기도 합니다. 그런데 iOS 역방향 포럼 iOSRe는 훌륭한 iOS 역방향 통신 커뮤니티입니다.
이 예제의 모든 코드와 도구는 GitHub에서 호스팅됩니다. https://github.com/jackrex/FakeWeChatLoc를 확인하세요.
이 모든 글은 순전히 개인의 오락과 학습 가치를 위한 것입니다. 관련 기술은 학습과 커뮤니케이션을 위한 것일 뿐이며, 불법적인 목적이나 기타 상업적인 목적으로 사용하지 마십시오! ! !
직설적으로 말하면 iOS 시스템 탈옥은 Android Root와 유사합니다. 이는 휴대폰의 권한을 높이는 것과 같으며 이전에는 제어할 수 없었던 것을 제어할 수 있습니다.
Objective-C는 객체 지향 고급 언어이므로 iOS에서 사용하는 Mach-O 파일 형식에는 많은 메타데이터 정보가 포함되어 있으므로 클래스 덤프를 사용하여 헤더 파일을 복원할 수 있습니다. 이는 iOS에 대한 좋은 시작입니다. 리버스 엔지니어링.
MobileSubstrate는 iOS 개발이 후킹을 용이하게 할 수 있도록 하는 프레임워크로 다음 세 부분으로 구성됩니다.
모바일기판
Unix에서 파생된 이러한 종류의 운영 체제는 일반적으로 동일한 디렉터리 계층 구조를 갖습니다. Android와 MacOS를 비교해 보면 많은 디렉터리 이름이 동일하다는 것을 알 수 있습니다.
`/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 即是我们一般用户的主目录
Deb 구조는 실제로 data.tar.gz에 있는 라이브러리 애플리케이션 제어 파일의 gzip이며 이를 control.tar.gz에 넣습니다.
리버스 엔지니어링의 동적 디버깅 및 정적 분석에 일반적으로 사용되는 도구:
class-dump는 탈옥된 앱의 모든 헤더 파일을 덤프하는 데 사용되는 도구입니다.
IDA는 최고의 디컴파일 도구입니다. 실제로 IDA만 사용하면 간단한 리버스 엔지니어링도 완료할 수 있습니다.
Hopper Disassembler는 낮은 라이센스 비용으로 OS X에서 사용할 수 있습니다.
동적 디버깅을 위한 강력한 도구는 IDA와 함께 작동하여 모든 것을 움직이고 정지 상태로 유지합니다.
UI 디버깅 및 위치 지정을 용이하게 하는 디버그 도구로, 특정 클래스에 해당하는 앱 인터페이스를 빠르게 식별할 수 있습니다.
편리한 파일 관리 보조 소프트웨어
OpenSSH를 사용하면 컴퓨터가 원격으로 휴대폰에 로그인할 수 있습니다.
개발자가 명령줄에서 애플리케이션과 상호 작용하고 런타임에 애플리케이션을 보고 수정할 수 있게 해주는 매우 강력한 도구입니다.
쉽게 파일을 수정하고 Deb 바이너리를 설치할 수 있는 iFunbox, Android의 Re Manager 등 휴대폰에서 파일 시스템을 편리하게 관리하는 소프트웨어입니다.
APPsync는 iPhone, iPad, iPod touch를 탈옥한 후 가장 일반적으로 설치되는 패치입니다. 설치 후에는 시스템 서명 확인을 우회하고 크랙된 ipa 소프트웨어를 마음대로 설치하고 실행할 수 있습니다.
위의 이해를 바탕으로 WeChat에서 포지셔닝을 시뮬레이션하고 싶기 때문에 WeChat을 분석 개체로 사용합니다. class-dump를 사용하여 WeChat의 헤더 파일을 내보냅니다. class-dump 공식 웹사이트에는 직접 내보내기 방법인 class-dump -H xxx -o 출력/이 표시되지만 ipa 및 ipa에서는 wechat을 직접 압축 해제할 수 없습니다. 출력 폴더에 CDStructures.h 파일만 있고 비어 있는 것으로 나타났습니다.
그 이유는 AppStore에 업로드한 후 AppStore가 자동으로 모든 ipas를 암호화하므로 덤프하기 전에 WeChat 바이너리를 셸해야 하기 때문입니다.
먼저 좀 더 편리한 클러치를 사용해 볼까요?
Clutch가 실패하면 다음 단계를 수행하여 앱에서 셸을 덤프하고 모든 프로그램을 종료한 후 WeChat을 실행합니다.
ps - e //列出当前运行的进程
TODO /var/mobile/Containers/로 시작하는 프로세스가 WeChat 프로세스임을 알 수 있습니다. 모든 앱의 샌드박스 경로는 /var/mobile/Containers/Bundle/Application/03B61840-2349-4559-B28E입니다. - 0E2C6541F879/ , 그러나 우리는 03B61840-2349-4559-B28E-0E2C6541F879 앱이 무엇인지 알 수 없습니다. 디렉토리로 가서 하나씩 찾으면 매우 어려울 것입니다.
이때 cycript가 유용합니다.
cycript -p WeChat
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents/"
이런 방식으로 WeChat Documents 디렉터리를 얻습니다. 그런 다음 scp 또는 ifunbox를 사용하여 dumpdecrypted.dylib를 WeChat의 Documents 디렉터리에 복사합니다.
껍질을 깨기 시작해
DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/executable
WeChat.decrypted는 쉘링된 WeChat입니다. 덤프하기 전에 otool 도구를 사용하여 Match-o의 파일 정보를 볼 수 있습니다.
otool -H WeChat.decrypted
otool -l WeChat.decrypted를 사용하여 암호를 찾고, lib를 사용하여 해독된 구조를 분할합니다.
구현하다
./class-dump -H WeChat.decrypted --arch armv7 -o output/
타사 SDK 등을 포함하여 WeChat에서 내보낸 모든 헤더 파일이 포함된 출력 폴더를 현재 디렉터리에 생성합니다. 쉽게 볼 수 있도록 이러한 모든 헤더 파일을 빈 Xcode 프로젝트에 넣습니다.
직관을 바탕으로 Appdelegate가 WeChat의 MircoMessengerAppDelegate라는 것을 알았습니다. WeChat의 프로젝트 구조 등을 대략적으로 볼 수 있습니다. 실제로 리버스 엔지니어링도 학습의 한 방법입니다.
그러면 우리가 구현하고 싶은 기능을 생각해 봅시다.우리는 근처에 있는 사람들을 변경하기 위해 이 클래스를 Nearby Location 등에 제출해야 한다고 대략적으로 추측하고 해당 헤더 파일을 검색할 수 있습니다.
Nearby를 검색해 보니 너무 많은 것 같던데 어떤 곳인가요?
실제로 제거 방법과 하나씩 추측하는 것 외에도 Reveal이라는 강력한 도구를 사용하여 위치를 찾을 수 있습니다.
클래스 덤프는 전체 헤더 파일을 나열하는 데 도움이 되어 프로젝트의 전체 구조에 대한 일반적인 이해를 제공하지만 .m의 해당 구현 계획은 여전히 우리에게 블랙박스입니다. 이때 우리는 분석을 위해 IDA의 강력한 도구를 사용해야 합니다.
IDA를 열고 새 항목을 선택하세요.
Wechat.app에서 WeChat 바이너리를 꺼내서 위의 IDA로 드래그합니다. 저는 itouch 5 CPU를 사용하고 있으며 아키텍처는 armv7이므로 잘못 사용하면 중단점에서 얻은 오프셋을 사용합니다. 오류가 발생하므로 정상적으로 디버깅할 수 없습니다.
처리가 완료되면 아래 그림과 같이 됩니다.
그 중 MicroMessengerAppDelegate에서 특정 메소드의 구현을 쉽게 볼 수 있습니다. 스페이스바를 누르면 보기 모드로 확장됩니다.
여기서 우리는 .m의 구현을 볼 수 있습니다.
동적 디버깅은 소스 코드가 없을 때 lldb를 사용하여 디버깅을 위한 코드 위치에 중단점을 설정하는 것입니다. 주요 목적은 해당 코드의 실행 주소를 계산하고 원하는 값을 얻기 위해 디버깅하는 것입니다. . 위에서 언급한 것처럼 IDA의 디컴파일 결과를 사용합니다.
iOS는 debugserver를 열고 포트 1234 debugserver *:1234 -a "WeChat"을 수신합니다.
Mac에서 lldb를 실행하고 iOS 서버에 대한 연결을 유지합니다. lldb 프로세스 connect connect://iOSIP:1234를 실행합니다.
오프셋은 0xd000입니다.
중단점 주소 가져오기 br s -a 0xd000+0x649D8 // 하위 중단점
ni po 및 기타 디버깅 명령 디버깅 시작
앱 직접 시작: debugserver -x backboard *:1234 /path/to/app/executable
libsubstrate.dylib
Tweak은 단어에서 "미세 조정"을 의미합니다. 실제로는 타사 동적 링크 라이브러리인 dylib입니다. Tweak은 MobileSubstrate를 기반으로 작성되었으며 런타임에 후크의 앱을 변경할 수 있습니다.
Theos는 탈옥 개발 툴킷입니다. 이 방법은 "iOS Application Reverse Engineering Book"에도 소개되어 있지만 저는 개인적으로 iOSOpenDev를 사용하여 프로젝트를 만드는 것을 선호합니다(ps: git 명령줄에 익숙해진 후 sourceTree를 사용하려고 생각했습니다. 직관적)이므로 여기서 간단히 언급하겠습니다. iOSOpenDev가 명령줄 NIC 템플릿을 시각적인 템플릿으로 바꾸는 것처럼 느껴집니다. 실제로는 그다지 어렵지 않습니다.
설치는 매우 간단합니다. 설치 프로그램을 다운로드하여 설치하세요.
설치가 완료된 후 새 프로젝트를 생성하면 iOSOpenDev가 iOS 템플릿에 나타납니다.
여기서 Logos Tweak을 선택하면 다음과 같이 생성이 완료됩니다.
우리가 코드를 작성하려는 파일인 fakeloc.xm이 있습니다. fakeloc.xm 파일을 열면 내부의 코드가 로고를 사용하여 완성된 것을 볼 수 있습니다. 새로운 언어인 로고의 경우 기본 구문이 Objc와 유사하므로 특별한 구문이 없습니다. 주목:
로고 기본 구문: %hook는 연결되어야 하는 클래스를 지정합니다. %end로 끝나야 합니다. %log는 정보를 인쇄하기 위해 함수 정보를 기록하며 %hook 특정 메서드 내에서만 실행될 수 있습니다. .
fakeloc.xm은 fakeloc.mm에 해당합니다.
우리는 위에 있다
빌드 설정에서 볼 수 있듯이 하단에 User-Define이라는 열이 있습니다. 여기에 사용자 정의된 부분이 있습니다. iOSOpenDevDevice 위치에 iOS 장치의 IP 주소(예: 192.168.1.103)를 작성합니다. 전제는 iOS 장치에 OpenSSH가 설치되어 있다는 것입니다.
SSH 인증 오류 iosod sshkey -h 192.168.1.109
처음에는 탈옥한 앱을 만들려면 로고스 구문으로 작성해야 한다고 생각했는데, 그게 겁이 나더군요. 사실 iOS 탈옥 앱의 개발은 일반 앱과 거의 똑같습니다.
먼저, 일반 프로젝트를 만드는 것과 마찬가지로 CocoaPods를 사용하여 타사 라이브러리를 관리할 수도 있습니다.
먼저 평소와 같이 새 프로젝트를 생성하고 다음과 같이 구성한 후 빌드 설정을 변경합니다.
실행 스크립트를 추가하고 복사 번들 리소스에서 제어를 제거합니다.
전체 프로젝트 구조
프로파일링 실행자를 위한 빌드
App 및 Tweak을 생성한 후 앱에서 Tweak을 어떻게 호출합니까? 답은 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());
}
그런 다음 해당 사용자 정의 클래스를 동적으로 가져옵니다.
클래스 TweakBridge = NSClassFromString(@"TweakBridge");
나는 처음에 이 문제에 대해 의아해했고, 마침내 이를 달성하기 위한 가장 안정적이고 간단한 방법, 즉 동일한 파일에 데이터를 읽고 쓰는 방법을 채택했습니다. 이 파일은 데이터 전송을 위한 매체로 사용할 수 있습니다. 그런데 처음에 파일을 /var/mobile/xxx.plist에 넣었는데 Twitch가 값을 읽을 수 없었습니다. 그 이유는 Tweak과 우리 앱의 권한이 다르기 때문에 해당 파일을 읽을 수 있는 곳을 찾아야 합니다. 이 장소는 **/var/mobile/Library/Preferences/입니다. ** 그러므로 우리의 앱과 Tweak 정보 상호 작용은 더 나은 전송 목적을 달성하기 위해 하나의 쓰기 방법과 다른 읽기 방법을 사용합니다. 직접적인 방법을 제안해 보도록 하겠습니다.
따라서 최종 코드는 다음과 같습니다.
- (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());
}
}
그렇다면 사용자가 설치 후 바로 사용할 수 있도록 Tweak을 앱과 결합하려면 어떻게 해야 할까요? 위에서 언급한 deb 형식을 고려할 때 패키징 방법과 구조 및 zip은 실제로 동일하며 iOS 시스템에서 설치할 수 있습니다. 위에서 패키지 형식과 구조를 이미 설명했으며 이제 Deb 패키지를 생성하는 방법을 설명했습니다.
생성된 dylib 및 app 디렉터리를 각각 꺼냅니다.
이들을 모두 별도의 패키지 디렉터리에 넣습니다. 최종 디렉터리 구조는 아래와 같습니다.
아래 계층 구조에 따라 Deb가 정리한 디렉터리 구조에 따라 모든 파일을 정렬한 다음 dpkg-deb 방법을 사용하여 패키징합니다. 참고로 패키징할 때 deb에 .DS_Store 파일이 없는 것이 가장 좋습니다. 다음 스크립트를 사용하여 Deb 파일을 동시에 생성하세요.
#!/bin/bash
find ./Package -name ".DS_Store" -depth -exec rm {} ;
dpkg-deb -Zgzip -b Package fakeLoc.deb
생성된 설치 패키지는 다음과 같으며 이를 장치에 SCP로 지정합니다.
iFunbox를 사용하여 생성된 fakeLoc .deb를 루트 디렉터리로 드래그한 다음 휴대폰에서 iFile을 열고 fakeLoc.deb를 클릭하여 프로그램을 설치합니다. 설치 후 AppSync를 다시 설치하고 휴대폰을 다시 시작하면 앱을 열 수 있습니다. 또한 시스템 응용 프로그램, Cydia 등과 마찬가지로 앱을 길게 눌러 제거할 수 없다는 사실도 발견했습니다. 제거하려면 명령줄을 사용하여 삭제할 수 있습니다. 시디아를 사용하세요.
설치가 완료되면 장치를 다시 시작하십시오.
앱을 열고 정밀도와 위도를 입력한 다음 실행해 보겠습니다. 마지막으로 WeChat People Nearby를 열어서 더 잘 수행하면 지도에서 정밀도 위도가 선택됩니다. function is 설명은 여기서 끝납니다. 간단한 테스트 결과는 다음과 같습니다.
테스트를 위해 지도 주소 선택기에서 다른 위치를 선택할 수 있습니다.
보시다시피 대부분의 사람들이 베이징 출신입니다.
WeChat에서 주변 사람들을 성공적으로 시뮬레이션했습니다.
이는 AppStore에 게시하는 것과는 다릅니다. 먼저 호스팅 소스가 필요합니다. 직접 빌드하고 싶지 않으면 thebigboss.org/hosting-repository-cydia/submit-your-app을 사용할 수 있습니다.
관련 정보를 입력하세요. 이에 대해서는 다시 설명하지 않습니다.
이 기사는 주제에 대한 소개입니다. iOS 탈옥에 대한 사전 이해를 갖고 자신의 앱을 완성하고 WeChat에서 빨간 봉투를 잡는 플러그인과 같은 더 재미있는 Tweak을 개발할 수 있기를 바랍니다. 이 예제 프로젝트는 모두 Github에서 호스팅되며, 여기서 fakeloc은 dylib입니다. 즉, TestFakeTweak은 앱 프로젝트인 HackAppTool입니다. 위 기사에서는 사용해야 하는 타사 도구에 대해 설명합니다.
프로젝트 주소: 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你就可以进一步修改成其它的密码了