기본 콘텐츠로 건너뛰기

추천 가젯

리눅스 홈서버 알림용 텔레그램 봇(Telegram Bot) 연동 및 쉘 스크립트 구축 가이드

개인 홈서버를 운영하다 보면 백업 완료 여부나 시스템 에러 같은 단방향 알림을 스마트폰으로 빠르게 받아보고 싶어집니다. 외부 메일 서버나 복잡한 SMTP 설정을 거치지 않고, 가장 확실하고 가볍게 쓸 수 있는 텔레그램 봇을 이용한 홈서버 알림 구축 방법 을 정리합니다. 1단계: 텔레그램 봇 생성하기 (BotFather) 텔레그램 앱을 켜고 상단 검색창에 BotFather 를 검색하여 공식 봇(파란색 체크마크 확인)을 엽니다. 대화창에 아래 명령어를 입력하여 새로운 봇을 만듭니다. Plaintext /newbot 봇의 이름(Name)을 입력합니다. (예: My Home Server Bot ) 봇의 아이디(Username)를 입력합니다. (반드시 영문이며 끝에 bot 또는 _bot 으로 끝나야 합니다. 예: my_home_backup_bot ) 생성이 완료되면 HTTP API 토큰(Token)이 발급됩니다. 이 토큰을 안전하게 보관합니다. 2단계: 내 Chat ID(채팅방 고유 번호) 확인하기 텔레그램은 보안상 사용자가 먼저 봇에게 말을 걸어야 메시지를 받을 수 있으며, 봇이 나에게 메시지를 보내려면 고유 Chat ID 가 필요합니다. 텔레그램 검색창에 userinfobot 을 검색하여 들어갑니다. 하단의 [시작하기] 버튼을 누르면 내 계정의 정보와 함께 Id (숫자) 값을 알려줍니다. 이 숫자를 복사해 둡니다. [중요] 1단계에서 만든 내 봇의 아이디(예: @my_home_backup_bot )를 검색해서 대화창을 열고, [시작] 버튼을 누르거나 아무 메시지나 먼저 한 번 전송해 둡니다. 3단계: 리눅스 쉘 스크립트 작성 및 테스트 서버(터미널)에서 환경변수를 설정하고 curl 명령어를 통해 테스트 메시지를 보낼 수 있습니다. 특히 인자값이 없을 때를 대비해 기본값 처리를 해두면 유용합니다. 아래 내용을 포함하는 쉘 스크립트 파일(예: send_telegram.sh )을 작성합니다. Bash #!/bin/bash # 환경변수 설정 (실제 토큰과 C...

[리버싱 일기/리뉴] 랑그릿사 2: 상태 이상 마법의 확률 공식과 참(Charm)의 메커니즘

랑그릿사 2에서 뮤트, 슬립, 참과 같은 상태 이상 마법들은 단순히 운에 의해 결정되는 것이 아닙니다. 필자는 기드라(Ghidra)를 통해 Apply_Spell_To_Target(0x40ffd3) 함수 내의 switch-case문을 분석하여, 이 마법들이 성공하기 위해 통과해야 하는 수학적 관문들을 찾아냈습니다.

1. 상태 이상 마법의 핵심: 확률 산출 공식 (0x0040f54d)

뮤트(Mute)를 비롯한 대부분의 확률형 마법은 공통적인 성공 확률 함수를 공유합니다. 분석 결과, 이 함수는 시전자와 방어자의 레벨 차이를 마법 방어력(MDF)에 보정하는 방식을 취합니다.

  • 면역 체크: 방어자의 MDF가 100이면 즉시 실패를 리턴합니다.

  • 보정 수치 산출: 100 - ((공격자_LV - 방어자_LV) << 2)

    • 이를 정리하면 **[MDF - (레벨 차이 × 4)]**라는 레벨 보정 마방치가 나옵니다.

  • 난수 비교: 0~100 사이의 난수(rng % 101)를 발생시켜, 이 값이 위에서 구한 보정치보다 크거나 같으면 성공합니다.

[성공 확률 분석표]

동일 레벨 기준, 마방이 99일 때 성공 확률은 2/101(약 2%)로, 일반적인 예상보다 2배가량 높게 설계되어 있습니다.

마법 방어력(MDF)레벨 차 -8 (방어자 우세)레벨 차 0 (동일)레벨 차 +8 (공격자 우세)
2048.5%80.2%100.0%
608.9%40.6%72.3%
990.0%2.0%33.7%

필자의 분석에 따르면, 마방이 20으로 낮아도 레벨 차이가 크면 절반은 저항하며, 반대로 마방이 99로 높아도 레벨 차이로 찍어누르면 1/3 확률로 마법이 걸리게 됩니다.

2. 마법별 특수 제약 조건

  • 뮤트(Mute): 지휘관(Army Number 0 또는 7)에게만 걸립니다. 용병에게 강제로 거는 것은 로직상 불가능합니다.

  • 슬립(Sleep): 타겟의 종족값이 '불사(Undead)'인 경우 하드코딩된 로직에 의해 완전 면역 처리됩니다.

  • 존(Zone): 마법이 실패할 경우 특수한 함수를 호출하여 메모리상의 특정 좌표 값을 이동시키는데, 이는 AI가 실패 후 다음 행동을 결정하기 위한 좌표 저장으로 추측됩니다.

3. 가장 복잡한 난제: 참(Charm)과 진영 변조

참 마법은 단순히 상태 이상 플래그를 세우는 것을 넘어, 유닛의 소속(Camp)을 통째로 흔듭니다. 필자가 추적한 b1(원래 진영)과 b2(현재 진영)의 로직은 다음과 같은 구조를 가집니다.

  1. 진영 백업: if(b1 == 0) b1 = b2; (참이 처음 걸릴 때 원래 진영 정보를 b1에 백업)

  2. 진영 변조: b2 = 시전자의_진영; (현재 소속을 시전자 쪽으로 강제 변경)

  3. 해제 로직: 턴이 돌아올 때마다 지휘관의 MDF 확률로 자가 해제를 시도합니다. 성공 시 b2 = b1; b1 = 0; 과정을 거쳐 원래 진영으로 복귀합니다.

흥미로운 점은 자가 회복 루프가 20개의 포스(Force)를 대상으로 돈다는 것입니다. 이는 전장에 참여하는 전체 지휘관 수와 밀접한 관련이 있어 보입니다. 참이 걸린 적군이 우리 턴에 회복 효과를 받는 등 기묘한 현상이 발생하는 이유도 이 진영 번호 변조 로직 때문일 가능성이 큽니다.

맺으며: 리버싱으로 본 개발자의 설계

분석을 진행할수록 _run_flag_apply의 중요성이 다시금 확인됩니다. AI는 마법을 실제로 시전하기 전, 이 모든 확률 계산과 진영 변조의 결과값을 '가상'으로 미리 돌려보고 최적의 타겟을 선정합니다.

참 마법의 진영 변조 로직은 아직 미궁에 빠진 부분이 많지만, Absolute_Camp와 같은 열거형(enum) 값을 정의하고 사용처를 전수 조사한다면 랑그릿사 2의 진영 시스템 전체를 파악할 수 있을 것입니다.

댓글