
C 재구현을 위한 결정론적 PyGhidra 추출, 트리아지 및 로컬 LLM 컴파일러 백엔드 파이프라인.
제 Ghidra + LLM 파이프라인을 다운로드해 주셔서 감사합니다.
이것은 제 첫 README입니다. 제 모국어는 ASL(미국 수어)이라서 제 영어는 완벽하지 않습니다. 최선을 다했습니다.
어린 시절부터 해 온 오래된 PC 시뮬레이션 게임을 좋아하는데, 그 내부를 개선하고 싶습니다.
OpenRA나 OpenTTD 같은 오픈소스 게임들을 보면서 배운 것은 이것입니다: 취미로 하는 재구현은 원본 소스 코드를 얻는 것이 아닙니다. 원본의 에셋을 불러올 수 있는 새로운 오픈소스 버전의 게임을 만드는 것입니다. 그러면 누구나 확장하거나 기여할 수 있습니다.
작업을 위해 두 종류의 AI를 함께 사용합니다:
모든 함수는 하나의 레이블을 받습니다. 이는 많은 시간을 절약해 줍니다. OS와 런타임 잡동사니의 큰 풀에 노력을 낭비하지 않기 때문입니다.
|-----------|------------------------------------------------------------------------------------------------------------------
| 레이블 | 의미 |
|---|---|
| KEEP | 게임 자체의 로직 (예: 비행 모델, 데미지 모델, TrackIR) |
| WRAP | OS나 입력 API를 호출하는 Java 대면 글루 코드: 시그니처는 유지하고 본문을 새로 작성. |
| (IL-2 1946은 흥미로운 엔진입니다: C++와 Java가 함께 있습니다.) | |
| REPLACE | 오래된 C 런타임, 할당자, thunk: 컴파일러나 OS가 제공하므로 새로운 64비트 버전에는 필요 없음 |
| UNKNOWN | 불분명: 직접 살펴볼 것 |
| ----------- | ------------------------------------------------------------------------------------------------------------------ |
제 테스트 프로그램에서는 약 44%의 함수가 REPLACE였으므로, 변환할 필요가 전혀 없었습니다.
처음에는 C 의사코드가 모든 답을 갖고 있다고 믿었습니다. 그것은 순진한 생각이었습니다. 그것은 Ghidra의 어셈블리 해석이며, 추측을 담고 있습니다(변수 타입, 유실된 인자).
어셈블리가 원시 진실입니다. 변수 타입은 없지만, 각 함수의 정확한 동작을 담고 있습니다. 그래서 스크립트는 어셈블리를 읽고, 그것을 C 형태의 청사진으로 변환합니다. Ghidra의 C는 힌트로만 유지됩니다.
초기 테스트에서는 로컬 LLM(Qwen 2.5 Coder, DeepSeek Coder V2 Lite, Mellum 2)을 사용해 어셈블리를 직접 읽게 했습니다. 그것은 결코 안정적으로 작동하지 않았습니다. LLM은 코드를 작성하도록 만들어졌지 원시 기계어를 읽도록 만들어지지 않았기 때문에 환각을 일으켰습니다.
많은 실패한 실험 끝에 작업을 나눴습니다:
참고: Python이 답을 검사하는 방법
텍스트 검사: 함수 이름, 청사진의 모든 호출, 전역 변수, 문자열, 루프, 스텝 크기, 비교되는 상수, 반환 값, 그리고 레지스터 이름이나 지어낸 이름이 남아 있지 않은지.
gcc 컴파일 검사: 코드는 gcc로 컴파일된다(구문 검사만 수행하며, 아무것도 실행되지 않는다). 이것이 큰 도움이 되었다. 초기 실행에서 텍스트 검사는 Mellum 2의 답변을 통과시켰지만, 주석 밖에 작성된 헤더 주석 때문에 어느 것도 컴파일되지 않았다. gcc는 텍스트 검사가 볼 수 없는 것을 잡아낸다: 선언되지 않았거나 재선언된 변수, 잘못된 타입, 그리고 깨진 중괄호나 세미콜론. 함수는 텍스트 검사와 컴파일이 모두 OK일 때만 PASS로 간주된다. gcc는 로직이 올바르다는 것을 증명하지 않으므로, 나는 여전히 청사진과 대조하여 코드를 읽는다.
검사가 실패하면, LLM은 실패한 항목 목록을 받고 한 번 더 시도한다.
Python은 LLM 없이 사소한 실수를 스스로 수정한다: 각 변수를 한 번씩 선언하고, 느슨한 헤더 줄을 주석으로 감싸고, 마지막 return이 올바른 결과를 반환하도록 하며, include와 선언을 추가한다.
이 체크리스트는 LLM이 매우 긴 함수에서 실패하는 것을 보고 나서 만들었다. 이는 조종사가 이륙과 착륙 전에 사용하는 체크리스트처럼 작동한다. Python이 함수로부터 이를 작성하고, 그에 대조하여 답변을 검사한다. 내 테스트에서 긴 함수들이 통과하기 시작했고, 실행 속도도 빨라졌다.
|-------------------|---------------------------------------|---------------------------------------------
| 폴더 | 하는 일 | 읽을 파일 |
|---|---|---|
ghidra_pipeline | 덤프, 그룹화, 트리아지, 역할 | ghidra_pipeline/INSTRUCTION.txt |
llm_pipeline | 청사진과 LLM 러너 (v3) | llm_pipeline/INSTRUCTION_BLUEPRINT_LLM.txt |
| ------------------- | --------------------------------------- | --------------------------------------------- |
ghidra_pipeline부터 시작하고, 로컬 LLM을 사용할 준비가 되면 llm_pipeline으로 넘어가라.
먼저 PyGhidra에서 프로그램을 분석하고 PyGhidra Scripts/decompile_full_dump.py를 실행하라.
두 INSTRUCTION 파일이 폴더 설정을 설명한다. 그런 다음:
먼저 PyGhidra에서 프로그램을 분석하고 PyGhidra Scripts/decompile_full_dump.py를 실행하라.
두 INSTRUCTION 파일이 폴더 설정을 설명한다. 그런 다음:
python .\make_full_lite_v2.py --in . --out .\OUT
python .\triage_evidence_v2.py --lite .\OUT\LITE_AC
python .\build_roles_v2.py --triage .\OUT\TRIAGE
python .\blueprint_v3.py --group ".\SOURCE\LITE_AC\<GroupName>" --out ".\G_<GroupName>\BLUEPRINT_v3"
python .\run_blueprint_llm_v3.py --bp ".\G_<GroupName>\BLUEPRINT_v3" --out ".\G_<GroupName>\RUN1_v3_<model>" --model <model name>
Ghidra와 PyGhidra, Python 3, LM Studio(모델 하나 로드됨), gcc(권장, 컴파일 검사에 사용)가 필요합니다.
이 저장소에는 스크립트와 문서만 있습니다. 게임 파일, 코드, 데이터는 없습니다. 소유한 프로그램에만 사용하고, 해당 프로그램에 적용되는 규칙을 따르세요.
다른 게임에서 시도해 보고 무엇이 잘 되고 무엇이 안 되는지 알려주세요. 아이디어와 개선 사항을 환영합니다.
스크립트를 가져다가 더 개선해도 자유롭게 하셔도 됩니다. Apache 2.0 라이선스는 사용, 변경, 공유를 허용하므로 포크하고, 자신만의 버전을 만들고, 배운 것을 공유하세요.
제가 가장 좋아하는 단어는 탈중앙화입니다. 저에게 그것은 커뮤니티 기반의 공유와 지원을 뜻하며, 우리가 이미 가진 것을 함께 개선해 나가는 것입니다. 이것이 취미 수준의 재구현(리버스 엔지니어링)과 LLM 개발에 새로운 아이디어를 가져오기를 바랍니다.
Apache License 2.0. LICENSE와 NOTICE를 참조하세요.
Copyright 2026 Ryu116 (also known as HappyTotoro116)