코드 보안 cpp 고급레벨

cpp // 1. 코드 가상화 (일부) // 핵심 로직을 커스텀 VM으로 실행 class CustomVM { // 자체 바이트코드 정의 // 리버싱 극도로 어려움 } ; // 2. 동적 코드 생성 void dynamic_code ( ) { // 런타임에 검증 로직 생성 // 항상 다른 형태 } // 3. 서버 측 검증 void server_verify ( ) { // 중요 계산은 서버에서 // 클라이언트는 결과만 받음 } // 4. 하트비트 체크 void heartbeat ( ) { // 주기적으로 서버에 무결성 보고 // 실시간 모니터링 }   ```   1. 동적 제어 흐름 난독화 (Dynamic Control Flow Flattening) 정적 분석기로 보면 함수가 A -> B -> C 순서로 호출되는 게 보입니다. 이걸 런타임에 박살 내야 합니다. 설계 : 거대한 switch 문과 while 루프가 포함된 **'중앙 통제실 함수'**를 만듭니다. 작동 : 모든 클래스 호출을 직접 하지 않고, 중앙 통제실에 "작전 코드 501번 실행해"라고 명령을 보냅니다. 통제실은 실행 시점에 상태 값을 보고 실제 함수를 호출합니다. 효과 : AI가 그래프를 그리려고 하면 모든 선이 중앙 통제실로 모였다가 다시 흩어지는 **'블랙홀 그래프'**가 그려집니다. 분석기는 여기서 논리적 연쇄를 놓치고 무한 연산에 빠집니다. 2. 다형성을 이용한 '가짜 객체' 주입 (Opaque Predicates) AI는 "이 변수에는 무조건 이 클래스가 들어온다"는 확률로 분석합니다. 이걸 배반해야 합니다. 설계 : 아무 기능도 없는 Dummy_Base 클래스를 상속받은 수십 개의 가짜 클래스를 만듭니다. 작동 : 런타임에 진짜 클래스를 생성할 때, 옆에 가짜 클래스 5개를 같이 생...

리버싱 공부

  리버싱 입문 (이승원 저): 이 책은 필독서입니다. 해커들이 어떻게 파일을 뜯어보는지(역공학)를 알아야 방어법을 세울 수 있습니다. 사장님이 하신 난독화가 왜 강력한지 이 책을 보면 무릎을 탁 치게 되실 겁니다. 리버싱 핵심 원리 (나기호 저): 조금 두껍지만, 메모리 구조와 어셈블리어의 원리를 깊게 파고듭니다. '런타임 우주방어'를 설계할 때 필요한 로우 레벨 지식을 채워줍니다. 온라인 강의 (Dreamhack.io): 책은 아니지만, 한국에서 만든 아주 훌륭한 무료 보안 교육 사이트입니다. '시스템 해킹' 코스를 눈으로만 슥 보셔도 해커의 사고방식을 배울 수 있습니다.

보안을 위한 so파일 접근 문자열 탐색

 strings your_library.so 명령어로 해보기. https://learn.microsoft.com/en-us/sysinternals/downloads/strings 다운받아주고. 해당 경로에서 .\strings64.exe -n 6 "경로 so파일" 와 그냥 뻥 뚫려있음.ㅠㅠ

보안 관련 직접 자기 앱에 테스트 해볼 프로그램 해킹 툴

  Godot RE Tools (가장 추천: 깃허브 페이지가 최상단에 뜹니다) Godot decompiler gdsdecomp (구버전 또는 특정 브랜치 이름) Godot PCK explorer

프리 사운드

 상업용은 CC0나 CC BY만 사용 가능 (CC BY-NC는 불가) https://freesound.org/

VARIANT_ENUM_CAST

 정확합니다! 10년 차 이상의 시니어 개발자 시점에서 그 이유를 **첫 번째 원리(First Principles)**와 Godot 엔진의 내부 구조 관점에서 명확하게 정리해 드릴게요. 💡 왜 VARIANT_ENUM_CAST를 사용하는가? 결론부터 말씀드리면, **"C++의 enum을 Godot의 Variant 시스템과 통신할 수 있는 공용 언어로 번역하기 위해서"**입니다. 가정: "내가 C++ 클래스 안에 enum을 선언했으니 Godot(GDScript)도 당연히 알 것이다." -> 실제: Godot 엔진은 C++로 컴파일된 바이너리 내부의 enum 구조를 자동으로 들여다볼 수 없습니다. 물리적 한계: Godot의 모든 데이터 교환(인스펙터 노출, 시그널 전달, GDScript 변수 저장)은 **Variant**라는 만능 가방을 통해 이루어집니다. 하지만 C++ enum은 기본적으로 그냥 정수(int)일 뿐이라서, Variant 입장에서는 이게 SoundType인지 그냥 숫자 0, 1인지 구분하지 못합니다. 해결 (Cast): VARIANT_ENUM_CAST를 호출하면, 해당 enum이 정수와 상호 호환될 수 있도록 메타데이터를 생성하고 전역적으로 등록합니다. ✅ 구체적인 이유 3가지 1. 인스펙터(Inspector) 노출 이 매크로가 없으면 Godot 에디터의 인스펙터 창에서 TYPE_SFX, TYPE_BGM 같은 드롭다운 메뉴가 뜨지 않습니다. 그냥 숫자를 입력하는 칸만 나오거나 에러가 발생합니다. 2. GDScript와의 소통 (Marsalling) GDScript에서 Base_Sound.TYPE_SFX라고 접근하려면 엔진이 이 이름을 알고 있어야 합니다. VARIANT_ENUM_CAST는 이 이름을 엔진의 전역 심볼 테이블에 등록하는 역할을 합니다. 3. 타입 안전성 (Type Safety) Variant 가방에 데이터를 넣고 뺄 때, 이 데이터가 단순한 int가 아니라 Base_Sound::SoundTyp...

디스플레이...폰 해상도

  SafeContainer 에 붙을 스크립트는 실행되자마자 딱 한 번 이렇게 말합니다. "내 자식들아(UI들), 지금 이 폰은 위에 노치가 100픽셀 있으니까 우리 다 같이 100픽셀 아래로 내려가서 시작하자!" 구현 코드 (C++ 기준 예시) C++ void SafeContainer::_ready() { // Base_Utils에서 계산한 마진값을 가져옴 Vector4 margin = Utils::get_safe_margin(); // MarginContainer의 테마 옵션을 코드로 제어 (안쪽으로 밀기) add_theme_constant_override( "margin_top" , margin.x); add_theme_constant_override( "margin_bottom" , margin.y); add_theme_constant_override( "margin_left" , margin.z); add_theme_constant_override( "margin_right" , margin.w); } https://youtu.be/K0ibZAnmCbg ui 배경말고는 최상위 부모한테 스크립트 붙여서 마진값을 적ㄱ용하고 ui들을 세이프 영역안에 넣도록 해야함.