> For the complete documentation index, see [llms.txt](https://twentysick.gitbook.io/twentysick/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://twentysick.gitbook.io/twentysick/sharing/series-phat-minh-lai-cai-banh-xe/windows-native-application/debug-cai-windows-native-application-bang-windbg.md).

# Debug cái Windows Native Application bằng WinDBG

Tuy nhiên, việc debug bằng sử dụng *nativerun* gặp rất nhiều hạn chế .Ví dụ như những thông tin mà phần mềm in ra màn hình sẽ không thể thấy được, những thông tin nhập từ chuột, bàn phím,.... Vậy nên có 1 cách debug khác có thể khắc phục nhược điểm đó là **Remote debugging**.

Để thực hiện **Remote debugging**, mình sẽ sử dụng phần mềm WinDBG của Microsoft.

## Setup

### Tại máy debuggee (debuggee machine).

Copy file cần debug vào thư mục ***C:\Windows\System32***

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FD8XKIz4D8ycGzL6zaQkM%2Fimage.png?alt=media&amp;token=432cf871-3d1d-4a5d-9f59-c2082c3ed45c" alt=""><figcaption></figcaption></figure>

Đăng ký Registry key để thực thi file trong quá trình boot tại `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager`, sửa giá trị *BootExecute* (thêm tên file, không bao gồm định dạng file)

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FTbXcJCctPzmJlqcrmVyB%2Fimage.png?alt=media&amp;token=e9f1dac7-007b-4651-ad89-b640be85c5ce" alt=""><figcaption></figcaption></figure>

Bật chế độ cho phép remote debug.&#x20;

<sub>*Sử dụng Cmd (hoặc Powershell) dưới quyền administrator, thực thi lệnh:*</sub>

{% code overflow="wrap" %}

```bat
bcdedit /debug on
bcdedit /dbgsettings net hostip:<ip host debuggee machine> port:<port>
```

{% endcode %}

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2F6UdNQogZ2bmuqlp8Vc3r%2Fimage21.png?alt=media&amp;token=19150241-8e8e-4775-b548-fa67e6ae5adb" alt=""><figcaption></figcaption></figure>

### Tại máy debugger (debugger machine)

Sử dụng **WinDBG** để thực hiện debug, sau khi mở WinDBG, chọn *File -> Attach to kernel* và điền thông tin Port number, Key, Target IP *(Kết quả của lệnh `bcdedit /dbgsettings net hostip:<ip host debuggee machine> port:<port>` trên debuggee machine)*

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FRqjcLaCS8xw2fFb7u3AV%2Fimage22.png?alt=media&amp;token=7438f7b6-0a12-4cb2-9707-04636a66cd07" alt=""><figcaption></figcaption></figure>

Chọn *Break on connection* và *OK*

## Debugging

*Sau khi setup ở 2 máy xong, thực hiện restart debuggee machine để thực hiện debug*

Khi bắt được connect, đặt breakpoint tại *NtCreateUserProcess* bằng lệnh&#x20;

{% code overflow="wrap" %}

```
bp nt!NtCreateUserProcess
```

{% endcode %}

*(này là sẽ đặt breakpoint ngay tại dòng đầu tiên của NtCreateUserProcess)*

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2Fbb7LiKhiFJmKdz3LW9g8%2Fimage.png?alt=media&amp;token=20e37a68-9363-4051-abd7-8adfc8f76f35" alt=""><figcaption></figcaption></figure>

Sau đó tiếp tục chạy, khi dừng tại breakpoint đã set tại hàm *NtCreateUserProcess*, chạy *Step Out* để thực thi xong API (lúc này mới chỉ là khởi tạo chứ chưa thực thi tiến trình) và kiếm tra xem Process nào vừa được tạo.

*Lệnh:*

* *Tiếp tục thực thi: g*
* *Step Out: gu*
* *Show các Process được tạo: !process 0 0*

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2Fzv2u1YHlVnuKrpcYWdQK%2Fimage.png?alt=media&amp;token=56663448-1670-4b9a-bf66-275b49af08fc" alt=""><figcaption></figcaption></figure>

Tiếp tục cho đến khi thấy khởi tạo tiến trình thực thi file đã đăng ký trong Registry Key

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2Fwbs8BfL8Gqlmjv1rdDMi%2Fimage.png?alt=media&amp;token=47d7d58a-7df6-46c0-9b43-6c91d7076df8" alt=""><figcaption></figcaption></figure>

Tiến hành đọc thông tin Process của file

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FWrdinNn32fTZxQVzNFRl%2Fimage.png?alt=media&amp;token=1f6604cf-7e85-457c-92cc-6435314a0728" alt=""><figcaption></figcaption></figure>

Thấy được *ImageBaseAddress* của Process là *0x00007ff600ce0000*

Tiếp tục đọc thông tin tại địa chỉ đó bằng lệnh:

{% code overflow="wrap" %}

```
!dh 0x00007ff600ce0000
```

{% endcode %}

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FlG9ZvhMGXSoGvxE6X339%2Fimage27.png?alt=media&amp;token=3b52b800-cc78-43ce-a7fe-3dc7e916ea7a" alt=""><figcaption></figcaption></figure>

Đọc thông tin, thấy được address of entry point là *0x1000*, image base là *0x00007ff600ce0000*.&#x20;

Tiến hành đặt Breakpoint tại EntryPoint bằng lệnh (Hardware Breakpoint):

{% code overflow="wrap" %}

```
ba e 1 <image base> + <address of entry point>
```

{% endcode %}

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2Fc5EVjJeTmjOzp4mREUL2%2Fimage.png?alt=media&amp;token=ac670a10-3ad5-426b-ab41-e2b11d44d935" alt=""><figcaption></figcaption></figure>

Tiếp tục chạy, khi dừng lại tại breakpoint vừa set, tuy nhiên WinDBG sẽ chưa hiện dữ liệu trên vùng memory này

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2F41jVXv8BzRhntapKsQXs%2Fimage.png?alt=media&amp;token=6e158e9d-a174-43f8-aaa1-76ec9c7ba1e7" alt=""><figcaption></figcaption></figure>

Và để mọi thứ hiện lên, chỉ cần *Step Into* 1 lần

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FAQYQCg0iOINfYksdC3Aq%2Fimage.png?alt=media&amp;token=562884dc-0019-4e9d-875a-a46ec6e79b39" alt=""><figcaption></figcaption></figure>

Đối chiếu với code được Decompile bằng IDA, có thể thấy được debugger hiện đã đang thực hiện debug chương trình *HelloWorld.exe*

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2F5xDUhcSSa4r7tD2ofh5f%2Fimage.png?alt=media&amp;token=1dd5c1a0-85fa-4e7f-b5c5-3301f1d521a1" alt=""><figcaption></figcaption></figure>

Khi tới đây, sẽ tiếp tục tiến hành debug và đối chiếu liên tục với IDA

* Thực hiện xong API đầu tiên

  * WinDBG kiểu

  <figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2Fkl7ebCRzN1HKq2pZonf1%2Fimage.png?alt=media&amp;token=3c15a686-f0bb-4b23-8fae-707e006dfd68" alt=""><figcaption></figcaption></figure>

  * IDA kiểu

  <figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FP6iX5u999PYAyEQFZDRe%2Fimage.png?alt=media&amp;token=eec1c4af-59c8-4265-9667-84457d95cb27" alt=""><figcaption></figcaption></figure>

  * Debuggee Machine kiểu

  <figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FKVHJbedvuz3nI3oGi5xI%2Fimage34.png?alt=media&amp;token=ad6082eb-450d-47b3-9a6b-7bcd910038cc" alt=""><figcaption></figcaption></figure>
