매우 강력한 분석 보조 소프트웨어입니다.
1. 안드로이드 최적화 프로세스에 대한 심층적인 이해
2. 안드로이드 소스 코드를 가까이서 관찰하세요
2. 빅 보스의 압축 풀기
1. 다운로드 가능한 기타 기능
2. dex 파일 파싱 과정
3. 쉘링 및 브레이킹에 대한 약간의 지식
1. 클래스 로딩의 전체 과정
2. 압축 해제 및 강화된 클래스 선택
이 소프트웨어에는 c/C++ 및 Java 소스 코드를 분석하기 위한 강력한 보조 기능이 있습니다. 나중에 사용할 것이므로 간략하게 소개하겠습니다.
도구는 첨부파일에서 확인하실 수 있습니다. 별도로 업로드하고 다운로드하면 됩니다.
SI3US-205035-36448
등록 코드는 여기에 제공됩니다.
설치, 다음, 다음이 전부입니다.
새 프로젝트를 선택하세요.
단일 머신 OK
첫 번째 것을 선택하세요.
트리 추가를 선택하세요. 이는 모두 추가한다는 의미입니다.
로딩이 완료된 후
이 소프트웨어를 분석에 사용합니다.
좀 말씀드리고 싶은데, 이제 영어의 중요성을 알겠습니다. 물론 제 영어가 좋지는 않지만 사전을 찾아보면 알 수 있습니다.
먼저 내용에 대해 이야기하지 말고 이 함수의 이름을 살펴보겠습니다. extract: 추출 및 처리 Zip, 압축 파일 형식, 우리 모두는 apk가 실제로 zip 압축 패키지라는 것을 알고 있습니다.
그렇다면 이 기능의 의미는 zip을 추출하는 과정입니다.
그럼 단계별로 분석해 보겠습니다.
여기 extractAndProcessZip의 중간 변수 정의가 있습니다. 그것은 우리 연구의 초점이 아닙니다.
DexClassVerifyMode verifyMode = VERIFY_MODE_ALL;
이 문장은 검증 모듈인 verifyMode를 정의합니다. 여기서 초기화되는 데이터는 VERIFY_MODE_ALL이며, 이는 모든 것이 검증되었음을 의미합니다.
Thinking
여기서 내용을 변경하면 이 검증을 건너뛸 수 있나요?
다른 가치도 살펴보겠습니다.
아이디어가 있으면 이 값을 직접 정의할 수 있습니다.
DexOptimizerMode dexOptMode = OPTIMIZE_MODE_VERIFIED;
계속 읽어보겠습니다.
이름에서 알 수 있듯이 dex 최적화를 위해 빈 헤더를 생성하는 dexOptCreateEmptyHeader라는 함수가 있습니다.
dexOffset, 나중에 다시 여기로 돌아올 수 있도록 파일 위치를 기록하세요. 이는 실제로 dex 파일을 읽는 시작 위치입니다.
다음 기능을 살펴보겠습니다.
zip 아카이브를 열고 DEX 항목을 찾으세요.
분명히 이 부분이 하는 일은 apk에서 dex 파일을 찾는 것입니다.
그럼 분석해보세요.
dex의 일부 오프셋을 추출하는 기능입니다.
DEX 데이터를 현재 오프셋의 캐시 파일로 추출합니다. dex 파일의 일부 오프셋을 기록합니다.
다음으로 이야기할 내용은 dex odexing 과정입니다.
여기서 최적화 확인이 이루어집니다.
여기에서 최적화 프로세스를 수정하고 최적화 확인을 제거할 수도 있습니다.
여기 데이터의 출처와 비교할 위치를
생각해 보세요. ·
이 데이터는 build.prop에서 비교됩니다.
dvmContinueOptimization 함수에 대해 살펴보겠습니다.
PS:
우리는 포장 풀기와 매우 관련이 있는 매우 중요한 장소와 곧 접촉하게 됩니다
dvmContinueOptimization 기능을 엽니다
첫 번째는 판단입니다.
그런 다음 dex 파일에 쓰기가 있습니다.
그럼 계속 읽어보세요(중요한 사항이 나옵니다)
dvmDexFileOpenPartial. 이전에 다른 사람들의 언패킹 튜토리얼을 본 적이 있다면 이것이 자주 사용되는 엔드포인트라는 것을 아셔야 합니다. 하지만 이제 이 함수가 소스 코드에 존재한다는 것을 알았습니다.
dvmDexFileOpenPartial 함수의 호출을 살펴보겠습니다.
여기에서는 두 번 호출되며 다른 시간은 자체 정의입니다.
먼저 dvmDexFileOpenPartial의 프로토타입을 살펴보겠습니다
int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)
매개변수 1: 메모리에 로드된 DEX 파일의 기본 주소(즉, DEX. .035)
매개변수 2: 로드된 DEX 파일의 파일 길이,
매개변수 3: 출력 매개변수, DEX 파일은 Dex 파일의 클래스, 필드, 메소드 및 문자열 정보를 포함하는 DvmDex 구조로 변환됩니다. Dalivk이 운영하는 Dex 파일의 객체는 구조 구조입니다
마지막으로 헤더 정보가 여기에 기록됩니다.
dvmRawDexFileOpen() 이 함수는 우리가 이해해야 할 핵심 함수이며 RawDexFile.cpp 함수에 있습니다.
먼저 기본 변수를 정의합니다.
우리 모두는 파일 형식에서 매우 중요한 것이 매직 넘버라는 것을 알고 있습니다. 따라서 매직 넘버를 결정하는 첫 번째 단계인 verifyMagicAndGetAdler32를 소개합니다. 여기서의 마법은 매직 넘버입니다.
여기서 시간과 파일 크기를 확인합니다.
이 기능은 핵심 기능이자 우리가 집중적으로 분석해야 할 기능이기도 합니다. 주요 기능은 소위 odexization이라는 dex에 해당하는 odex 파일을 생성하는 것입니다. 함수를 따라가서 살펴보겠습니다.
다음은 dexOptGenerateCacheFileName() 함수의 일부입니다. 우리의 가장 중요한 것은 그것이 출력되는 위치를 확인하는 것입니다.
여기서는 데이터 디렉터리 ALOGV("'%s' '%s'에 대한 캐시 파일은 '%s'입니다', fileName, subFileName, nameBuf);
다음에 생성된 것을 볼 수 있습니다. 이 형식처럼요.
즉, odex 파일이 여기에 생성되었습니다.
다음으로 할 일은 이 함수 dvmDexFileOpenFromFd()이며, 추가로 최적화하고 매핑을 완료한 후 읽을 수 있는 파일로 설정합니다. 이 기능을 엽니다. 위치는 DvmDex.cpp에 있습니다.
먼저 이 함수가 호출되는 위치를 살펴보겠습니다.
이 함수가 호출되는 곳은 핵심 함수인 dvmRawDexFileOpen입니다. 이 함수는 먼저 dexOptGenerateCacheFileName을 호출하여 odex를 생성한 다음 다른 최적화를 위해 dvmDexFileOpenFromFd를 호출합니다.
최적화의 마지막 단계는 DEX를 구문 분석하는 dexFileParse()입니다. 이 위치는 DexFile
dvmRawDexFileOpen() 기본 제어 함수 - dexOptGenerateCacheFileName()은 해당 odex를 생성합니다. - dvmDexFileOpenFromFd()는 추가로 최적화합니다. - dexFileParse()는 dex를 구문 분석합니다.
dexfileopenpartial이 다음 섹션에 있으면 이를 깨뜨릴 방법이 없다는 것을 알 수 있습니다. 그런 다음 dexOptGenerateCacheFileNamePKcS0, dvmdexfileopenfromfd 및 기타 기능을 선택하여 다음 섹션으로 진행할 수 있습니다.
일반적으로 말해서, dexfileopenpartial은 쉘을 사용하여 작업을 처리하는 데 더 좋습니다.
다른 소스 코드는 주요 제어 기능에 의해 안내되어 다른 주요 기능이 작동하도록 안내합니다.
주요 제어 기능은 Dalvik_dalvik_system_DexFile_defineClassNative()
주의가 필요한 기능인 Dalvik_dalvik_system_DexFile_openDexFileNative
여기서 주목해야 할 점은 덤프할 수 있는 곳이 두 군데 있다는 점입니다.
주요 제어 기능을 살펴보겠습니다.
메인 컨트롤 기능에 이런 호출이 있습니다.
이 호출은 쿠키를 확인하기 위한 것이지만 이 쿠키는 해독된 dex 쿠키일 가능성이 높으므로 이 쿠키를 여기에 덤프할 수도 있습니다.
그럼 아래를 내려다보세요.
dvmDefineClass 함수, 이 함수는 클래스 로딩을 확인하는 함수입니다.
함수는 스스로 판단을 내리지만, 반환되는 것은 실로 큰 머리입니다. 이 기능을 자세히 살펴보겠습니다.
여기서 가장 중요한 것은 동적으로 로드되는 클래스인 clazz입니다.
그 값은 loadClassFromDex 함수에 의해 반환되므로 좀 더 자세히 살펴보겠습니다.
여기에서 그러한 구조를 확인하세요.
이 구조의 세부 사항을 살펴 보겠습니다.
이 구조는 dex 구조와 정확히 동일합니까? 이는 여기에 우리에게 필요한 것이 있음을 보여줍니다.
위 내용은 Android에서 새 프로젝트를 만드는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!