>백엔드 개발 >Golang >CGO 생성 DLL의 반사 로딩

CGO 생성 DLL의 반사 로딩

王林
王林앞으로
2024-02-08 21:00:13514검색

反射加载 CGO 生成的 DLL

질문 내용

Reflective DLL 로딩을 해보고 싶어서 간단한 메시지 상자를 작성했습니다.

으아악

다음 명령을 사용하여 dll(cgo/golang이 포함된 메시지 상자)을 생성했습니다. go build --buildmode=c-shared main.go

loadlibrary()를 사용하여 dll을 로드하고 processattach에서 내보낸 함수를 실행하면 작동하지만(메시지 상자 팝업) 재배치 및 iat를 해결하여 dll의 반사 로딩을 구현하려고 하면 작동하지 않습니다. 기본 재배치가 수행되고 iat가 go 런타임을 초기화하는 데 사용되는 .rdata의 빈 섹션으로 설정되는 것 같습니다(nt 헤더의 진입점에서 초기화됨). 가져오기 문제를 해결하는 데 사용한 코드 조각은 다음과 같습니다.

으아악

이 작업을 수행한 후 onprocessattach 함수를 찾는 eat 문제를 해결했는데, go 런타임이 초기화되지 않았기 때문에 직접 실행하면 분명히 작동하지 않지만 초기화하려고 하면 위에서 언급한 것처럼 프로그램이 충돌하게 됩니다. 유효하지 않은 바이트 블록을 읽으려고 했기 때문에 예외_액세스_위반이 발생합니다.

진입점 분해: mov rax, qdword ptr ds:[주소] mov dword ptr ds:[rax]

덤프에 있는 주소에 따르면 비어 있는 것 같습니다. 00 00 00 00 00 00 00 00 00 [..]

원본 DLL에는 값이 있지만 90 2b c5 ea 01 [...]

.rdata에서 이러한 바이트를 null로 설정하고 있다는 것을 알고 있지만 재배치를 수행할 때 왜 이런 일이 발생하는지 알 수 없습니다. 아마도 go 런타임이 내가 하려는 작업에 적합하지 않을 수도 있습니다. 또는 다른 것?


정답


해결책 여기에 해결 방법을 게시하는 것을 잊었습니다. 다음 줄에 오류가 나타납니다

으아악

단지 손가락 오류였습니다. 쉼표 대신 기호를 추가했어야 했기 때문에 주소가 무효화되었습니다.

위 내용은 CGO 생성 DLL의 반사 로딩의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제