기본 콘텐츠로 건너뛰기

[ ChatGPT ] 임의의 프로세스에 접근하여 임의의 변수값을 바꾸기 위한 방법

 질문 사항

1번 프로세스와 2번 프로세스가 있어. 1번이 운영중인데, 2번 프로세스에서 1번 프로세스의 임의의 메모리에 접근하여 그 메모리의 값을 바꾸고 싶어. 어떤 절차를 이용해야 하지?

답변 내용

1번 프로세스의 메모리에 2번 프로세스에서 접근하여 값을 변경하는 것은 매우 민감한 작업이며, 운영 체제에서는 일반적으로 이러한 작업을 보안과 안정성 때문에 제한합니다. 그러나 특수한 경우, 특히 시스템 프로그래밍이나 디버깅 목적으로는 특정 API를 사용하여 이러한 작업을 수행할 수 있습니다. 아래는 이러한 작업을 수행하기 위한 일반적인 절차를 설명합니다.

1. 프로세스 권한 확인 및 확보

  • 2번 프로세스가 1번 프로세스의 메모리에 접근하려면 충분한 권한이 있어야 합니다. 일반적으로 이는 관리자 권한이나 루트 권한이 필요합니다.
  • Windows에서는 SeDebugPrivilege를 활성화해야 할 수 있으며, Linux에서는 루트 권한이 필요할 수 있습니다.

2. 1번 프로세스의 핸들 획득

  • 2번 프로세스가 1번 프로세스의 메모리에 접근하려면 먼저 1번 프로세스의 핸들을 얻어야 합니다.

  • Windows:

    • OpenProcess 함수를 사용하여 1번 프로세스의 핸들을 얻습니다. 이 함수는 1번 프로세스의 프로세스 ID를 기반으로 접근합니다.

IntPtr processHandle = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, false, processId);

 

  • Linux:

    • Linux에서는 ptrace 시스템 호출을 사용하여 다른 프로세스의 메모리에 접근할 수 있습니다. 그러나 이 작업은 일반적으로 매우 제한적이며, 디버깅 목적으로 주로 사용됩니다.
    ptrace(PTRACE_ATTACH, target_pid, NULL, NULL);
    waitpid(target_pid, NULL, 0);

3. 1번 프로세스의 메모리 주소 계산

  • 1번 프로세스에서 수정하려는 변수나 데이터의 정확한 가상 메모리 주소를 알아야 합니다.
  • 만약 1번 프로세스에서 해당 주소를 알고 있다면 이를 활용할 수 있지만, 그렇지 않다면 메모리 스캔이나 디버깅 도구를 사용하여 해당 주소를 찾아야 합니다.

4. 1번 프로세스의 메모리 읽기/쓰기

  • 메모리 주소를 얻은 후, 2번 프로세스에서 해당 메모리에 접근하여 데이터를 읽거나 쓸 수 있습니다.

  • Windows:

    • ReadProcessMemoryWriteProcessMemory 함수를 사용하여 1번 프로세스의 메모리에서 데이터를 읽고 쓸 수 있습니다.
    byte[] buffer = new byte[4];  // 읽기/쓰기할 데이터 크기에 맞게 설정
    int bytesRead;
    if (ReadProcessMemory(processHandle, address, buffer, buffer.Length, out bytesRead))
    {
        // buffer에 읽어온 데이터가 저장됩니다.
    }

    int bytesWritten;
    byte[] dataToWrite = BitConverter.GetBytes(newValue);  // 새로운 값
    if (WriteProcessMemory(processHandle, address, dataToWrite, dataToWrite.Length, out bytesWritten))
    {
        // 메모리에 데이터 쓰기 성공
    }

  • Linux:

    • ptrace 시스템 호출로 메모리에 쓰기 작업을 수행할 수 있습니다.
    ptrace(PTRACE_POKEDATA, target_pid, target_addr, new_value);

5. 프로세스 및 권한 정리

  • 작업이 끝나면 핸들을 닫거나(CloseHandle), ptrace를 통해 프로세스를 분리(PTRACE_DETACH)해야 합니다.
  • 권한이 상승된 상태에서 작업을 했다면, 작업 후 권한을 해제하는 것도 중요합니다.

예시: Windows에서의 메모리 쓰기

using System; using System.Diagnostics; using System.Runtime.InteropServices; class Program { [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); [DllImport("kernel32.dll", SetLastError = true)] public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, int nSize, out int lpNumberOfBytesWritten); [DllImport("kernel32.dll")] public static extern bool CloseHandle(IntPtr hObject); static void Main(string[] args) { int targetProcessId = 1234; // 1번 프로세스 ID IntPtr targetAddress = new IntPtr(0x12345678); // 변경하려는 메모리 주소 // 1번 프로세스 핸들 얻기 IntPtr processHandle = OpenProcess(0x1F0FFF, false, targetProcessId); if (processHandle == IntPtr.Zero) { Console.WriteLine("프로세스를 열 수 없습니다."); return; } // 변경할 데이터 int newValue = 42; byte[] dataToWrite = BitConverter.GetBytes(newValue); int bytesWritten; // 메모리 쓰기 if (WriteProcessMemory(processHandle, targetAddress, dataToWrite, dataToWrite.Length, out bytesWritten)) { Console.WriteLine($"메모리 주소 {targetAddress}에 {newValue} 값을 썼습니다."); } else { Console.WriteLine("메모리 쓰기 실패."); } // 핸들 닫기 CloseHandle(processHandle); } }



주의사항

  • 보안 문제: 다른 프로세스의 메모리에 접근하거나 수정하는 것은 보안상 큰 문제가 될 수 있습니다. 악의적인 사용은 법적으로 문제가 될 수 있으며, 시스템 안정성을 해칠 수 있습니다.
  • 프로그램 충돌 위험: 잘못된 메모리 접근이나 수정은 대상 프로세스가 예기치 않게 종료되거나 충돌을 일으킬 수 있습니다.
  • 관리자 권한: 이러한 작업은 대부분 관리자 권한에서 수행해야 합니다.

이러한 작업은 디버깅 목적으로 주로 사용되며, 일반적으로 권장되지 않는 접근 방식입니다. 프로덕션 환경에서는 가능한 한 피해야 하며, 반드시 필요한 경우에도 신중하게 수행해야 합니다.


--------------------------------------------------------------------------------------------

메모리 스캔이나 디버깅 도구를 사용하여 해당 주소를 찾는 법

  • 메모리 스캔 도구 Cheat Engine을 이용하여 메모리 주소 찾기
  • Cheat Engine 이란 - 위키 백과 인용
    • 치트 엔진(Cheat Engine, CE)은 마이크로소프트 윈도우 운영 체제용으로 다크 바이트가 개발한 자유-오픈 소스 기반 메모리 스캐너/디버거이다.[4] 치트 엔진은 대부분 컴퓨터 게임의 치트에 사용되며 종종 감지 우회를 위해 수정 및 재컴파일된다. 이 프로그램은 L. 스파이로의 메모리 해킹 소프트웨어, T서치, 아트머니와 닮은 면이 있다. 다양한 옵션과 함께 사용자가 입력한 값을 검색하여 사용자가 컴퓨터 메모리를 통해 검색과 정렬을 가능케 한다. 치트 엔진은 또한 치트 엔진과는 독립적으로 운용 가능한, 독립적인 트레이너를 생성할 수도 있으며 다른 사용자의 요청을 통해서나 사용자 포럼을 통해 발견된다.
  • 오프라인엣어 설치 가능한 버전은 7.2이며, 여기를 클릭하여 다운로드 받을 수 있다. ( 나무 위키 참조 )



댓글

이 블로그의 인기 게시물

[QT] 5.15.2 버전 다운로드와 설치하기

1. 버전 5.15.2를 설치하기 위해 QT 다운로드 사이트 에 접속하였으나 실행파일이 존재하지 않는다. 가장 최신의 실행파일은 ver5.14.2 이므로 일단 이것을 다운받아서 설치한다. ( 참고 사이트 - https://sloth-code.tistory.com/6#comment16833678 ) 다운 사이트  - https://bio.nic.funet.fi/pub/mirrors/download.qt-project.org/archive/qt/5.14/5.14.2/  ------------- 버전이 맞지 않으니 재 설치한다. 2.  5.15.2 버전에는 실행파일 exe가 없고 zip과 tar.gz 파일만 존재한다. ( https://bio.nic.funet.fi/pub/mirrors/download.qt-project.org/archive/qt/5.15/5.15.2/ ) OFFLINE_README.txt를 읽어보면 5.15 버전부터는 오픈 소스 오프라인 설치를 이용할 수 없다고 한다. 오프라인 설치를 원할 경우 다음 사이트 참조하라고 한다.  ( 원본:  The Qt Company offering changes, open source offline installers are not available any more since Qt 5.15. Read more about offering changes in the https://www.qt.io/blog/qt-offering-changes-2020 blog. If you need offline installers, please consider our new Qt for Small Business offering: https://www.qt.io/blog/available-now-qt-for-small-businesses ) - https://www.qt.io/blog/available-now-qt-for-small-businesses ...

[ WorkSpace ] 라스트마일 딜리버리

'걸음마 단계' 배달로봇...2030년 50조원 규모로 커진다 기사 요약 ( 2021.6.30 ) 국토교통부는 '제1차 자율주행 교통물류 기본게획(2021 ~ 2025)'을 6월 29일 발표했으며 그 내용은 다음과 같다. 전국 고속도로와 시도별 주요 거점에서 자율주행 사용서비를 시작하기 위해 레벨4 수준의 자율 주행 대중 교통과 공유서비스를 개발, 경로/배차 최적화 등 운영 기술을 고도화할 방침임. 여객, 화물 분야에도 활성화, 화물차 군집주행 차량 및 운영시스템을 고도화 도심에서의 라스트마일 배송을 위한 소형택배차량, 로봇/드론 연계 기술 개발할 방침임. 자율 주행 로봇 개발 현황: 아래와 같은 특성은 있지만 원천 기술 개발 확보 해야 함. 우아한 형제들: 목표는 라스트마일시장 석권, 현대차/기아와 로봇개발 협업, 다양한 구조의 건물에서 층간 이동이 가능, 결제 수단 기능 탑재, 건대 및 광교에서 시범 운행중. 실외용. 배달로봇 딜리드라이브. KT: AI로봇 우편배송 서비스, 건물내에서 엘리베이터 탑승하여 우편물 배송 목적지로 이동. LG유프러스 + 만도: 자율주행 순찰 로봇 골리, LG 유플러스의 5G통신, MEC 인프라, 원격관제 솔루션 시스템 탑재, 실외용으로 순찰을 돌며 주야간 치안 사각지대를 탐지하여 분석하여 시흥시 통합 관제 플랫폼으로 실시간 전송.      ※ 라스트마일 - Last-mile delivery 시장: 물류/유통업계가 주목하는 것은 데이터. - 배송 효율화가 요구된다. 라스트 마일은 상품이 소비자에게 최종 배송되는 마지막 과정을 의미한다.  - 롯데마트는 릴레이 배송 서비스를 잠실점에서 시범 운행중이며, 릴레이 배송은 마지막 현관까지 구간 라스트마일 배송을 하는 플렉서를 별도로 배치했다. 플렉서는 본인 담당 공간에서 기다리다가 트럭이 오면 물건을 꺼내 최종 목적지까지 오토바이, 도보 등으로 배달한다. 배송기사와 플렉서의 역할을 분리하여 배달 건수를 늘릴수 있는 방식이다.  - 대형마트, 편의...

[NEW-JOB] 시작하기

 업종의 변환이란,, 하던 일과 사람과 환경이 달라지는 것, 가장 크게는 소속된 업황이 달라지는 것. 업의 변환이 시작된지 3주가 지났다. ( 게다가 이글을 완성하지 못하고 한달이 지났다. ) 생생한 지금까지의 느낌을 적어보려고 한다. 1. 빌드 환경의 변화 - 운영 OS는 윈도우와 리눅스를 사용하고 각 OS에 따라 빌드 환경은 정해져 있었다. 지금은? 오픈 소스를 이용하게 되는 현업의 빌드 환경은 멀티 플랫폼에서 개발가능하고 멀티 플랫폼에서 사용가능한 구조로 만들어져 있다. 오픈 소스를 사용하는 이상 이러한 환경은 그대로 유지해야 한다. 멀티 플랫폼이 가능한 소스 구성은 현재 소프트웨어 산업계의 흐름이기도 하다. 결국 언젠가는 가야 하는 것이다.  2. 업무 환경의 변화 - 5년 신건물에서 10년 구건물로 이전하였으니 화장실은 대만 화장실 냄새가 난다. 습한 기운이 엄습해있다. 사무실은 한달후 청소하여 자리를 잡았으나 여기 또한 습하고 공기 순환되지 않아 9월 28일 현재 선풍기를 돌리는 중이다. - 랩실은 없고, 컴퓨터만 있고. - 오픈 소스분석으로 인해 나의 영역 밖에 있던 기술들을 하나씩 학습하고 있으며 기회와 지루함이 공존한다.  3. 소속된 조직의 변화 - 10여명의 단촐한 인력을 탈피하고 타 회사 직원들과 3주째 같이 일하고 있는 더 단촐하게 일하고 있다. 협업하는 인력은 20킬로 이상의 다른 동네에 있고, 라인이 포함된 신규 건물에 한달내에 이사하게 된다. ( 타 회사 직원들은 이사를 갔고, 내 조직의 인원들로 대체되었다. )  - 회사를 운영하는데에 있어 필요한 인력이 있는데 그들은 지금 흩어져 있거나 모집중이다. 또한 여러 조직에 몸담고 있는 사람들도 있다.  4. 내가 속한 산업의 변화 - 반도체와 디바이스에서 자동차 센서와 자율 주행으로 업종이 변화되었다. 센서와 인지, 모터 제어 등은 전전 산업에서도 종종 사용하던 분야였지만 그때와는 많은 것이 변화되었고 전 산업의 기술과 접목되었다고 볼 수 있...