<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Codetronik</title>
    <link>https://codetronik.tistory.com/</link>
    <description>리버스 엔지니어링과 개발을 좋아합니다.
https://github.com/codetronik</description>
    <language>ko</language>
    <pubDate>Sun, 16 Aug 2026 10:57:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Codetronik</managingEditor>
    <image>
      <title>Codetronik</title>
      <url>https://t1.daumcdn.net/cfile/tistory/194CAA395076BC892F</url>
      <link>https://codetronik.tistory.com</link>
    </image>
    <item>
      <title>gdb static aarch64</title>
      <link>https://codetronik.tistory.com/287</link>
      <description>&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ca4ZMS/dJMcagZzznA/LmRffWclCZGEKO42LR53t1/gdb.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;gdb.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;11.93MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/TRSb5/dJMcah5hYJS/4GvpaLKwh0I7RPhtlwB7tk/gdbserver?attach=1&amp;amp;knm=tfile.dat&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;gdbserver&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.57MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Android Linux</category>
      <author>Codetronik</author>
      <guid isPermaLink="true">https://codetronik.tistory.com/287</guid>
      <comments>https://codetronik.tistory.com/287#entry287comment</comments>
      <pubDate>Sun, 26 Apr 2026 16:06:04 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 실행 파일(.exe) 빌드방법</title>
      <link>https://codetronik.tistory.com/286</link>
      <description>&lt;pre id=&quot;code_1767920328014&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Users\user\AppData\Local\Android\Sdk\ndk\27.2.12479018\toolchains\llvm\prebuilt\windows-x86_64\bin&amp;gt;aarch64-linux-android30-clang++.cmd -static-libstdc++ -o hello 1.cpp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Android Linux</category>
      <author>Codetronik</author>
      <guid isPermaLink="true">https://codetronik.tistory.com/286</guid>
      <comments>https://codetronik.tistory.com/286#entry286comment</comments>
      <pubDate>Fri, 9 Jan 2026 09:59:36 +0900</pubDate>
    </item>
    <item>
      <title>커널 모듈을 통한 syscall 후킹 가이드</title>
      <link>https://codetronik.tistory.com/285</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;OS 보안 기능으로 인해 커널 메모리의 후킹이나 수정이 제한되므로, 해당 보안 기능을 비활성화한 OS를 직접 빌드하여 설치해야 한다.&lt;br /&gt;이 가이드는 특정 단말기를 예시로 설명하고 있지만, 엑시노스 칩셋을 사용하는 다른 삼성 기기들도 얼마든지 적용이 가능하다. 리니지OS 홈페이지에서 본인의 모델을 검색해 ZIP 파일을 다운로드한 뒤, 아래와 같은 순서로 시도하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비물&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;OS : Ubuntu 24.03 LTS&lt;br /&gt;단말기 : 갤럭시 S6 LITE (OEM 잠금 해제 된)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;진행 순서&lt;br /&gt;1. 태블릿에 공식 리니지 OS 설치&lt;br /&gt;2. 리눅스에서 리니지 OS 빌드&lt;br /&gt;- 커널 버전이 높을수록 적용된 보안 기능이 많아지므로, 가능한 한 낮은 커널 버전(필자가 설치한 롬은 4 버전 커널) 을 사용하여 진행한다. &lt;br /&gt;3. 태블릿에 빌드한 리니지 OS 설치 &lt;br /&gt;4. 크로스 컴파일러로 커널 빌드 &lt;br /&gt;5. syscall 후킹 lkm 빌드&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 태블릿에 공식 리니지 OS 설치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;드라이버 설치 후 재부팅 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;a href=&quot;https://github.com/daynix/usbdk/releases/latest&quot;&gt;https://github.com/daynix/usbdk/releases/latest&lt;/a&gt;&lt;br /&gt;heimdall :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://blob.lineageos.org/downloads/heimdall/Heimdall-Windows-v2.2.2-120625.zip&quot;&gt;https://blob.lineageos.org/downloads/heimdall/Heimdall-Windows-v2.2.2-120625.zip&lt;/a&gt;&lt;br /&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;전원을 끈 후, 볼륨 상 + 볼륨 하를 동시에 누르면서, 1초후에 usb를 연결하고, 볼륩 상을 눌러 다운로드 모드에 진입한다.&lt;br /&gt;3. &lt;a href=&quot;https://b4.timschumi.net/lineage-archive/lineage-20.0-20240629-nightly-gta4xlwifi-signed.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://b4.timschumi.net/lineage-archive/lineage-20.0-20240629-nightly-gta4xlwifi-signed.zip&lt;/a&gt;&amp;nbsp;다운로드&lt;br /&gt;4. zip을 해제한 후, recovery.img 설치&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767101373858&quot; class=&quot;cpp&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;heimdall flash --RECOVERY recovery.img&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;5. 위 명령어를 실행하면 바로 재부팅이 되는데, 볼륨 상 + 파워를 길게 눌러 리커버리 모드 진입&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;6.&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Factory Reset -&amp;gt; 3개 전부 실행&lt;br /&gt;7.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;메인 메뉴로 이동 후 Apply update-&amp;gt; apply from adb 후 아래 명령어 실행&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767101373858&quot; class=&quot;cpp&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;adb -d sideload lineage-20.0-20240629-nightly-gta4xlwifi-signed.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;8. 재부팅 후, 개발자 옵션에서(설정 -&amp;gt; 시스템에 위치) adb 디버깅 enable 및 디버깅 시 루트 권한 사용 enable&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 리눅스에서 리니지 OS 빌드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767060325698&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get install python-is-python3 brotli repo adb bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick protobuf-compiler python3-protobuf lib32readline-dev lib32z1-dev libdw-dev libelf-dev libgnutls28-dev lz4 libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev
$ wget https://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2_amd64.deb &amp;amp;&amp;amp; sudo dpkg -i libtinfo5_6.3-2_amd64.deb &amp;amp;&amp;amp; rm -f libtinfo5_6.3-2_amd64.deb
$ wget https://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libncurses5_6.3-2_amd64.deb &amp;amp;&amp;amp; sudo dpkg -i libncurses5_6.3-2_amd64.deb &amp;amp;&amp;amp; rm -f libncurses5_6.3-2_amd64.deb
$ git config --global user.email &quot;abc@lol.com&quot;
$ git config --global user.name &quot;kim kim&quot;
$ mkdir -p ~/android/lineage
$ export USE_CCACHE=1
$ export CCACHE_EXEC=/usr/bin/ccache
$ echo 'ccache -M 50G' &amp;gt;&amp;gt; ~/.bashrc
$ source ~/.bashrc
$ cd ~/android/lineage
$ repo init -u https://github.com/LineageOS/android.git -b lineage-20.0 --git-lfs --no-clone-bundle
$ repo sync
$ source build/envsetup.sh
$ croot
$ breakfast gta4xlwifi # 빌드 중 오류 발생은 당연함. 무시하고 아래 명령어 실행
$ cd ~/android/lineage/device/samsung/gta4xlwifi
$ ./extract-files.sh
$ cd ~/android/lineage
$ breakfast gta4xlwifi # 여기서 빌드 오류가 발생하면 안됨
# 보안 기능 off
$ sed -i \
-e 's/CONFIG_EXYNOS_KERNEL_PROTECTION=y/CONFIG_EXYNOS_KERNEL_PROTECTION=n/' \
-e 's/CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y/CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=n/' \
-e 's/CONFIG_STRICT_KERNEL_RWX=y/CONFIG_STRICT_KERNEL_RWX=n/' \
-e 's/CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y/CONFIG_ARCH_HAS_STRICT_MODULE_RWX=n/' \
-e 's/CONFIG_STRICT_MODULE_RWX=y/CONFIG_STRICT_MODULE_RWX=n/' \
-e 's/CONFIG_EXYNOS_CONTENT_PATH_PROTECTION=y/CONFIG_EXYNOS_CONTENT_PATH_PROTECTION=n/' \
-e 's/CONFIG_HAVE_ARCH_SECCOMP_FILTER=y/CONFIG_HAVE_ARCH_SECCOMP_FILTER=n/' \
~/android/lineage/kernel/samsung/gta4xl/arch/arm64/configs/exynos9611-gta4xlwifi_defconfig
# 보안 기능 삭제 (https://codetronik.tistory.com/155)
$ sed -i -e '/struct vm_struct \*area;/ s/^/\/\//' \
-e '/area = find_vm_area/,/return -EINVAL;/ s/^/\/\//' \
~/android/lineage/kernel/samsung/gta4xl/arch/arm64/mm/pageattr.c
$ croot
$ brunch gta4xlwifi
$ cd $OUT # 출력 파일 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;br /&gt;3. 태블릿에 빌드한 리니지 OS 설치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;1. &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;드라이버 설치 후 재부팅 : &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;a href=&quot;https://github.com/daynix/usbdk/releases/latest&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/daynix/usbdk/releases/latest&lt;/a&gt;&lt;br /&gt;heimdall : &lt;a href=&quot;https://blob.lineageos.org/downloads/heimdall/Heimdall-Windows-v2.2.2-120625.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blob.lineageos.org/downloads/heimdall/Heimdall-Windows-v2.2.2-120625.zip&lt;/a&gt;&lt;br /&gt;2. &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;전원을 끈 후, 볼륨 상 + 볼륨 하를 동시에 누르면서, 1초후에 usb를 연결하고, 볼륩 상을 눌러 다운로드 모드에 진입한다.&lt;br /&gt;3. 빌드 한 recovery.img 설치&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767069160113&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;heimdall flash --RECOVERY recovery.img --no-reboot&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 재부팅을 위해&amp;nbsp; &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;볼륨 하 + 파워를 8~10초간 누르고 있다가 손 뗌&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;5. 재부팅 되면 볼륨 상 + 파워를 길게 눌러 리커버리 모드 진입&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;6.&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Factory Reset -&amp;gt; 3개 전부 실행&lt;br /&gt;7. &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;메인 메뉴로 이동 후 Apply update-&amp;gt; apply from adb 후 아래 명령어 실행&lt;br /&gt;&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767070128546&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; adb -d sideload lineage-20.0-20251230-UNOFFICIAL-gta4xlwifi.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. gapps 다운로드 &lt;a href=&quot;https://github.com/MindTheGapps/13.0.0-arm64/releases/download/MindTheGapps-13.0.0-arm64-20231025_200931/MindTheGapps-13.0.0-arm64-20231025_200931.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/MindTheGapps/13.0.0-arm64/releases/download/MindTheGapps-13.0.0-arm64-20231025_200931/MindTheGapps-13.0.0-arm64-20231025_200931.zip&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767070254808&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; adb -d sideload MindTheGapps-13.0.0-arm64-20231025_200931.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 재부팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4. 크로스 컴파일러로 커널 빌드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767088424533&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd ~
git clone https://github.com/Shubhamvis98/toolchains
export PATH=&quot;/home/code/toolchains/clang-r428724/bin:/home/code/toolchains/aarch64-linux-android-4.9/bin:$PATH&quot;
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
export CLANG_TRIPLE=aarch64-linux-gnu-
cd ~/android/lineage/kernel/samsung/gta4xl 
make clean
make mrproper
make exynos9611-gta4xlwifi_defconfig
make menuconfig  -&amp;gt; 실행 후 &amp;lt;Save&amp;gt; 클릭
make -j16 CC=clang&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;커널 소스 수정 (오류 발생 시)&lt;/p&gt;
&lt;pre id=&quot;code_1767088545554&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 파일 내 모든 &quot;/drivers/misc/tzdev/&quot;를 &quot;drivers/misc/tzdev/&quot;로 변경
sed -i 's|&quot;/drivers/misc/tzdev/|&quot;drivers/misc/tzdev/|g' drivers/misc/tzdev/tz_deploy_tzar.c&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt; &lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;5. syscall 후킹 lkm 빌드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;아래 2개의 파일을 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767101149038&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Makefile
hook-objs := main.o
obj-m += hook.o

KERNEL_PATH := ~/android/lineage/kernel/samsung/gta4xl
CCPATH := /home/code/toolchains/clang-r428724/bin:/home/code/toolchains/aarch64-linux-android-4.9/bin
ARCH=arm64

export PATH := ${CCPATH}:${PATH}
export CLANG_TRIPLE = aarch64-linux-gnu-
export CROSS_COMPILE = aarch64-linux-android-

all:
	make CC=clang ARCH=$(ARCH) CFLAGS=$(CFLAGS) -C $(KERNEL_PATH) M=$(PWD) modules -j$(nproc --all)

clean:
	make -C $(KERNEL_PATH) M=$(PWD) clean&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1767101240946&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// main.c
#include &amp;lt;linux/kernel.h&amp;gt;
#include &amp;lt;linux/module.h&amp;gt;
#include &amp;lt;linux/ftrace.h&amp;gt; // kallsyms_lookup_name()
#include &amp;lt;linux/uaccess.h&amp;gt; // copy_to_user()
#include &amp;lt;linux/slab.h&amp;gt;
#include &amp;lt;asm/set_memory.h&amp;gt;
#include &amp;lt;linux/nls.h&amp;gt;
#include &quot;util.h&quot;

MODULE_AUTHOR(&quot;codetronik&quot;);
MODULE_LICENSE(&quot;GPL&quot;);
MODULE_VERSION(&quot;1.0&quot;);
MODULE_DESCRIPTION(&quot;Anti Android Root Detector&quot;);

u64 *sys_call_table;

typedef asmlinkage int (*_original_faccessat)(int dfd, const char __user *filename, int mode);
_original_faccessat org_faccessat;

static int (*p_set_memory_rw)(unsigned long, int);

asmlinkage int hook_faccessat(int dfd, const char __user *filename, int mode)
{
	pr_info(&quot;[CODETRONIK] hello&quot;);
	return org_faccessat(dfd, filename, mode);
}

int init_module(void)
{
	sys_call_table = (u64*)kallsyms_lookup_name(&quot;sys_call_table&quot;);	
	pr_info(&quot;[CODETRONIK] syscall table %016lx&quot;, sys_call_table);
	p_set_memory_rw = (void*)kallsyms_lookup_name(&quot;set_memory_rw&quot;);
	p_set_memory_rw((unsigned long)sys_call_table, 1);
		
	org_faccessat = (_original_faccessat)sys_call_table[__NR_faccessat];
	sys_call_table[__NR_faccessat] = (u64)hook_faccessat;
	return 0;
}

void cleanup_module(void)
{
	sys_call_table[__NR_faccessat] = (u64)org_faccessat;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 및 모듈 설치 방법&lt;/p&gt;
&lt;pre id=&quot;code_1767309313069&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ make
$ adb root
$ adb push hook.ko /data/local/tmp
gta4xlwifi:/ $ adb shell
gta4xlwifi:/ $ insmod /data/local/tmp/hook.ko&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 모듈이 설치되었으면, dmesg로 로그를 확인할 수 있다.&lt;/p&gt;</description>
      <category>Android Linux/Rooting</category>
      <author>Codetronik</author>
      <guid isPermaLink="true">https://codetronik.tistory.com/285</guid>
      <comments>https://codetronik.tistory.com/285#entry285comment</comments>
      <pubDate>Tue, 30 Dec 2025 11:39:36 +0900</pubDate>
    </item>
    <item>
      <title>[2025/12 new!] Galaxy Tab S6 Lite 리니지OS 설치</title>
      <link>https://codetronik.tistory.com/284</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://download.lineageos.org/gta4xlwifi&quot;&gt;https://download.lineageos.org/gta4xlwifi&lt;/a&gt;&lt;/span&gt;&lt;span&gt;에서 &lt;span style=&quot;color: oklab(0 0 0 / 0.85); text-align: start;&quot;&gt;recovery.img&lt;/span&gt;&amp;nbsp; 및 &lt;span style=&quot;color: oklab(0 0 0 / 0.85); text-align: start;&quot;&gt;lineage-23.0-20251213-nightly-gta4xlwifi-signed.zip&lt;/span&gt; 다운로드&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이미 oem언락 된 상태라면 1~3 과정은 생략&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;adb 디버그 허용, oem 언락 허용(빌드버전 연타하면 나옴)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 파워 off 후 볼륨 상 + 볼륨 하(One UI 3.0이상,보통 안드로이드11버전)를 동시에 누르면서, 1초후에 usb를 연결한다. (연결되어있는 상태면 안되고 타이밍 맞게 연결해줘야됨) 잠시 후 다운로드 모드로 진입하게 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;볼륨상을 길게 눌러 부트로더 언락을 진행한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 초기화 완료되면 다시 빌드버전 연타한 후 oem이 언락되어 있는지 확인&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;4. 2번처럼 한 후에 언락이 아닌 볼륨 업을 한번만 누른 후 다운로드 모드로 진입.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;5. odin 3.14.1 다운로드 및 실행&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;6. AP에 recovery.tar 지정 (7zip으로 recovery.tar로 압축) 및 start&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;7. 기존 설치된 OS로 재부팅되면, 다운로드 모드로 재 진입&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;8. 볼륨 하 + 전원 7초간 눌러 강제 재부팅 -&amp;gt; 화면 꺼지자마자 볼륨 상 + 전원으로 바꿔 누르기 -&amp;gt; 삼성 로고 나오면 전원 키 떼고 볼륨 상 유지.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Tip: OS 사용중, 리커버리 모드로 부팅하고 싶다면 전원 끄기 -&amp;gt;&amp;nbsp; &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;볼륨 상 + 전원 누르기 -&amp;gt; 삼성 로고 나오면 전원 키 떼고 볼륨 상 유지.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;9. Factory Reset -&amp;gt; 3개 전부 실행&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;10. 메인 메뉴로 이동 후 Apply update-&amp;gt; apply from adb 선택 후 cmd 실행&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;adb sideload &lt;span style=&quot;background-color: #ffffff; color: oklab(0 0 0 / 0.85); text-align: start;&quot;&gt;lineage-23.0-20251213-nightly-gta4xlwifi-signed.zip&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;adb sideload MindTheGapps-16.0.0-arm64-20250812_214353.zip (&lt;a href=&quot;https://wiki.lineageos.org/gapps/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wiki.lineageos.org/gapps/&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;에서 다운로드)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;adb sidelaod Magisk-v30.6.zip (&lt;a href=&quot;https://github.com/topjohnwu/Magisk/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/topjohnwu/Magisk/releases&lt;/a&gt; 에서 최신 버전 apk 다운로드 후, 확장자를 zip으로 변경)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;adb shell에서만 su가 필요하다면, Magisk를 설치하지 말고 개발자 옵션에서 &quot;디버깅 시 루트 권한 사용&quot; 체크 후 adb root -&amp;gt; adb shell로 접속&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;11. 재부팅&lt;/p&gt;</description>
      <category>Android Linux/Rooting</category>
      <author>Codetronik</author>
      <guid isPermaLink="true">https://codetronik.tistory.com/284</guid>
      <comments>https://codetronik.tistory.com/284#entry284comment</comments>
      <pubDate>Mon, 15 Dec 2025 15:13:00 +0900</pubDate>
    </item>
    <item>
      <title>[folly] 구축 및 로그 예제</title>
      <link>https://codetronik.tistory.com/281</link>
      <description>&lt;pre id=&quot;code_1761884481924&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone https://github.com/microsoft/vcpkg C:\vcpkg
cd vcpkg
bootstrap-vcpkg.bat
vcpkg integrate install
vcpkg install folly:x64-windows
vcpkg install folly:x64-windows --head&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1761891490936&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;folly/portability/Windows.h&amp;gt;
#include &amp;lt;folly/init/Init.h&amp;gt;
#include &amp;lt;folly/logging/Init.h&amp;gt;
#include &amp;lt;folly/logging/xlog.h&amp;gt;
#include &amp;lt;folly/logging/StreamHandlerFactory.h&amp;gt;
#include &amp;lt;folly/logging/FileHandlerFactory.h&amp;gt;
#include &amp;lt;print&amp;gt;

int main(int argc, char** argv)
{
	SetConsoleOutputCP(CP_UTF8);

	folly::Init init(&amp;amp;argc, &amp;amp;argv);

	auto&amp;amp; db = folly::LoggerDB::get();
	db.registerHandlerFactory(std::make_unique&amp;lt;folly::StreamHandlerFactory&amp;gt;(), true);
	db.registerHandlerFactory(std::make_unique&amp;lt;folly::FileHandlerFactory&amp;gt;(), true);

	try {
		folly::initLogging(R&quot;JSON(
			{
				&quot;handlers&quot;: {
					&quot;hconsole&quot;: {
						&quot;type&quot;: &quot;stream&quot;,
						&quot;options&quot;: {
							&quot;stream&quot;: &quot;stderr&quot;,
							&quot;formatter&quot;: &quot;glog&quot;
						}
					},
					&quot;hfile&quot;: {
						&quot;type&quot;: &quot;file&quot;,
						&quot;options&quot;: {
							&quot;path&quot;: &quot;logs/myapp_{Y}{m}{d}_{H}{M}{S}.log&quot;,
							&quot;formatter&quot;: &quot;glog&quot;,
							&quot;level&quot;: &quot;INFO&quot;,
							&quot;max_file_size&quot;: 10485760,
							&quot;max_files&quot;: 30,
							&quot;buffer_size&quot;: 1048576,
							&quot;append&quot;: true,
							&quot;timestamp_precision&quot;: &quot;millisecond&quot;
						}
					}
				},
				&quot;categories&quot;: {
					&quot;.&quot;: {
						&quot;level&quot;: &quot;DBG&quot;,
						&quot;handlers&quot;: [
							&quot;hconsole&quot;, 
							&quot;hfile&quot;
						]
					}
				}
			}
		)JSON&quot;);
	}
	catch (const std::exception&amp;amp; ex) {
		std::println(stderr, &quot;[log-init] {}&quot;, ex.what());
		return -1;
	}

	XLOG(INFO) &amp;lt;&amp;lt; &quot;info&quot;;
	XLOGF(INFO, &quot;formatted info={}&quot;, 1000);
	XLOG(DBG) &amp;lt;&amp;lt; &quot;debug&quot;;
	XLOG(WARN) &amp;lt;&amp;lt; &quot;warning&quot;;
	XLOG(ERR) &amp;lt;&amp;lt; &quot;error&quot;;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성 속성 -&amp;gt; C/C++ -&amp;gt;&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;1. -&amp;gt; 전처리기 -&amp;gt; 전처리기 정의 -&amp;gt; GLOG_USE_GLOG_EXPORT&lt;br /&gt;2. -&amp;gt; 외부 include 지시문 -&amp;gt; 외부 헤더 경고 수준 -&amp;gt; 모든 경고 해제(/external:W0)&lt;br /&gt;3. -&amp;gt; 명령줄 - &amp;gt; /utf-8 추가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/C++</category>
      <author>Codetronik</author>
      <guid isPermaLink="true">https://codetronik.tistory.com/281</guid>
      <comments>https://codetronik.tistory.com/281#entry281comment</comments>
      <pubDate>Fri, 31 Oct 2025 15:26:13 +0900</pubDate>
    </item>
    <item>
      <title>[01] 윈도우 커널 드라이버 개발 via C++ STL</title>
      <link>https://codetronik.tistory.com/280</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 새 프로젝트 만들기 &amp;rarr; Empty WDM Driver&lt;br /&gt;2. 프로젝트 생성 후 .inf 파일 삭제&lt;br /&gt;3. 프로젝트에 main.cpp 추가&lt;br /&gt;4. IDE &amp;rarr; 보기 &amp;rarr; 다른 창 &amp;rarr; 속성 관리자 클릭&lt;br /&gt;5. Debug | x64 선택 후 우 클릭 &amp;rarr; 새 프로젝트 속성 시트 추가 &amp;rarr; 속성 시트(.props) 추가&lt;br /&gt;6. 추가 한 속성 시트 우 클릭 &amp;rarr; 속성 클릭&lt;br /&gt;7. 공용 속성 &amp;rarr; 사용자 매크로 &amp;rarr; 매크로 추가&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이름 : DisableKernelFlag &lt;br /&gt;값 : true&lt;br /&gt;&lt;/span&gt;8. 프로젝트 &amp;rarr;&amp;nbsp; 속성 &amp;rarr; 구성 속성 &amp;rarr; C/C++ &amp;rarr; 코드 생성 &amp;rarr; C++ 예외 처리 가능 &amp;rarr; 예(/EHsc)&lt;br /&gt;9. 프로젝트 &amp;rarr;&amp;nbsp; 속성 &amp;rarr; 구성 속성 &amp;rarr; 일반&amp;nbsp; &amp;rarr; C++ 언어 표준 &amp;rarr; 미리 보기 - ISO C++23 표준&lt;br /&gt;10. x64 Native Tools Command Prompt for VS 2022 실행&lt;br /&gt;11. vcrtl 다운로드 및 vcrtl 프로젝트 실행&lt;/p&gt;
&lt;pre id=&quot;code_1760664016234&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone https://github.com/avakar/vcrtl
cd vcrtl
cmake .
vcrtl.sln&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. vcrtl 프로젝트 &amp;rarr;&amp;nbsp; 속성 &amp;rarr; 구성 속성 &amp;rarr; 일반&amp;nbsp; &amp;rarr; C++ 언어 표준 &amp;rarr; 미리 보기 - ISO C++23 표준&lt;br /&gt;13. vcrtl 빌드 및 산출물 .lib을 내 프로젝트에 복사&lt;br /&gt;14. 내&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;프로젝트 &amp;rarr;&amp;nbsp; 속성 &amp;rarr; 구성 속성 &amp;rarr;&lt;span&gt; 링커 &amp;rarr; 입력 &amp;rarr; 추가 종속성 &amp;rarr; vcrtl_driver.lib&lt;br /&gt;15. main.cpp 작성 및 빌드&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1760654607053&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;ntifs.h&amp;gt;

EXTERN_C VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
	UNREFERENCED_PARAMETER(DriverObject);
}

EXTERN_C NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegPath)
{

	UNREFERENCED_PARAMETER(RegPath);
	DriverObject-&amp;gt;DriverUnload = DriverUnload;

	try {
		throw 1;
	}
	catch (int i) {
		KdPrint((&quot;catch&quot;);
	}

	return STATUS_SUCCESS;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Windows/Kernel Driver</category>
      <author>Codetronik</author>
      <guid isPermaLink="true">https://codetronik.tistory.com/280</guid>
      <comments>https://codetronik.tistory.com/280#entry280comment</comments>
      <pubDate>Fri, 17 Oct 2025 08:30:04 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio 2022 커널 드라이버 템플릿 소개</title>
      <link>https://codetronik.tistory.com/278</link>
      <description>&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 295px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 21px;&quot;&gt;제목&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 21px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;Empty Static Library for Drivers (Universal)&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;유니버설 드라이버용 정적 드라이버 라이브러리를 만들기 위한 빈 프로젝트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;WinUSB Application (Universal)&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;USB 장치에 액세스하기 위한 유니버설 애플리케이션 스켈레톤&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;Kernel Mode Driver, USB (KMDF)&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;Kernel-Mode Driver Framework(KMDF)를 사용하는 USB 장치 프로젝트. 기본값으로 유니버설 드라이버로 빌드됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;Filter Driver: NDIS&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;NDIS 필터 드라이버용 프로젝트. 기본값으로 유니버설 드라이버로 빌드됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;User Mode Driver, USB (UMDF v2)&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;User-Mode Driver Framework v2(UMDF2)를 사용하는 USB 장치 프로젝트. 기본값으로 유니버설 드라이버로 빌드됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;Driver Install Package&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;하나 이상의 드라이버 프로젝트에서 생성된 드라이버 파일을 포함하는 드라이버 패키지를 만드는 프로젝트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;WinUSB INF Driver Package&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;USB 장치에 WinUSB를 로드하는 데 사용할 수 있는 .INF 파일을 드라이버 패키지에 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;Kernel Mode Driver (KMDF)&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;Kernel-Mode Driver Framework(KMDF)를 사용하는 기본 프로젝트. 기본값으로 유니버설 드라이버로 빌드됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;Kernel Mode Driver, Empty (KMDF)&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;Kernel-Mode Driver Framework(KMDF)를 사용하는 빈 프로젝트. 기본값으로 유니버설 드라이버로 빌드됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 19px;&quot;&gt;User Mode Driver (UMDF v2)&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 19px;&quot;&gt;User-Mode Driver Framework v2(UMDF2)를 사용하는 기본 프로젝트. 기본값으로 유니버설 드라이버로 빌드됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;User Mode Driver, Empty (UMDF v2)&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;User-Mode Driver Framework v2(UMDF2)를 사용하는 빈 프로젝트. 기본값으로 유니버설 드라이버로 빌드됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;Empty WDM Driver&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;WDM 드라이버를 만들기 위한 빈 프로젝트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;Printer Driver v4&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;V4 프린터 드라이버 프로젝트(GPD 또는 PPD 기반). 프린터 드라이버는 Windows 데스크톱 장치에서만 실행 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;Printer Driver v4 Property Bag&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;V4 프린터 드라이버의 프로퍼티 백(project) 프로젝트. 프린터 드라이버는 Windows 데스크톱 장치에서만 실행 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;Printer XPS Render Filter&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;프린터 드라이버용 XPS 렌더 필터 프로젝트. 프린터 드라이버는 Windows 데스크톱 장치에서만 실행 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 45.2326%; height: 17px;&quot;&gt;Empty Desktop Application for Drivers (Universal)&lt;/td&gt;
&lt;td style=&quot;width: 54.7674%; height: 17px;&quot;&gt;유니버설 드라이버와 상호작용하는 애플리케이션을 만들기 위한 빈 프로젝트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Windows/Kernel Driver</category>
      <author>Codetronik</author>
      <guid isPermaLink="true">https://codetronik.tistory.com/278</guid>
      <comments>https://codetronik.tistory.com/278#entry278comment</comments>
      <pubDate>Thu, 2 Oct 2025 11:15:24 +0900</pubDate>
    </item>
    <item>
      <title>[가이드] Visual Studio 2022 + WiX v4 + C# Service Program</title>
      <link>https://codetronik.tistory.com/271</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;특징&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 업그레이드 및 설치 시, 기존 서비스는 중지한 후 설치함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 언인스톨러는 설정 &amp;gt; 앱 &amp;gt; 설치된 앱에서 확인 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 언인스톨 시, 기존 서비스를 중지하고 제거함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- GUID가 같으면 설치되지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;테스트 서비스 프로그램 만들기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Visual Studio 2022 &amp;rarr; 새 프로젝트 만들기 &amp;rarr; 작업자 서비스 선택하여 프로젝트 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvEDyi/btsQeVzQGyv/IZJMyh7W94uFRaZRuo2pG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvEDyi/btsQeVzQGyv/IZJMyh7W94uFRaZRuo2pG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvEDyi/btsQeVzQGyv/IZJMyh7W94uFRaZRuo2pG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvEDyi%2FbtsQeVzQGyv%2FIZJMyh7W94uFRaZRuo2pG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;517&quot; height=&quot;85&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. NuGet 패키지 관리자로 아래 두 개 설치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSmag5/btsQcquryu9/GZxVkpkeImKyCKgg7SWbE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSmag5/btsQcquryu9/GZxVkpkeImKyCKgg7SWbE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSmag5/btsQcquryu9/GZxVkpkeImKyCKgg7SWbE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSmag5%2FbtsQcquryu9%2FGZxVkpkeImKyCKgg7SWbE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;107&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Program.cs 를 아래와 같이 코딩 후 빌드&lt;/p&gt;
&lt;pre id=&quot;code_1756451235783&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using WorkerService1;
using Microsoft.Extensions.Hosting.WindowsServices;

var builder = Host.CreateApplicationBuilder(args);
// Windows 서비스로 동작하도록
builder.Services.AddWindowsService(o =&amp;gt;
{
    o.ServiceName = &quot;My Worker Service&quot;;
});
builder.Services.AddHostedService&amp;lt;Worker&amp;gt;();

var host = builder.Build();
host.Run();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;4. 단일 배포 파일 생성&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1756454651867&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:SelfContained=true&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;WiX v4 설치 후 구성&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 및 설치 : &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=FireGiant.FireGiantHeatWaveDev17&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://marketplace.visualstudio.com/items?itemName=FireGiant.FireGiantHeatWaveDev17&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. Visual Studio 2022&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr; 새 프로젝트 만들기&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;rarr; MSI Package 선택하여 프로젝트 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bire3D/btsQbMx4MaL/QU82mCmoFa7RYXatFQcVgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bire3D/btsQbMx4MaL/QU82mCmoFa7RYXatFQcVgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bire3D/btsQbMx4MaL/QU82mCmoFa7RYXatFQcVgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbire3D%2FbtsQbMx4MaL%2FQU82mCmoFa7RYXatFQcVgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;85&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 코드 수정 및 빌드&lt;/p&gt;
&lt;pre id=&quot;code_1756451649668&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ExampleComponents.wxs
&amp;lt;!-- ExampleComponents.wxs --&amp;gt;
&amp;lt;Wix xmlns=&quot;http://wixtoolset.org/schemas/v4/wxs&quot;
     xmlns:util=&quot;http://wixtoolset.org/schemas/v4/wxs/util&quot;&amp;gt;
	&amp;lt;Fragment&amp;gt;
		&amp;lt;ComponentGroup Id=&quot;ExampleComponents&quot; Directory=&quot;INSTALLFOLDER&quot;&amp;gt;
			&amp;lt;Component&amp;gt;
				&amp;lt;File Id=&quot;Service1&quot;
					  Source=&quot;C:\Users\codetronik\source\repos\WorkerService1\WorkerService1\bin\Release\net8.0\win-x64\publish\WorkerService1.exe&quot;
					  KeyPath=&quot;yes&quot; /&amp;gt;

				&amp;lt;!-- 서비스 등록 --&amp;gt;
				&amp;lt;ServiceInstall
					Name=&quot;MyService1&quot;
					DisplayName=&quot;My Service&quot;
					Description=&quot;Service example&quot;
					Type=&quot;ownProcess&quot;
					Start=&quot;auto&quot;
					Account=&quot;LocalSystem&quot;
					ErrorControl=&quot;normal&quot;/&amp;gt;

				&amp;lt;!-- 설치/업그레이드/제거 시 제어 --&amp;gt;
				&amp;lt;ServiceControl
					Name=&quot;MyService1&quot;
					Stop=&quot;both&quot;
					Start=&quot;install&quot;
					Remove=&quot;uninstall&quot;
					Wait=&quot;yes&quot;/&amp;gt;

			&amp;lt;/Component&amp;gt;
		&amp;lt;/ComponentGroup&amp;gt;
	&amp;lt;/Fragment&amp;gt;
&amp;lt;/Wix&amp;gt;

// Folder.wxs
&amp;lt;Wix xmlns=&quot;http://wixtoolset.org/schemas/v4/wxs&quot;&amp;gt;
	&amp;lt;Fragment&amp;gt;
		&amp;lt;StandardDirectory Id=&quot;ProgramFiles64Folder&quot;&amp;gt;
			&amp;lt;Directory Id=&quot;INSTALLFOLDER&quot;
					   Name=&quot;!(bind.Property.Manufacturer) !(bind.Property.ProductName)&quot; /&amp;gt;
		&amp;lt;/StandardDirectory&amp;gt;
	&amp;lt;/Fragment&amp;gt;
&amp;lt;/Wix&amp;gt;

// Package.en-us.wxl
&amp;lt;!--
This file contains the declaration of all the localizable strings.
--&amp;gt;
&amp;lt;WixLocalization xmlns=&quot;http://wixtoolset.org/schemas/v4/wxl&quot; Culture=&quot;en-US&quot;&amp;gt;

  &amp;lt;String Id=&quot;DowngradeError&quot; Value=&quot;A newer version of [ProductName] is already installed.&quot; /&amp;gt;

&amp;lt;/WixLocalization&amp;gt;

// Package.wxs
&amp;lt;Wix xmlns=&quot;http://wixtoolset.org/schemas/v4/wxs&quot;&amp;gt;
	&amp;lt;Package Id=&quot;MyServicePkg&quot;
			 Name=&quot;ServiceExample&quot;
			 Manufacturer=&quot;Codetronik&quot;
			 Version=&quot;1.0.0.0&quot;
			 UpgradeCode=&quot;{1B29FC40-CA47-1067-131D-00DD010662DA}&quot;&amp;gt;
		&amp;lt;MajorUpgrade Schedule=&quot;afterInstallValidate&quot;
					  DowngradeErrorMessage=&quot;!(loc.DowngradeError)&quot; /&amp;gt;
		&amp;lt;Feature Id=&quot;Main&quot;&amp;gt;
			&amp;lt;ComponentGroupRef Id=&quot;ExampleComponents&quot; /&amp;gt;
		&amp;lt;/Feature&amp;gt;
	&amp;lt;/Package&amp;gt;
&amp;lt;/Wix&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Windows/Dev</category>
      <author>Codetronik</author>
      <guid isPermaLink="true">https://codetronik.tistory.com/271</guid>
      <comments>https://codetronik.tistory.com/271#entry271comment</comments>
      <pubDate>Fri, 29 Aug 2025 17:11:20 +0900</pubDate>
    </item>
    <item>
      <title>[가이드] Self-Hosted Sentry 설치 + cpp + 콜스택 추적 예제</title>
      <link>https://codetronik.tistory.com/270</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;환경 : Ubuntu 24.04.3 / 램 16G&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SaaS를 사용 못하는 내부망에서 사용하기 위함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025.08.12 기준&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 도커 설치 (&lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.docker.com/engine/install/ubuntu/&lt;/a&gt; 참조)&lt;/p&gt;
&lt;pre id=&quot;code_1754979815268&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ wget https://download.docker.com/linux/ubuntu/dists/noble/pool/stable/amd64/containerd.io_1.7.27-1_amd64.deb &amp;amp;&amp;amp; \
wget https://download.docker.com/linux/ubuntu/dists/noble/pool/stable/amd64/docker-ce-cli_28.3.3-1~ubuntu.24.04~noble_amd64.deb &amp;amp;&amp;amp; \
wget https://download.docker.com/linux/ubuntu/dists/noble/pool/stable/amd64/docker-ce_28.3.3-1~ubuntu.24.04~noble_amd64.deb &amp;amp;&amp;amp; \
wget https://download.docker.com/linux/ubuntu/dists/noble/pool/stable/amd64/docker-buildx-plugin_0.26.1-1~ubuntu.24.04~noble_amd64.deb &amp;amp;&amp;amp; \
wget https://download.docker.com/linux/ubuntu/dists/noble/pool/stable/amd64/docker-compose-plugin_2.39.1-1~ubuntu.24.04~noble_amd64.deb
$ sudo dpkg -i ./containerd.io_1.7.27-1_amd64.deb ./docker-ce-cli_28.3.3-1~ubuntu.24.04~noble_amd64.deb ./docker-ce_28.3.3-1~ubuntu.24.04~noble_amd64.deb ./docker-buildx-plugin_0.26.1-1~ubuntu.24.04~noble_amd64.deb ./docker-compose-plugin_2.39.1-1~ubuntu.24.04~noble_amd64.deb
$ sudo service docker start &amp;amp; sudo docker run hello-world&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 리버스 프록시 설치&lt;/p&gt;
&lt;pre id=&quot;code_1755128195571&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get install nginx
# 인증서 만들기
$ IP=192.168.130.189
$ sudo openssl req -x509 -newkey rsa:2048 -days 825 -nodes -subj &quot;/CN=${IP}&quot; -addext &quot;subjectAltName = IP:${IP}&quot; -keyout /etc/ssl/private/sentry-ip.key -out /etc/ssl/certs/sentry-ip.crt
$ sudo vim /etc/nginx/sites-available/sentry.conf
# 80 -&amp;gt; 443 리다이렉트
server {
  listen 80;
  return 301 https://$host$request_uri;
}

# HTTPS 종단 (IP 기반, 기본 서버)
server {
  listen 443 ssl http2;

  ssl_certificate     /etc/ssl/certs/sentry-ip.crt;
  ssl_certificate_key /etc/ssl/private/sentry-ip.key;

  client_max_body_size 50m;

  location / {
    proxy_set_header Host               $host;
    proxy_set_header X-Forwarded-Host   $host;
    proxy_set_header X-Forwarded-Proto  https;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:9000;
  }
}
$ sudo ln -s /etc/nginx/sites-available/sentry.conf /etc/nginx/sites-enabled/sentry.conf
$ sudo nginx -t
$ sudo systemctl reload nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Self-Hosted Sentry 설치 (&lt;a href=&quot;https://develop.sentry.dev/self-hosted/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://develop.sentry.dev/self-hosted/&lt;/a&gt;&amp;nbsp;참조)&lt;/p&gt;
&lt;pre id=&quot;code_1754980162766&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get install git curl
$ VERSION=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/getsentry/self-hosted/releases/latest)
$ VERSION=${VERSION##*/}
$ git clone https://github.com/getsentry/self-hosted.git
4 cd self-hosted
$ git checkout ${VERSION}
$ sudo ./install.sh

$ vim sentry/config.yml
system.url-prefix: &quot;https://192.168.130.189&quot;
$ vim sentry/sentry.conf.py
SECURE_PROXY_SSL_HEADER = (&quot;HTTP_X_FORWARDED_PROTO&quot;, &quot;https&quot;)
USE_X_FORWARDED_HOST = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SOCIAL_AUTH_REDIRECT_IS_HTTPS = True
CSRF_TRUSTED_ORIGINS = [&quot;https://192.168.130.189&quot;]
$ sudo sed -i -E 's|proxy_set_header[[:space:]]+X-Forwarded-Proto[[:space:]]+\$scheme;|proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;|g' nginx.conf

$ sudo docker compose up --wait&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. curl&amp;nbsp; + sentry 에러 전송 예제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이브러리 설치&lt;/p&gt;
&lt;pre id=&quot;code_1754983375705&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt install -y libcurl4-openssl-dev
$ git clone --recursive https://github.com/getsentry/sentry-native.git
$ cd sentry-native
$ cmake -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo   # 백엔드는 기본값 사용
$ cmake --build build --parallel
$ sudo cmake --install build&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CMakeLists.txt 생성&lt;/p&gt;
&lt;pre id=&quot;code_1754984072623&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.20)
project(app CXX)

find_package(sentry CONFIG REQUIRED)
add_executable(app main.cpp)
target_link_libraries(app PRIVATE sentry::sentry)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1754984692470&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;sentry.h&amp;gt;
#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;stdexcept&amp;gt;

int main() {
    const char* DSN = &quot;https://님_공개키@192.168.130.189/2&quot;;

    sentry_options_t* options = sentry_options_new();
    sentry_options_set_debug(options, 1);
    sentry_options_set_logger(options,
        [](sentry_level_e lvl, const char* msg, void*) {
            std::fprintf(stderr, &quot;[sentry:%d] %s\n&quot;, (int)lvl, msg);
        }, nullptr);

  
    sentry_options_set_dsn(options, DSN);
    sentry_options_set_database_path(options, &quot;.sentry-native&quot;);
    sentry_options_set_ca_certs(options, &quot;아까만든인증서.crt&quot;);
    sentry_options_set_release(options, &quot;myproject@1.0.0&quot;);    
    sentry_options_set_handler_path(options, &quot;/usr/local/bin/crashpad_handler&quot;);

    // 원한다면 환경/태그
    sentry_options_set_environment(options, &quot;dev&quot;);
    
    if (sentry_init(options) != 0) {
        throw std::runtime_error(&quot;sentry_init failed&quot;);
    }

    // 테스트 이벤트
    std::array&amp;lt;void*, 256&amp;gt; frames{};
    int n = backtrace(frames.data(), frames.size());

    sentry_value_t st  = sentry_value_new_stacktrace(frames.data(), n);
    sentry_value_t exc = sentry_value_new_exception(&quot;error&quot;, std::string(msg).c_str());
    sentry_value_set_by_key(exc, &quot;stacktrace&quot;, st);

    sentry_value_t evt = sentry_value_new_event();
    sentry_event_add_exception(evt, exc);
    sentry_capture_event(evt);

    // 크래시
    int* p = nullptr; *p = 42;

    sentry_close();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. sentry-cli 설치 및 환경 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://192.168.130.189/settings/account/api/auth-tokens/new-token/ 에서 토큰 생성&lt;/p&gt;
&lt;pre id=&quot;code_1755041578015&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ curl -sL https://sentry.io/get-cli/ | bash
# 환경 파일 설정
$ vim ~/.sentryclirc
[defaults]
url = https://192.168.130.189
org = sentry # 조직 slug
project = agent # 프로젝트 slug

[http]
verify_ssl = false

[auth]
token = 님_토큰

# 정상 동작 확인
$ sentry-cli info
# 조직 slug 확인
$ sentry-cli organizations list
+----+--------+--------+--------------+---------------+--------------+
| ID | Name   | Slug   | Date Created | Early Adopter | Requires 2FA |
+----+--------+--------+--------------+---------------+--------------+
| 1  | Sentry | sentry | 2025-08-12   | false         | false        |
+----+--------+--------+--------------+---------------+--------------+
# 프로젝트 slug 확인
$ sentry-cli projects list -o sentry
+----+----------+--------+----------+
| ID | Slug     | Team   | Name     |
+----+----------+--------+----------+
| 1  | internal | Sentry | Internal |
| 2  | agent    | Sentry | agent    |
+----+----------+--------+----------+

# 파일 유효성 확인
$ sentry-cli debug-files check 님_실행파일
# 분리 심볼 생성
objcopy --only-keep-debug 님_실행파일 님_실행파일.debug
objcopy --add-gnu-debuglink=님_실행파일.debug 님_실행파일
# 파일 업로드
$ sentry-cli debug-files upload --include-sources 님_실행파일 님_실행파일.debug&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 크래시패드 정상 전송을 위해 프로그램을 설치한 pc에 인증서 설치&lt;/p&gt;
&lt;pre id=&quot;code_1756085337127&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# sentry 서버에서 인증서 가져와서 루트 인증서에 설정
$ sudo cp sentry-ip.crt /usr/local/share/ca-certificates/sentry-ip.crt
$ sudo update-ca-certificates&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Linux/Dev</category>
      <author>Codetronik</author>
      <guid isPermaLink="true">https://codetronik.tistory.com/270</guid>
      <comments>https://codetronik.tistory.com/270#entry270comment</comments>
      <pubDate>Tue, 12 Aug 2025 15:50:06 +0900</pubDate>
    </item>
    <item>
      <title>[poco] 로그 예제</title>
      <link>https://codetronik.tistory.com/268</link>
      <description>&lt;pre id=&quot;code_1753195724222&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;Poco/Logger.h&amp;gt;
#include &amp;lt;Poco/PatternFormatter.h&amp;gt;
#include &amp;lt;Poco/FormattingChannel.h&amp;gt;
#include &amp;lt;Poco/ConsoleChannel.h&amp;gt;
#include &amp;lt;Poco/FileChannel.h&amp;gt;
#include &amp;lt;Poco/SplitterChannel.h&amp;gt;
#include &amp;lt;Poco/AutoPtr.h&amp;gt;
#include &amp;lt;Poco/Thread.h&amp;gt;
#include &amp;lt;Poco/Runnable.h&amp;gt;

using namespace Poco;

class LevelFilterFileChannel : public FileChannel
{
public:
    LevelFilterFileChannel() : FileChannel() {}

    void log(const Message&amp;amp; msg) override
    {
        // debug, trace 로그 제외
        if (msg.getPriority() &amp;lt;= Message::PRIO_INFORMATION)
        {
            FileChannel::log(msg);
        }
    }
};

class MyWorker : public Runnable
{
public:
    void run() override
    {
        Logger&amp;amp; logger = Logger::get(&quot;aLogger&quot;);
        for (int i = 0; i &amp;lt; 5; ++i)
        {
            logger.notice(&quot;Poco Thread is running! i = &quot; + std::to_string(i));
            Poco::Thread::sleep(500); // 0.5초 대기
        }
        logger.information(&quot;Poco Thread done.&quot;);
    }
};

int main()
{
    AutoPtr&amp;lt;ColorConsoleChannel&amp;gt; colorConsoleChannel(new ColorConsoleChannel);
    AutoPtr&amp;lt;LevelFilterFileChannel&amp;gt; fileChannel(new LevelFilterFileChannel);
    fileChannel-&amp;gt;setProperty(&quot;path&quot;, &quot;myapp.log&quot;);
    fileChannel-&amp;gt;setProperty(&quot;rotation&quot;, &quot;50000 K&quot;); // 50,000KB 초과시 회전
    fileChannel-&amp;gt;setProperty(&quot;archive&quot;, &quot;timestamp&quot;);
    fileChannel-&amp;gt;setProperty(&quot;purgeAge&quot;, &quot;30 days&quot;); // 30일 초과 로그 파일 삭제

    AutoPtr&amp;lt;PatternFormatter&amp;gt; patternFormatter(new PatternFormatter);
    patternFormatter-&amp;gt;setProperty(
        &quot;pattern&quot;,
        &quot;[%Y-%m-%d %H:%M:%S] [%p] [PID:%P][TID:%T][TH:%I] %t&quot;
    );
    patternFormatter-&amp;gt;setProperty(&quot;times&quot;, &quot;local&quot;);
   
    AutoPtr&amp;lt;FormattingChannel&amp;gt; fcConsole(new FormattingChannel(patternFormatter, colorConsoleChannel));  // 콘솔은 모든 로그
    AutoPtr&amp;lt;FormattingChannel&amp;gt; fcFile(new FormattingChannel(patternFormatter, fileChannel));

    // 콘솔 및 파일 채널로 메시지를 전달
    AutoPtr&amp;lt;SplitterChannel&amp;gt; splitter(new SplitterChannel);
    splitter-&amp;gt;addChannel(fcConsole);
    splitter-&amp;gt;addChannel(fcFile);  

    Logger&amp;amp; logger = Logger::get(&quot;Logger&quot;);
    logger.setChannel(splitter);
    logger.setLevel(Message::PRIO_TRACE); // 모든 로그 레벨 허용

    logger.fatal(&quot;FATAL 메시지&quot;);
    logger.critical(&quot;CRITICAL 메시지&quot;);
    logger.error(&quot;ERROR 메시지&quot;);
    logger.warning(&quot;WARNING 메시지&quot;);
    logger.notice(&quot;NOTICE 메시지&quot;);
    logger.information(&quot;INFO 메시지&quot;);
    logger.debug(&quot;DEBUG 메시지 - 콘솔만&quot;);
    logger.trace(&quot;TRACE 메시지 - 콘솔만&quot;);

    MyWorker worker;
    Thread thread;
    thread.start(worker);

    // 메인 스레드도 로그 남기기
    for (int i = 0; i &amp;lt; 3; ++i)
    {
        logger.notice(&quot;Main thread working... i = &quot; + std::to_string(i));
        std::this_thread::sleep_for(std::chrono::milliseconds(400));
    }

    thread.join();
    logger.information(&quot;모든 작업 종료&quot;);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Language/C++</category>
      <author>Codetronik</author>
      <guid isPermaLink="true">https://codetronik.tistory.com/268</guid>
      <comments>https://codetronik.tistory.com/268#entry268comment</comments>
      <pubDate>Tue, 22 Jul 2025 23:48:51 +0900</pubDate>
    </item>
  </channel>
</rss>