ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Unity Game App Hacking (궁수의 전설)
    Mobile/Frida 2019. 12. 18. 06:19

    페이스북같은 곳에서 궁수가 활을 쏘는 게임 광고 한번씩은 보셨을 것이다.

    '궁수의 전설'이라는 Unity Engine기반 게임인데 FRIDA를 이용해서 게임해킹을 한번 해볼까한다.

     

    대부분의 게임 해킹은 App을 직접적으로 변조해서 다시 리패키징하는 방식으로 진행된다.

    이런 방식을 'Modding'이라고 하는데, 이렇게 하는건 별로 마음이 내키지 않았다.

    그래서 App변조가 아닌, FRIDA를 이용해서 동적으로 App을 후킹하는 방식으로 시도해봤다.

     

    우선 시작에 앞서, 궁수의 전설은 싱글 플레이 게임으로 다른 플레이어에게 영향을 끼치지 않는다.

    순위나 경쟁 시스템이 없는 오로지 자신만 즐기는 게임이기 때문에 오해 없길 바란다.

     


    Method Symbol

    궁수의 전설은 il2cpp방식으로 빌드된 게임이다.

    따라서, Global-Metadata파일을 so파일과 Dump하는 방식으로 Method Symbol을 구해야 한다.

    https://github.com/Perfare/Il2CppDumper/releases - il2cpp Dumper

     

    [그림 1] il2cpp Dumping

    사용법은 'il2CppDumper.exe <libil2cpp.so 경로> <global-metadata.dat 경로>'를 입력하면 된다.

    자세한 사용법은 https://py0zz1.tistory.com/150 여기를 참고하길 바란다.

     

    [그림 2] Dump된 Dll파일과 Method Symbol

    Dump를 진행하면 Dll파일들과 Method Symbol파일이 추출된다.

     

    [그림 3] 추출된 Dll파일들

    DummyDll폴더를 확인해보면 굉장히 많은 Dll파일들이 존재하는데, 그 중 'Assembly-CSharp.dll'파일에 우리가 원하는

    Method Symbol정보가 저장되어 있다.

    Assembly-CSharp.dll 파일은 'dnSpy'이라는 툴을 사용하면 쉽게 내용 확인이 가능하다.

     

    dump.cs파일에도 마찬가지로 MethodSymbol이 저장되어 있는데, Assembly-CSharp에서 Third-Party를 제외한

    Custom Method Symbol을 따로 저장한 파일이다. 

    그냥 우리가 원하는 부분을 따로 빼둔 파일이라고 생각하면 편하다.

     


    Hooking Target 선정

    이제 Method Symbol을 확인할 수 있으니 후킹할 타겟을 선정하면 된다.

     

    [그림 4] Dump.cs - GetHPMaxBase( )

    dump.cs파일에서 쓸만한 단어들을 검색해본다. HP, ATK, Damage 등 ...

    처음에는 간단하게 HP를 높여보도록 하자

     

    'GetHPMaxBase( )'라는 Method의 RVA를 확인하고 후킹 스크립트를 작성한다.

    function get_HPBase_hook()
    {
         var il2cpp = Module.getBaseAddress("libil2cpp.so");
        var offset = 0xD91B34
        var get_HPBase = il2cpp.add(offset);    
        
        Interceptor.attach(get_HPBase, 
        {
            onEnter: function(args)
            {
                console.log("[+] get_HPBase Hook In");
            },
            onLeave: function(retVal)
            {
                var HPMAX = retVal.toInt32();
                var New_HP = 9999;
                retVal.replace(New_HP);
                console.log("[*] HPMAX Hooked "+HPMAX+" ->"+New_HP);
                console.log("");
                
            }
        });
    }

    먼저 libil2cpp.so의 Base주소를 Module.getBaseAddress( ) API를 이용해서 얻어온다.

    그리고 GetHPMaxBase( )의 RVA값 '0xD91B34'를 더해서 Hook Point를 잡아준다.

     

    Native Hooking이기 때문에 Interceptor API를 이용해서 타겟 메소드에 Attach 해주면 된다.

    GetHPMaxBase( )는 HP값을 int형으로 반환해주는 함수 이기 때문에, onLeave시점에서 반환값을 바꿔주면 된다.

    여기에서는 한번 9999로 바꿔봤다.

    GIF입니다. 클릭해서 확인해주세요.

    [그림 5] GetHPMaxBase( ) 후킹 - 9999

    캐릭터의 최대 HP를 반환하는 GetHPMaxBase( )를 9999를 반환하도록 후킹한 결과다.

    기존 1554였던 HP가 후킹으로 11003으로 바뀌는 것을 확인할 수 있다.

     

     

    이번엔 공격력도 한번 올려보자

    'GetATKBase( )'라는 Method의 RVA를 확인하고 후킹 스크립트를 작성한다.

    function get_ATKBase_hook()
    {
        var il2cpp = Module.getBaseAddress("libil2cpp.so");
        var offset = 0xD9185C
        var get_Attack = il2cpp.add(offset);    
    
        Interceptor.attach(get_Attack, 
        {
            onEnter: function(args)
            {
                console.log("[+] get_Attack Hook In");
            },
            onLeave: function(retVal)
            {
                var Attack = retVal.toInt32();
                var New_Attack = 9999;
                retVal.replace(New_Attack);
                console.log("[*] ATK Hooked "+Attack+" ->"+New_Attack);
                console.log("");
            }
        });
    }

    똑같이 libil2cpp.so의 Base주소를 알아온 뒤, 확인한 GetATKBase( )의 RVA값 '0xD9185C'를 더해준다.

    이번에도 9999를 반환하도록 했다.

     

    GIF입니다. 클릭해서 확인해주세요.

    [그림 6] GetATKBase( ) 후킹 - 9999

    캐릭터의 공격력을 반환해주는 GetATKBase( )를 항상 9999만 반환하도록 후킹한 결과다.

    기존 308이였던 공격력이 후킹으로 10187이라는 공격력이 되었다.

     


    게임 플레이

    이제 게임을 즐겨볼 차례다!

    실제로 HP와 공격력이 후킹이 되어 적용이 된 것인지 확인해보도록 하자

     

     

    이것으로 Unity Game App 궁수의전설 Hacking을 마치도록 하겠다.

    FRIDA는 하면 할수록 매력적인 것 같다.

    'Mobile > Frida' 카테고리의 다른 글

    FRIDA Hooking (OWASP - UnCrackable2)  (2) 2019.12.22
    Fridump (메모리 덤프)  (1) 2019.12.19
    Runtime Memory Patch  (2) 2019.12.17
    [FRIDA] 실행되지 않는 메소드 호출하기  (0) 2019.10.12
    [FRIDA] App String Trace (모든 문자열 출력)  (0) 2019.10.12

    댓글

Designed by Tistory.