
지금까지 배운 모든 AMSI 패치를 문서화했습니다.
지금까지 배운 모든 AMSI 패치를 문서로 정리했습니다


a. jne 호출 전의 모든 명령이 성공하면 jne 를 통해 amsi!AmsiOpenSession+0x4c 진입을 건너뛰기
=> 결국 amsi!AmsiCloseSession 으로 직접 이동하게 됩니다.
amsi!AmsiOpenSession 에서 jne를 사용하는 기법을 보여준 @D1rkMtr에게 감사드립니다 Github. 저는 그의 AMSI 패치 코드 템플릿을 사용했고, 지금까지 제가 작업한 다른 방법들을 추가했습니다.b. amsi!AmsiOpenSession 시작 부분에 _c3_를 직접 붙여넣어 _ret_를 통해 amsi!AmsiOpenSession+0x4c (여러 검사 요청을 상호 연관시킬 수 있는 세션을 엽니다) 진입을 건너뛰기
=> 결국 amsi!AmsiCloseSession 으로 직접 이동하게 됩니다.
a. amsi!AmsiScanBuffer 시작 부분에 _c3_를 직접 붙여넣어 _ret_를 통해 amsi!AmsiScanBuffer 의 주요 명령 실행을 건너뛰기
b. amsi!AmsiScanBuffer 시작 부분에 \\xB8\\x57\\x00\\x07\\x80\\xC3 ('mov eax, 0x80070057; ret')를 직접 붙여넣어, amsi!AmsiScanBuffer 에서 실제 검사를 수행하고 반환하는 분기를 건너뛰기
여기서 HRESULT 값(정확히는 오류 값)은 'E_INVALIDARG'입니다 (출처: https://pre.empt.dev/posts/maelstrom-etw-amsi/#Historic_AMSI_Bypasses)
c. amsi!AmsiScanBuffer 시작 부분에 \\xB8\\x05\\x00\\x07\\x80\\xC3 ('mov eax, 0x80070005; ret')를 직접 붙여넣어, amsi!AmsiScanBuffer 에서 실제 검사를 수행하고 반환하는 분기를 건너뛰기
여기서 HRESULT 값(정확히는 오류 값)은 'E_ACCESSDENIED'입니다 (출처: https://pre.empt.dev/posts/maelstrom-etw-amsi/#Historic_AMSI_Bypasses)
d. amsi!AmsiScanBuffer 시작 부분에 \\xB8\\x06\\x00\\x07\\x80\\xC3 ('mov eax, 0x80070006; ret')를 직접 붙여넣어, amsi!AmsiScanBuffer 에서 실제 검사를 수행하고 반환하는 분기를 건너뛰기
여기서 HRESULT 값(정확히는 오류 값)은 'E_HANDLE'입니다 (출처: https://pre.empt.dev/posts/maelstrom-etw-amsi/#Historic_AMSI_Bypasses)
e. amsi!AmsiScanBuffer 시작 부분에 \\xB8\\x0E\\x00\\x07\\x80\\xC3 ('mov eax, 0x8007000E; ret')를 직접 붙여넣어, amsi!AmsiScanBuffer 에서 실제 검사를 수행하고 반환하는 분기를 건너뛰기
여기서 HRESULT 값(정확히는 오류 값)은 'E_OUTOFMEMORY'입니다 (출처: https://pre.empt.dev/posts/maelstrom-etw-amsi/#Historic_AMSI_Bypasses)
JE에서 JMP로 변경하여 바로 반환되도록 하기... : https://github.com/ZeroMemoryEx/Amsi-Killer