문제

C#을 통해 호출 할 수있는 x86 어셈블러와 같은 것이 있습니까? x86 지침을 문자열로 전달하고 바이트 배열을 다시 얻을 수 있기를 원합니다. 존재하지 않으면 어떻게 내 자신을 만들 수 있습니까?

분명히 - 나는 원하지 않습니다 전화 C#의 어셈블리 코드 - 지침에서 코드를 조립하고 바이트 어레이에서 기계 코드를 가져올 수 있기를 원합니다. 나는이 코드를 주입하여 (즉시 생성 될 것임) 다른 프로세스에 전적으로 주입 할 것입니다.

도움이 되었습니까?

해결책

개인 프로젝트에서 한 초기 프로토 타이핑의 일환으로, 나는 이와 같은 일을하기 위해 상당히 많은 코드를 썼습니다. 문자열이 필요하지 않습니다. x86 opcodes는 x86writer 클래스의 메소드입니다. 그것의 전혀 문서화되지 않았으며, 완전한 보장 범위가 거의 없지만, 관심이 있다면 새로운 BSD 라이센스에 따라 기꺼이 소스를 기꺼이 할 것입니다.

업데이트:좋아, 나는 그 프로젝트를 만들었다 - managed.x86

다른 팁

이 프로젝트 참조 :

https://github.com/zenlulz/memorysharp

이 프로젝트는 어셈블리로 작성된 FASM 어셈블러를 랩핑하고 Microsoft Coit Object로 컴파일 된 C ++ 프로젝트로 감싸고 다시 C#로 싸여 있습니다. 이것은 당신이 원하는 것을 정확하게 수행 할 수 있습니다 : x86/x64 어셈블리의 문자열이 주어지면 필요한 바이트가 생성됩니다.

반대가 필요한 경우 UDIS86 Disassembler의 포트가 있으며 C#로 완전히 포팅됩니다.

https://github.com/spazzarama/sharpdisasm

이것은 바이트 배열을 x86/x64의 명령어로 변환합니다.

보세요 불사조 Microsoft Research에서.

Cosmos는 또한 x86 코드를 생성하는 데 흥미로운 지원을 제공합니다.

http://www.gocosmos.org/blog/20080428.en.aspx

C#에서 직접 있지 않습니다. 그러나 외부 어셈블러를 사용하여 코드를 컴파일하는 자체 래퍼 클래스를 작성할 수 있습니다. 따라서 어셈블리를 파일에 작성하고 .NET 프레임 워크를 사용하여 어셈블러 프로그램을 실행하는 새로운 프로세스를 사용한 다음 System.IO를 사용하여 어셈블러가 생성 된 파일을 열어 바이트를 꺼낼 수 있습니다. 개울.

그러나, 당신이 그 모든 일을하더라도 보안 문제에 빠지지 않으면 놀랄 것입니다. 완전히 다른 프로세스에 실행 가능한 코드를 주입하면 각각의 새로운 OS마다 점점 줄어들고 있습니다. Vista와 함께, 나는 당신이 확실히 거부 당할 것이라고 믿습니다. 그리고 XP에서도 다른 프로세스를 기억하려고 할 때 액세스 거부 예외를 얻을 것이라고 생각합니다.

물론, 그것은 당신이 왜 이것을 해야하는지에 대한 의문을 제기합니다. 확실히 더 나은 방법이 있어야합니다 :).

나는 당신이 기본 Win32 DLL을 쓰는 것이 가장 좋을 것이라고 생각합니다. 그런 다음 DLL에서 내보낸 어셈블러에 함수를 쓸 수 있습니다. 그런 다음 C#을 사용하여 DLL에 동적으로 링크 할 수 있습니다.

이것은 문자열을 통과하고 바이트 어레이를 반환하는 것과 다릅니다. 이를 위해서는 x86 어셈블러 구성 요소 또는 masm.exe 주변의 래퍼가 필요합니다.

이것이 어떻게 작동하는지 모르겠지만 외부 컴파일러를 공시 한 다음 바이트 어레이에 생성 된 객체를로드 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top