ASM을 C로 변환(리버스 엔지니어 아님)
구글 검색을 해보니 기본적으로 그런 질문을 한 질문자를 비웃는 수준의 경솔한 답변들이 눈에 띕니다.
마이크로칩은 소스코드를 무료로 제공합니다(아니오일 경우를 대비해 여기에 게시하고 싶지 않습니다).기본적으로 google AN937, 첫번째 링크를 클릭하면 "source code" 및 ziped file"에 대한 링크가 있습니다.그건 ASM에 있는데 그걸 보면 눈이 마주치기 시작합니다.제가 따라 할 수 있도록 c타입 언어와 비슷한 것으로 바꾸고 싶습니다.다음과 같은 선이 있기 때문입니다.
GLOBAL _24_bit_sub
movf BARGB2,w
subwf AARGB2,f
아마 아주 단순할 것입니다만 저에게는 아무 의미가 없습니다.
자동화된 ASM-C 번역기가 있을지도 모르지만 내가 찾을 수 있는 것은 불가능하다고 말하는 사람들뿐입니다.솔직히 불가능한 일은 불가능합니다.두 언어 모두 구조가 있고 그 구조는 확실히 번역이 가능합니다.
어셈블러로 c 프로그램을 만들 수 있습니다.문제는 그것이 여러분이 생각하고 있는 것처럼 보이지 않을 수도 있고, 그럴 수도 있다는 것입니다.내 PIC는 녹슬었지만 다른 조립기를 사용하면 당신이 가지고 있었다고 말합니다.
add r1,r2
C에서는 다음과 같이 말합니다.
r1 = r1 + r2;
좀 더 읽을 수 있을 겁니다값이 메모리에서 레지스터로 이동하고 레지스터가 재사용되고 있기 때문에 변수 이름에 대한 감각을 잃게 됩니다.만약 두 개가 누적기와 또 다른 누적기를 등록하고 있는 오래된 사진들에 대해 이야기하고 있다면, 음, 변수들이 대부분 기억에 있었기 때문에 그것은 사실 더 쉬울 수도 있습니다, 당신은 주소를 봅니다, 예를 들어.
q = mem[0x12];
e = q;
q = mem[0x13];
e = e + q;
mem[0x12] = e;
길고 길게 끌리지만 mem[0x12] = mem[0x12] + mem[0x13]임이 분명합니다;
이러한 메모리 위치는 레지스터가 많은 프로세서의 컴파일된 C 코드처럼 뛰어다니지 않을 가능성이 높습니다.이 사진을 통해 변수를 쉽게 파악한 다음 검색하고 파일 전체에 걸쳐 이름을 지정하기 위해 교체할 수 있습니다.
당신이 찾고 있는 것을 정적 이진 변환이라고 하는데, 반드시 한 이진에서 다른 이진으로의 변환(한 프로세서에서 다른 프로세서로의 변환)이 아니라 이 경우에는 그림 이진에서 C로의 변환입니다.이상적으로 앱 노트에 나와 있는 어셈블러를 가지고 마이크로칩 도구를 사용하여 바이너리로 조립한 후 번역을 하는 것이 좋습니다.동적 이진 변환을 수행할 수도 있지만 그 중 하나를 찾을 가능성은 훨씬 낮으며 일반적으로 C가 아니라 하나의 이진에서 다른 이진으로 변환됩니다.월마트에서 팩맨과 갈라가와 함께하는 15달러짜리 조이스틱이 어떻게 작동하는지 궁금하신 적 있으신가요?아케이드의 롬은 정적 바이너리 번역을 사용하여 변환되었고, 최적화되고 정리되었으며, C 또는 핸드헬드 박스에서 새로운 대상 프로세서를 위해 컴파일된 다른 중간 언어를 사용했습니다.나는 모든 것이 이런 식으로 이루어졌다고 생각하지는 않지만 몇몇은 그렇게 되었다고 꽤 확신합니다.
백만 달러짜리 질문, 사진에 대한 정적인 이진 번역기를 찾을 수 있습니까?누가 알겠어요, 아마 직접 써야 할 거예요.그리고 그것이 무엇을 의미하는지 추측해보세요. 당신이 disassembler를 작성하고, add r0,r1과 같은 네이티브 어셈블러 구문의 명령어로 분해하는 대신, 당신은 당신의 disassembler를 r0=r0+r1 출력하게 됩니다. 당신이 이 disassembler를 완성할 때, 당신은 그림 조립 언어를 너무 잘 알고 있을 것이고, 당신은 asm to C 번역기가 필요하지 않을 것입니다.당신은 닭과 달걀에 문제가 있습니다.
컴파일된 프로그램에서 정확하게 동일한 소스 코드를 다시 가져오는 것은 기본적으로 불가능합니다.그러나 디컴파일러는 컴퓨터 과학(예: 박사 프로젝트였던 dcc 디컴파일러)에서 연구의 한 분야였습니다.
어셈블리 코드에 패턴 매칭을 수행하고 동등한 C 코드를 생성하기 위해 사용할 수 있는 다양한 알고리즘이 있지만, 모든 입력에 대해 잘 작동하는 일반적인 방법으로 이를 수행하는 것은 매우 어렵습니다.
일반화 디컴파일러에서 반 최근 오픈 소스 작업에 대해 부메랑을 확인할 수 있습니다.
저는 한때 x86 어셈블리 코드로 코드화된 심각한 알고리즘이 지적 재산의 상당 부분을 차지하는 프로젝트를 수행한 적이 있습니다.코드를 내장된 시스템으로 포팅하기 위해, (내가 아닌) 해당 코드의 개발자는 MicroAPPL이라는 제품의 도구를 사용했습니다 (내가 올바르게 기억하는 경우):
저는 그 도구가 얼마나 잘 작동했는지 매우 놀랐습니다.
반면에, 저는 "물어봐야 한다면, 당신은 그것을 감당할 수 없다"는 유형의 것이라고 생각합니다. (프로젝트를 1달러에 처리하는 약 4개 라인의 조립품으로 일회성으로 전환하는 것에 대한 가격 범위).
그러나 공급업체로부터 받는 어셈블리 루틴은 종종 C에서 호출할 수 있는 함수로 패키지화됩니다. 따라서 루틴이 원하는 대로 실행되는 한(사용하고 싶은 프로세서에서), 단순히 C에서 호출하는 라이브러리 함수일 뿐입니다.
조립 코드를 C로 결정적으로 변환할 수 없습니다.인터럽트, 자체 수정 코드 및 기타 낮은 레벨의 것들은 C에서 인라인 어셈블리 외에 다른 표현이 없습니다.조립부터 C 공정까지 어느 정도밖에 작동할 수 없습니다.결과적인 C 코드는 말할 것도 없이 실제로 조립 코드를 읽는 것보다 더 이해하기 어려울 것입니다.이것을 C에서 어셈블리 코드의 재구현을 시작하기 위한 근거로 사용하지 않는 한, 어느 정도 유용합니다.IDA용 Hex-Ray 플러그인을 확인합니다.
네, 엔지니어 어셈블러 코드를 좋은 품질의 C로 역설계하는 것은 매우 가능합니다.
저는 마이크로 APL에 근무하고 있는데, 이 회사는 어셈블러 코드를 C로 변환하기 위해 Relogix라는 툴을 생산하는 회사입니다.다른 게시물 중 하나에서 언급되었습니다.
저희 웹사이트의 예를 살펴보세요.
http://www.microapl.co.uk/asm2c/index.html
자동 ASM-C 번역기가 있을 텐데 불가능하다고 하는 사람들밖에 없어요.솔직히 불가능한 일은 불가능합니다.
아니야.컴파일은 정보를 잃습니다: 최종 객체 코드에는 C 소스 코드보다 더 적은 정보가 있습니다.디컴파일러는 무에서 마법처럼 정보를 만들 수 없기 때문에 진정한 디컴파일링은 불가능합니다.
불가능한 것이 아니라, 매우 어렵습니다.숙련된 어셈블리와 C 프로그래머가 이 작업을 수행할 수도 있고, 디컴파일러를 사용하는 방법도 있습니다.이들 중 일부는 변수와 메서드의 이름을 변경해야 할 수도 있지만 ASM을 C로 변환하는 데 상당히 유용합니다.
x86 아키텍처에서 사용할 수 있는 디컴파일러 목록은 이 사이트를 확인하십시오.
이것을 확인하세요: 디컴파일러
디컴파일러는 컴파일러의 역연산을 수행하는 컴퓨터 프로그램에 부여된 이름입니다.즉, 상대적으로 낮은 수준의 추상화(일반적으로 사람이 읽을 수 있는 것보다 컴퓨터가 읽을 수 있도록 설계)로 정보를 포함하는 파일을 더 높은 수준의 추상화(일반적으로 사람이 읽을 수 있도록 설계)로 변환합니다.
쉽게 가능하지 않습니다.
가독성과는 별개로 커버 ASM의 큰 장점 중 하나는 "똑똑한" 프로그래밍 요령을 방지했다는 것입니다.
어셈블러에서 할 수 있는 일은 C에 직접적인 C 동치가 없거나 C에 구불구불한 구문을 포함하는 수많은 것들이 있습니다.
또 다른 문제는 대부분의 어셈블리에 바이트와 워드라는 두 가지의 호환 가능한 데이터 유형만 있다는 것입니다.int 및 float 등을 정의하는 언어 구성 요소가 일부 있을 수 있지만 메모리가 정의된 대로 사용되는지 확인하려는 시도는 없습니다.따라서 ASM 스토리지를 C 데이터 유형에 매핑하는 것은 매우 어렵습니다.
또한 모든 어셈블러 스토리지는 본질적으로 "구조물"입니다. 스토리지는 정의된 순서대로 배치됩니다(실행 시간의 변덕대로 스토리지가 주문되는 C와는 달리).많은 ASM 프로그램은 정확한 스토리지 레이아웃에 의존합니다. C에서 동일한 효과를 얻으려면 모든 스토리지를 단일 구조의 일부로 정의해야 합니다.
또한 사용되지 않은 명령도 많습니다(구 IBM 맨프레임 LA, 로드 주소, 명령어는 더 빠르고 오버플로우 레지스터가 필요 없는 간단한 산술을 수행하기 위해 규칙적으로 사용되었습니다).
기술적으로 C로 번역하는 것은 가능할지 모르지만 결과적으로 C 코드는 번역된 ASM 코드보다 가독성이 떨어집니다.
99% 보장합니다. 이 어셈블리어를 위한 준비된 컨버터가 없으므로 하나를 작성해야 합니다.ASM 명령을 C 기능으로 대체하여 간단히 구현할 수 있습니다.
movf BARGB2,w -> c_movf(BARGB2,w);
subwf AARGB2,f -> c_subwf(AARGB2,f);
이 부분은 쉽습니다 :) 그럼 각각의 기능을 구현해야 합니다.당신은 일을 쉽게 하기 위해 등록부를 글로벌로 선언할 수 있습니다.또한 not functions를 사용할 수 있지만 #defines, 필요에 따라 호출 기능을 사용할 수 있습니다.이렇게 하면 인수/결과 처리에 도움이 됩니다.
#define c_subwf(x,y) // I don't know this ASM, but this is some Substraction must be here
특별한 경우는 ASM 지시사항/라벨인데 #defines로만 변환이 가능할 것 같습니다.
CPU 고유의 일부 기능에 도달하면 재미가 시작됩니다.스택 작업, 일부 특정 IO/메모리 작업에 대한 단순 함수 호출일 수 있습니다.더 재미있는 것은 계산에 사용되는 프로그램 카운터 레지스터를 사용하거나 틱/지연을 사용/세는 작업입니다.
하지만 이 하드코어가 일어난다면 다른 방법이 있습니다.하드코어도 마찬가지입니다 :) 동적 재컴파일이라는 기술이 있습니다.많은 에뮬레이터에 사용됩니다.
ASM을 다시 컴파일할 필요는 없지만, 아이디어는 거의 비슷합니다.첫 단계부터 모든 #정의를 사용할 수 있지만 필요한 기능을 추가할 수 있습니다(PC/Tick 증가).또한 코드에 맞게 메모리/IO 관리자 등 가상 환경을 추가해야 합니다.
행운을 빌어요 :)
나는 PIC 어셈블리에 있는 책을 집어 들고 읽는 것을 배우는 것이 더 쉽다고 생각합니다.어셈블러는 수준이 매우 낮기 때문에 일반적으로 배우기가 매우 간단합니다.
m2c로 체크아웃
DOS/PMODEW 386 TASM Assembly 코드를 C 코드로 변환하는 Swift 툴
ASM에서 C로 기능을 변환하는 것은 어렵고 수작업으로 가능합니다.디컴파일러로 전체 프로그램을 변환하면 컴파일 중에 구조의 많은 부분이 손실되었기 때문에 이해가 불가능할 수 있는 코드를 얻을 수 있습니다.의미 있는 변수와 함수 이름이 없다면 결과적인 C 코드는 여전히 이해하기 매우 어렵습니다.
기본 프로그램의 C 컴파일러의 출력(특히 최적화되지 않은 출력)은 반복되는 패턴과 구조 때문에 C로 변환할 수 있습니다.
언급URL : https://stackoverflow.com/questions/1376856/convert-asm-to-c-not-reverse-engineer
'bestsource' 카테고리의 다른 글
| 루프가 있는 프로그램은 CTRL + C로 종료되지 않습니다. (0) | 2023.10.11 |
|---|---|
| Write-Host 문을 파일로 리디렉션 (0) | 2023.10.11 |
| Express.js 중첩 라우터와 함께 휴식 (0) | 2023.10.11 |
| ASP.NET 웹 양식 + ASP.NET Ajax 대 ASP.NET MVC 및 Ajax 프레임워크 자유도 (0) | 2023.10.11 |
| 워드프레스:한 페이지에 여러 페이지를 표시하려면 어떻게 해야 합니까? (0) | 2023.10.11 |