macOS Kernel Development Kit로 커널 디버깅해보기 (Debugging kernel using macOS KDK)

    필자 사용환경(My Environemnt):
    macOS 14.4 (Hackintosh) 1 Device


    두 대의 맥이 필요한데 없으므로, 해킨토시 노트북에서 Vmware Fusion으로 가상 맥을 구현하여 KDK를 실습해보려 한다.
    Required 2 Mac computer, but since I have only one hackintosh laptop, so going to build environemnt with Vmware Fusion.

    카탈리나 10.15.7 버전을 선택하였다.
    I chose macOS Catalina 10.15.7, and…

    타겟에서의 과정은 다음과 같다.
    Process in target is like below.

    1. 먼저 빌드 번호를 확인해서 알맞은 KDK를 다운받는다.
    필자는 카탈리나 최종 빌드넘버인 19H2026이기에,
    Kernel Debug Kit 10.15.7 build 19H1824를 선택해서 설치하였다.

    1. First, Check build number and download appropriate KDK.
    I’m using Final version of Catalina which build number is 19H2026,
    so I installed Kernel Debug Kit 10.15.7 (build 19H1824)

    2. 리커버리 모드에 진입해서 SIP를 비활성화한다.
    설치를 하고나면 재부팅중에 Command+R키를 누르고있다보면 리커버리모드로 진입한다.
    여기서 유틸리티 > 터미널에서 csrustil disable 명령어를 입력하면 SIP를 비활성화시킬 수 있다.
    그런다음, 재부팅을 진행한다.

    2. Entering recovery mode and disable SIP.
    When reboot and keep pressing Command+R shortcuts, you can go to recovery mode.
    Entering Utilities > Terminal, and enter command csrutil disable. then, SIP disabled.

    3. 아래 명령어를 차례대로 입력해주고 재부팅한다. (환경에 따라 상이할 수 있음)

    3. Input these below commands and reboot. (Can be different by environemnt)

    $ sudo mount -u -w /
    $ sudo cp /Library/Developer/KDKs/KDK_10.15.7_19H1824.kdk/System/Library/Kernels/kernel.development /System/Library/Kernels
    $ sudo kextcache -invalidate /Volumes/Macintosh\ HD 
    $ sudo nvram boot-args=”debug=0x141 kext-dev-mode=1 kcsuffix=development pmuflags=1 -v”
    (사진에 있는 nvram 명령어로는 제대로 작동안해서 수정했습니다.)
    $ sudo reboot

    그러면 Verbose 모드로 부팅되면서 디버거가 attach될때까지 대기한다.
    Then, it boots with verbose mode and waiting until attach debuggers.

    만약 부팅해서 uname -a 명령어로 확인해보면, DEVELOPEMENT 빌드로 부팅된 것을 확인할 수 있다!
    If booted and check command with uname -a, you can check that it booted with DEVELOPMENT build!

    여기까지 타겟의 준비과정은 끝났다.
    This is the end of target process.

    이제 호스트의 준비과정에 대해 살펴보면,
    타겟에서 설치했던 버전의 KDK를 설치해주고,
    Now, let’s take a look at process of host.
    Install same version of KDK that previously installed in target.

    아래 명령어로 접속해서 디버거를 attach 해주면 된다.
    Input these commands and attach debuggers.
    $ lldb
    $ (lldb) target create /Library/Developer/KDKs/KDK_10.15.7_19H1824.kdk/System/Library/Kernels/kernel.development
    $ (lldb) kdp-remote 192.168.209.136

    주의할점은 커널을 실행한 후부터는 커널을 다시는 멈출 수 없기에 미리 브레이크포인트를 설치해주어야 된다.
    One of important things is that, if you resume kernel, then it cannot be stopped. so, needed to be install breakpoint before resume.


    target $ sysctl kern.singleuser

    host $ (lldb) b sysctl_singleuser

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다