Zasm은 Zydis를 백엔드로 사용하여 X86-64 코드를 조작하고 생성하기 위해 매우 유연하고 가벼운 라이브러리를 제공합니다. Zasm은 모든 것을 지침, 데이터, 레이블, 섹션 등과 같은 노드로 저장하여 코드를 바이너리로 직렬화하기 전에 코드를 쉽게 조작/변환 할 수있는 방법을 제공합니다. API는 ASMJIT에서 영감을 얻었으므로 ASMJIT를 사용한 경우 매우 친숙해집니다.
내 프로젝트 중 일부는 Zydis와 Asmjit을 사용하여 Zydis로 처음 디코딩 된 지시 사항을 사용한 다음 수정 된 코드를 다시 인코딩/재배치하기 전에 지침/분기를 처리/분석 할 수 있도록 Asmjit의 빌더에 넣었습니다.이 접근법에 대한 몇 가지 다운 사이드가 추가로 설명됩니다. Zydis는 최근 Zasm으로 이어지는 지침을 인코딩 해야하는 것과 동일한 구조/데이터를 사용하는 방법을 도입했습니다. 이 라이브러리는 앞에서 언급 한 예와 같은 다양한 것들에 사용할 수있는 더 높은 수준의 어셈블러/디코더가되는 것을 목표로합니다.
Zasm과 ASMJIT의 강한 차이점은 피연산자 액세스, 숨겨진 레지스터 사용, 수정 된 CPU 플래그와 같은 정확한 명령 데이터에 중점을 둡니다.이 모든 것이 ASMJIT에서는 일부 예외를 제외하고 ASMJIT에서 누락되거나 잘못 될 수 있습니다. Zasm은 어떤 식 으로든 ASMJIT를 대체하려고하지 않으며 목표가 다릅니다.
Zasm의 두 번째 이유는 Zydis 인코더가 매우 낮은 레벨이기 때문에 라벨과 같은 것들이 없기 때문에 Zasm은 지침을 조립하기위한 높은 수준의 클래스를 제공하고 일반 어셈블러와 같은 레이블을 제공합니다.
Zasm은 CMKR과 함께 CMAKE를 사용하여 cmakelists.txt의 유지 보수를 단순화합니다. 루트 디렉토리의 터미널의 다음 명령을 사용하는 것만 큼 쉬워야합니다.
cmake . -B build
cmake --build build --config Release
테스트 사용을 구축하려는 경우
cmake . -B build -DZASM_BUILD_TESTS=ON
프로그램은 모든 데이터를 보유하고 있으며 이중 연결 목록 역할을하는 컨테이너입니다. 지침, 레이블, 데이터, 섹션 등은 사용자가 매우 쉽게 제거/삽입/재개 할 수있는 노드로 저장됩니다.
어셈블러 클래스는 생성 된 멤버 기능을 제공하여 지정된 커서 위치에서 프로그램에 명령/데이터/레이블을 생성합니다. mov rax, -1 해당하는 것은 asssembler.mov(operands::rax, operands::Imm(-1));
Serializer 클래스는 프로그램 노드를 이진으로 직렬화하고 결과 상태를 저장합니다. 성공적인 직렬화 후 사용자는 레이블 주소, 재배치 정보, 섹션 데이터 등과 같은 결과 바이너리 코드 및 데이터를 쿼리 할 수 있습니다.
이진 데이터를 프로그램에서 직접 사용하거나 저장할 수있는 명령어 객체로 이진 데이터를 디코딩합니다.
이 프로젝트는 여기에서 찾을 수있는 몇 가지 기본 예제를 제공합니다. Zasm이 제공하는 거의 모든 것에 대한 다양한 테스트가 있습니다. 먼저 테스트에 결제가 누락 된 경우 좋은 예를 제공합니다. 여전히 궁금한 점이 있으면 Discord를 통해 저희에게 연락 할 수 있습니다.