64 비트 Linux 용 동적 라이브러리가 있으며 C ++ 코드에서 컴파일 된 많은 함수가 포함되어 있습니다. 코드는 오픈 소스가 아니지만 기능 중 하나가 어떻게 생겼는지 알고 있습니다. 여기에는 수학적 표현이 포함되어 있으며이 표현의 상수 중 하나를 변경하고 싶습니다.
나는 약간의 프로그래밍 기술을 가지고 있지만 컴파일 된 객체와 실행 파일을 살펴본 적이 없습니다. objdump -RDC
명령어로 얻은 어셈블리 코드의 관련 부분 은 다음과 같습니다. 관심 상수는 유형이어야하며 double
줄에서 곱하기 명령에 사용되는 것 같습니다 7e1cc
.
7e1b8: 00
7e1b9: f2 0f 59 74 24 78 mulsd 0x78(%rsp),%xmm6
7e1bf: f2 41 0f 59 f0 mulsd %xmm8,%xmm6
7e1c4: f2 0f 58 ce addsd %xmm6,%xmm1
7e1c8: f2 0f 58 ca addsd %xmm2,%xmm1
7e1cc: f2 0f 59 0d fc 0e 0c mulsd 0xc0efc(%rip),%xmm1 # 13f0d0 <typeinfo name for RestorableCreator<Model>+0x90>
7e1d3: 00
7e1d4: 48 81 c4 88 00 00 00 add $0x88,%rsp
7e1db: 66 0f 28 c1 movapd %xmm1,%xmm0
7e1df: c3 retq
파일에서이 상수의 위치를 찾고, 상수를 16 진수 형식으로 변환하고, 파일의 값을 16 진수 값으로 바꾸는 방법을 알고 싶습니다. 아무도 이것을하는 방법을 설명 할 수 있습니까? 또한 적절한 도구에 대한 제안도 정말 가치가있을 것입니다.
상수는 주소입니다 의미, 다음 명령어의 주소입니다 . 따라서 주소는 다음과 같습니다. (objdump는이를 인쇄합니다). 이제를 사용하여 바이너리의 헤더를 검사합니다 . 그러면 가상 주소 및 파일 오프셋과 함께 모든 섹션이 나열됩니다. 주소가 속한 섹션을 찾아 해당 섹션에서 얼마나 멀리 있는지 계산 한 다음 파일 오프셋을 추가합니다. 이제 16 진수 편집기를 사용하여 해당 오프셋에서 double을 나타내는 8 바이트를 가져옵니다. 예를 들어 바이트 배열을 이중으로 캐스팅하고 인쇄하는 간단한 C 프로그램과 같이 원하는 방법으로 사람이 읽을 수있는 형식으로 변환합니다.0xc0efc(%rip)
%rip
0x7e1d4
0xc0efc + 0x7e1d4 = 0x13F0D0
objdump -h
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다