Android Modlama Eğitimi

Bugün sizlere android oyunlarını nasıl modlayacağınız ile ilgili bilgi vereceğim. Bu bilgiler sizlerin de yardımı ile büyük öğreticiye dönüşebilir. En kısa sürede video eklenecektir.

Gerekenler

Android Studio Android Studio ve SDK araçlarını indirin

Apktool Apktool - Yapı Kılavuzu

il2cpp Dumper by Prefare Perfare/Il2CppDumper

SkidStorm APK SkidStorm for Android - APK herunterladen

DnSpy 0xd4d/dnSpy HxD

Hex Editor HxD ve Disk Editor - Freeware Hex | mh-nexus

Android NDK kurulumu.

C++ ve ASM/ARM bilgisi

Java ve Smali bilgisi

İşleyen bir beyin

  1. İlk Adımlar

İndirilen apk’nin Dosya Adını SkidStorm.apk olarak değiştirin SkidStorm
apk’sını apktool ile derleyin

java -jar apktool.jar d SkidStorm.apk -o SkidStorm

SkidStrom Dump Adlı yeni bir Klasör oluşturun

ve Metadata dosyasını (global-metadata.dat)

SkidStorm\assets\bin\Data\Managed\Metadata

Ve libil2cpp.so’yu

SkidStorm\lib\arm64-v8a’dan alarak il2cpp dosyasını boşaltın

Put her iki dosyayı da SkidStorm Döküm Klasöründe açın ve dosyaları oradaki il2cpp damper zip dosyasından çıkarın.

Şimdi Il2CppDumper.exe’yi çalıştırın Sizden

bir dosya seçmeniz istenecektir. libil2cpp.so’yu seçin
Şimdi bu sefer meta veri dosyasını seçtiğinizde bir dosya seçmeniz
istenecek Bu Oyunun Unity Sürümünü girmeniz istenebilir. Sürümü bilmiyorsanız öğrenmesi kolay.

Burada bulunan Unity_builtin_extra dosyasını açmanız yeterlidir

SkidStorm\assets\bin\Data\Resources

bir Hex Editör ile. HxD kullanıyorum ve bunu arıyorum

image

Bu, Oyunun Unity Versiyonudur.
Sadece ilk iki rakamı koyun. Bu durumda : 2018.2
Şimdi bu kütüphanedeki dosyaları boşaltacak ve kullanacağımız DummyDLLS’yi oluşturacak.
Bu DummyDll’leri DnSpy’da basitçe sürükleyip bırakarak açın.

Şimdi Assembly-Csharp.dll’yi açın

image

Seç -

Artık bu Oyunun tüm C# Sınıflarını göreceksiniz.

Şimdi IsSkinUnlocked’ı Arayın

Üzerine çift tıklayın ve Yöntem Gövdesini göreceksiniz. (il2cpp damper henüz kodu çıkaramadığı için bu gövdelerde herhangi bir kod görmeyeceğinizi merak etmeyin.)

Bunu şimdi görmeliyiz.

image

Bizim için ilginç olan Ofset.

Şimdi size libil2cpp.so dosyasını bir Hex Editor’da açmanızı, ofseti aramanızı ve bu ARM Talimatının baytlarıyla oradaki baytların üzerine yazmanızı söyleyerek bu Eğitimi sonlandırabilirim ( ARM To HEX Converter Online )

MOV x0, #1

RET

==

210080D2C0035FD6

Bunu Tasarruf için libil2cpp.so dosya yerine koyayım

SkidStorm \ lib \ arm64-V8A

apktool ile apk sırtını yeniden derlenerek

SkidStorm -o SkidStormMod.apk b java-jar apktool.jar

üzerine yüklemeden tam o sırada bir test anahtarı ile bunu imzalama ve sizin OBB hilesini kullanarak cihaz (Daha sonra anlatılacaktır).
Ancak bu Eğitimin amacı bu değildir.
Kendi Paylaşılan kitaplığımızı oluşturmak ve lib’i bellekte değiştirmek istiyoruz.
Android Studio’yu açın ve yeni bir Proje oluşturun.

Boş Aktiviteyi Seçin

Projeyi Yapılandırın

Ve Bitir’e tıklayın.
Gradle’ın Projeyi kurmasını bekleyin Tamamlandıysa,
şimdi Proje Görünümünü değiştiriyoruz

ile

Şimdi c++'da lib kodlamasına geçelim app\src\main

altında cpp Adlı Klasör Ekle Bu Klasöre CMakeLists.txt adında bir dosya ekleyeceksiniz Bu dosyayı şimdilik boş bırakın Şimdi build.gradle’ı yapılandıracağız (src klasörünün altında bulunur) Proje Görünümünde) Cmake dosyasını tanımak için.

Şimdi projeye mem.cpp ve mem.h dosyalarını (zip’te bulunabilir)

mem.cpp’yi

src\main\cpp

altına ve mem.h’yi

src\main\cpp\includes altına ekleyin

Ve main adında yeni bir dosya oluşturun .cpp

Şimdi projemizin bu dosyaları tanıması için onları CMakeLists.txt dosyasına eklememiz gerekiyor.

C++:

add_library(

    werewolve //lib name. You can change it to everything you want but for this tutorial I will call it so
   
    SHARED // to create a shared library (.so file)
    main.cpp
    mem.cpp // the cpp files in this projectc
)

set(MAIN_INCLUDES src/main/cpp/includes) //variable for the includes
target_include_directories(werewolve PUBLIC ${MAIN_INCLUDES}) // add the includes (headers) to our lib

Cmake hakkında daha fazla bilgiyi burada bulabilirsiniz CMake Eğitimi | CMake

Projeyi şimdi senkronize edin.
Hiçbir Hata oluşmadığında her şeyi doğru yaptınız. Öğreticiyi tekrar okumazsanız!
Şimdi main.cpp’yi açın ve “includes/mem.h” dosyasını ekleyin
ve doğrudan kodlamaya geçebiliriz.

Peki benim kodum yüklendiğinde nasıl yürütülecek diye sorabilirsiniz.

Bunun için bir kurucu kullanacağız (bunun hakkında daha fazlasını burada bulabilirsiniz attribute((constructor)) ve attribute((destructor)) C - GeeksforGeeks sözdizimleri ) Yama

için pthread (posix thread) kullanacağız

. main.cpp kodu

C++:

void *my_hack_thread(void *) {
  sleep(15);
  while(true){
      memWrite(reinterpret_cast<void *>(getAbsoluteAddress("libil2cpp.so", 0x81680C)), "\x20\x00\x80\xd2\xc0\x03\x5f\xd6", 8);
  }
  return NULL;
}

__attribute__((constructor))
void initializer();

void initializer() {
  pthread_t ptid;
  pthread_create(&ptid, NULL, my_hack_thread, NULL);
}

Kod Açıklama: Verilen adrese while döngüsü yazma baytlarımızı

lib’in doğru bir şekilde yüklendiğinden emin olmak için 15 milisaniye uyuruz . (Bildiğiniz gibi ofset, IsSkinUnlocked’dan aldığımız offset ile aynı. Yazmak için Byte’lar , oyunun kullandığı mimariye bakmak için shell-storm | Online Assembler ve Disassembler’ı kullanın . libil2cpp.so dosyasını arm64 altında bulduğumuzdan beri -v8a AArch64 kullanır

Yazılacak baytların uzunluğu.
Lib çağrıldığında yürütülecek olan Oluşturucumuz.
posix iş parçacığı, böylece baytları yazarsak oyunumuz gecikmeyecek.

Kodunuz şimdi böyle görünmelidir

Şimdi uygulamayı oluşturun.

Yapı Çıktısında hata yoksa, her şeyi doğru yaptınız, tebrikler!

Şimdi, derleme başarılı olduysa, sağ köşede bir kutu görünmelidir.

Bul’a tıklayın
Bunu şimdi görmelisiniz.

Apktool ile apk’yı yeniden derleyin veya WinRar veya başka bir ZIP programı ile açın.

APK Dosyaları ZIP Dosyaları gibidir.

Ve

lib’imizi \lib\arm64-v8a’dan çıkarın

image

Bu dosyayı

SkidStorm\lib\arm64-v8a altındaki SkidStorm klasörüne ekleyin

(Gördüğünüz gibi klasör adları aynı. Önemli çünkü orada başka bir lib kullanırsanız farklı bir mimari ve oyun çökecek)

Şimdi kodu ekliyoruz. lib’imizi yüklemek için SkidStorm’un Java kodunda.

SkidStorm klasörüne gidin ve

VS Code kullanan herhangi bir Metin Düzenleyici Im ile AndroidManifest.xml’i açın

Bunu şimdi görmelisin

Bunun gibi bir şeye dikkat edin

Kod:

<intent-filter>

<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>

</intent-filter>

Bu uygulamada idam edileceği Java kodu göstermek başlayacaktır filtredir

böyle bir şey olmalı bu Üstü

Kod:

<activity android:configChanges="fontScale|keyboard|keyboardHidden|layoutDirection|locale|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" android:label="[USER=84663]@string[/USER]/app_name" android:launchMode="singleTask" android:name="com.cmcm.skidstorm.UnityPlayerActivity" android:screenOrientation="sensorLandscape">

Gördüğünüz gibi android:name=“com.cmcm.skidstorm.UnityPlayerActivity“

Bu, başlangıçta yürütülecek Java kodudur
Şimdi bu dizini smali dosyalarında arayın

Zaman kazanmak için

SkidStorm\smali_classes2\com\cmcm\skidstorm altında bulunur

Orada

UnityPlayerActivity.smali adlı bir dosya görmelisiniz

Bu Java Kaynak Kodu bayt kodu

.dex <------------------------------ —> .smali <--------------------- java kaynak kodu

Bu dosyayı herhangi bir Metin Düzenleyicide açın. Yine VS Code kullanacağım

Şimdi onCreate için ara

Bu Smali kodunu onCreate

const-string v0, “werewolve”

invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String [image]V

altına ekleyin Bu, System.Load(“werewolve)” için Smali kodudur. “);

(lib’ime kurt adam adını verdim. lib’inize verdiğiniz ismi şu şekilde eklemelisiniz)

Şimdi şöyle görünmelidir

Dosyayı kaydedin ve apk’yi yeniden derleyin ve imzalayın.

Şimdi obb numarasına.

Orijinal Apk’yi PlayStore’dan indirin.

İndirme Dosya Explorer açıkken bittikten sonra

ES File kullanarak Im Explorer

git

Android \ obb \

Sen adında bir klasör göreceksiniz

com.immobilegames.skidstorm

isim ver onu ve eklemek 1

Şimdi çağrılmalıdır

com.immobilegames.skidstorm1

kaldırma orjinal APK ve bu oyunun modlu sürümünü yükleyin.

Şimdi obb klasörünü yeniden adlandırın ve kârı artırın.

İmzalama Uygulamaları:

Tek Tıkla Apk İmzalayan… Şimdiye Kadarki En Kolay Apk İmzalama

mem.cpp:

#include "includes/mem.h"

bool ProtectAddress(void* addr, size_t length, int protection) {
    uintptr_t pageStart = _PAGE_START_OF_(addr);
    uintptr_t pageLen = _PAGE_LEN_OF_(addr, length);
    return (
            mprotect(reinterpret_cast<void*>(pageStart), pageLen, protection) != -1
    );
}

/*
* Write to the Memory
*/
bool memWrite(void* addr, const void* buffer, size_t len) {
    if (addr == NULL)
        return false;

    if (buffer == NULL)
        return false;

    if (len < 1 || len > INT_MAX)
        return false;

    if (!ProtectAddress(addr, len, _PROT_RWX_))
        return false;

    if (memcpy(addr, buffer, len) != NULL && ProtectAddress(addr, len, _PROT_RX_))
        return true;

    return false;
}

bool memRead(void* buffer, const void* addr, size_t len) {
    if (addr == NULL)
        return false;

    if (buffer == NULL)
        return false;

    if (len < 1 || len > INT_MAX)
        return false;

    if (memcpy(buffer, addr, len) != NULL)
        return true;

    return false;
}

uintptr_t findLibrary( const char *library) {
    char filename[0xFF] = {0},
         buffer[1024] = {0};
    FILE *fp = NULL;
    uintptr_t address = 0;

    sprintf( filename, "/proc/self/maps");

    fp = fopen( filename, "rt" );
    if( fp == NULL ){
        perror("fopen");
        goto done;
    }

    while( fgets( buffer, sizeof(buffer), fp ) ) {
        if( strstr( buffer, library ) ){
            address = (uintptr_t)strtoul( buffer, NULL, 16 );
            goto done;
        }
    }

    done:

    if(fp){
        fclose(fp);
    }

    return address;
}

uintptr_t getAbsoluteAddress(const char* libraryName, uintptr_t relativeAddr) {
    uintptr_t libMap = findLibrary(libraryName);
    if (libMap == 0)
        return 0;
    return (reinterpret_cast<uintptr_t>(libMap + relativeAddr));
}

mem.h:

#include <stdio.h>
#include <string>
#include <unistd.h>
#include <sys/mman.h>
#include <vector>
#include <pthread.h>

#define _SYS_PAGE_SIZE_ (sysconf(_SC_PAGE_SIZE))

#define _PAGE_START_OF_(x)    ((uintptr_t)x & ~(uintptr_t)(_SYS_PAGE_SIZE_ - 1))
#define _PAGE_END_OF_(x, len) (_PAGE_START_OF_((uintptr_t)x + len - 1))
#define _PAGE_LEN_OF_(x, len) (_PAGE_END_OF_(x, len) - _PAGE_START_OF_(x) + _SYS_PAGE_SIZE_)
#define _PROT_RWX_ (PROT_READ | PROT_WRITE | PROT_EXEC)
#define _PROT_RX_  (PROT_READ | PROT_EXEC)

/*
* Changes protection of an address with given length
*/
bool ProtectAddress(void* addr, size_t length, int protection);

/*
* Writes buffer content to an address
*/
bool memWrite(void* addr, const void* buffer, size_t len);

/*
* Get the Absolute Adress
*/
uintptr_t getAbsoluteAddress(const char* libraryName, uintptr_t relativeAddr);
4 Likes

Sabah detaylı inceleme yapacam.

Eline sağlık

1 Like