
이벤트 기반 멀티코어 프로세스 디버깅, 추적 및 조작 프레임워크.
libptrace는 이벤트 기반 프로세스/스레드 디버깅, 추적 및 조작 프레임워크입니다. C로 작성되었으며 Python 2.7 및 3.7 바인딩을 제공합니다.
라이브러리로 사용되도록 설계되었습니다. API는 크로스 플랫폼 지원을 염두에 두고 설계되었습니다. 현재 버전은 32비트 및 64비트(wow64 지원) Windows에서만 실행되지만, 설계와 추상화는 동일한 API 아래에서 다른 플랫폼과 원격 디버깅 지원도 추가할 수 있도록 되어 있습니다.
멀티 코어/스레드를 인지하며, 여러 이벤트 루프를 동시에 실행하는 데 쉽게 사용할 수 있습니다. 프로세스 그룹이나 파이프라인 디버깅, 또는 많은 수의 프로세스 추적은 실행 코어를 늘려 확장할 수 있습니다.
libptrace의 초기 버전은 2006년 대학 재학 중에 작성했으며, 2011년 당시 고용주였던 Immunity Inc.에서 전체 사용을 위해 라이선스를 재부여했습니다. 이 시기 프레임워크는 Immunity Debugger에 통합될 예정이었지만, 저는 항상 프레임워크를 분리하여 독립적으로 사용할 수 있도록 신경 썼습니다.
이 목표를 가지고 Immunity에서 많은 개발이 이루어졌으며, 근무 시간 중에도 적극적으로 개발할 수 있었고 프레임워크가 더 성숙해지는 것을 볼 수 있었기에 감사하게 생각합니다. 멀티 코어를 인지하도록 대부분을 재설계하고, Python 바인딩을 제공하며, 더 나은 추상화를 만들었습니다.
x64dbg가 출시되면서 더 이상 Immunity Debugger에 작업하지 않고 다른 일에 집중하기로 결정했습니다. 이로 인해 libptrace 개발도 중단되었고, 이후 몇 년 동안 내부 git 저장소에 먼지만 쌓였습니다. Immunity Inc.가 Cyxtera Technologies에 인수된 후, 지금은 Cyxtera Cybersecurity Inc. 산하에서 LGPL 버전 2.1로 프로젝트를 공개하기로 결정하여 채택과 추가 개발이 이루어지길 바랍니다.
이번 공개를 가능하게 해준 Immunity Inc., Cyxtera Technologies, Cyxtera Cybersecurity Inc.에 진심으로 감사드립니다. 또한 이번 공개를 여러 관리 계층을 통해 추진하고, 관료적 절차로부터 저를 보호해준 Dave Aitel에게 특별히 감사드립니다. 제 노력이 헛되이 사라지고 목적 없이 방치되는 것은 매우 슬펐을 텐데, 내부에서 개발된 libptrace를 오픈 소스로 공개하려는 그들의 의지가 없었다면 그렇게 되었을 것입니다.
프레임워크를 사용하거나 작업해준 여러 동료들, 특히 Massimiliano Oldani, Roderick Asselineau, Christos Kalkanis에게도 감사드립니다. 또한 제가 사용하게 된 intrusive AVL 트리와 연결 리스트 구현을 제공한 Lennert Buytenhek에게도 감사드립니다.
프로젝트에 어떤 작업도 이루어지지 않은 지 4년이 넘었지만, 사람들이 유용하게 사용하기를 바랍니다. 디자인과 소스 코드가 비교적 깨끗하며, 현재 시점에서 프레임워크를 확장하고 다른 플랫폼으로 이식하기가 상대적으로 쉽다고 생각합니다. 언젠가 이 프로젝트가 일관된 단일 API 아래에서 진정한 크로스 플랫폼 디버깅 라이브러리로 발전하기를 바랍니다.
마지막으로, 이 프로젝트를 세상을 떠난 제 딸 Yuzuyu Huizer에게 바칩니다. 언젠가 다시 만나길 바랍니다. 사랑해요.
-- Ronald Huizer [email protected]
현재 지원되는 빌드 방법은 MinGW와 CMake를 사용한 크로스 컴파일입니다. 빌드 시스템은 Ubuntu 19.04에서 테스트했습니다.
32비트 설치 프로그램은 다음 명령어로 빌드할 수 있습니다:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=mingw-w64-x86.cmake .
make
makensis libptrace-setup.nsi
64비트 설치 프로그램은 다음 명령어로 빌드할 수 있습니다:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=mingw-w64-x64.cmake .
make
makensis -DUSE64 libptrace-setup.nsi
위 빌드 단계를 수행한 후, 32비트 설치 프로그램은 libptrace-setup32.exe에, 64비트 설치 프로그램은 libptrace-setup64.exe에 있습니다.
설치 프로그램은 설치된 Python 버전이 32비트인지 64비트인지 자동으로 감지합니다. 발견된 버전은 설치 프로그램에서 제공되고, 발견되지 않은 버전은 비활성화됩니다.
릴리스 다운로드는 여기에서 찾을 수 있습니다.
doc/ 디렉터리는 절망적으로 구식입니다. 더 최신 문서를 위한 출발점으로 포함되었으며, 사용하지 마십시오.
python/scripts 디렉터리에서 여러 예제 스크립트를 찾을 수 있습니다. 이 스크립트는 Program Files\Immunity Inc\libptrace 또는 32비트 버전의 경우 Program Files (x86)\Immunity Inc\libptrace에 설치됩니다.
이 예제들은 프레임워크를 완벽하게 보여주지는 않지만, 프레임워크를 사용하려는 사람에게 좋은 출발점을 제공합니다. C API는 잘 문서화되어 있지 않지만, unittests/windows 디렉터리에서 몇 가지 예제를 찾을 수 있습니다. Python 바인딩이 포함된 python/ 디렉터리도 좋은 개요를 제공합니다. 마지막으로 include/libptrace 디렉터리에는 공개 헤더 파일이 포함되어 있어 API 함수 목록을 제공합니다.
현재 Python API는 C API의 상당히 제한된 하위 집합입니다.
예를 들어, 실행 파일에서 RegOpenKeyExW 호출을 추적하는 일반적인 워크플로는 다음과 같습니다:
import _ptrace
def bp_handler(bp, thread):
(key, subkey, options, sam, result) = _ptrace.cconv.args_get(thread, "%u%p%u%u%p")
subkey = thread.process.read_utf16(subkey)
print('T{}: RegOpenKeyEx({}, "{}", 0x{:08x}, 0x{:08x}, 0x{:08x})'
.format(thread.id, key, subkey, options, sam, result), end='')
def attached_handler(process):
bp = _ptrace.breakpoint_sw("advapi32!RegOpenKeyExW", bp_handler)
process.breakpoint_set(bp)
handlers = _ptrace.event_handlers()
handlers.attached = attached_handler
_ptrace.execv(r"C:\Windows\Notepad.exe", [], handlers, 0)
_ptrace.main()
RegOpenKeyExW의 반환 값도 필요한 경우, 함수 호출의 반환 주소에 중단점을 설정하는 것이 가장 쉽습니다. 이렇게 하면 함수 종료 경로를 정적으로 결정하기 위한 코드 분석이 필요하지 않습니다:
def bp_end_handler(bp, thread):
print("=", _ptrace.cconv.retval_get(thread))
def bp_handler(bp, thread):
(key, subkey, options, sam, result) = _ptrace.cconv.args_get(thread, "%u%p%u%u%p")
subkey = thread.process.read_utf16(subkey)
print('T{}: RegOpenKeyEx({}, "{}", 0x{:08x}, 0x{:08x}, 0x{:08x})'
.format(thread.id, key, subkey, options, sam, result), end='')
retaddr = _ptrace.cconv.retaddr_get(thread)
if thread.process.breakpoint_find(retaddr) is None:
bp_end = _ptrace.breakpoint_sw(retaddr, bp_end_handler)
thread.process.breakpoint_set(bp_end)
저작권 상황은 각 파일에 명확히 표시되어 있습니다. 대부분 Cyxtera Cybersecurity Inc., Ronald Huizer, 또는 둘 모두가 보유하고 있습니다. 일부 파일은 Lennert Buytenhek과 같은 제3자 저작권 보유자가 있습니다.
GNU Lesser General Public License 버전 2.1에 따라 배포됩니다. 자세한 내용은 COPYING 및 COPYING.LESSER를 참조하십시오.