y0u_bat

[RAV <-> RAW] 계산 본문

Rerversing

[RAV <-> RAW] 계산

유뱃 2016. 8. 10. 04:31



VirtualAddress : 프로세스 가상메모리의 절대주소를 의미합니다. 프로세스가 로딩되어있을때 가상메모리의 절대주소를 의미합니다.

RAV ( relative virtual address ) : Imagebase + RAV = VA(virtualaddress) 가상메모리에서의 상대주소입니다. ImageBase에서 얼만큼 떨어져 있는지 그런겁니다.

RAW( File offset ) : 파일 오프셋입니다.




* 이제부터 여기서 나오는 VirtualAddress는 IMAGE SECTION HEADER에 있는 VirtualAddress 입니다.* //헷갈려하지마세요.


VirtualAddress : 메모리에서 섹션의 시 주소 (RVA)
PointerToRawData : 파일에서 섹션의 시작 위치
SizeOfRawData : 파일에서 섹션이 차지하는 크기
VirtualSize : 메모리에서 섹션이 차지하는 크기

RAW = RAV - VirtualAddress + PointerToRawData
RAV = RAW + VirtualAddress - PointerToRawData
RAW - PointerToRawData  =  RAV - VirtualAddress 





RAV가 0xC8C8 일때  RAW(File Offset)은?


RAV가 0xC8C8일때 해당값이 속해있는 섹션은 .rsrc ( 0x100B000~0x1014000 ) 입니다. 

여기서 ImageBase은 0x1000000 입니다.

속해있는 섹션을 찾았으면 위에 있는 식을 이용해서 RAW을 구하면 됩니다.


RAW = RAV(C8C8) - VirtualAddress(B000) + PointerToRawData(8400) = 9CC8





RAV가 ABA8일때 RAW(File Offset)은?


RAV값이 속해있는 섹션은 .data 섹션입니다. 

위에 식을 이용해서 RAW을 구하면 됩니다


RAW = RAV(ABA8) - VirtualAddress(9000) + PointerToRawData(7C00) = 97A8 ( x )


97A8이 RAW가 될수없는 이유는 RAV는 .data 섹션에 해당되는데 파일옵셋은 97A8 즉 .rsrc 섹션에 해당되서 입니다.

RAV 와 RAW 섹션이 다르면 말이 안됩니다. 이경우에는 "해당 RAV에 대한 RAW 값은 정의 할수없다" 라고 합니다.

이런 이상한 결과가 나온 이유는 두번째 섹션의 VirtualSize 값이 SizeOfRawData 값보다 크기 때문입니다.












참고 도서 - 리버싱핵심원리


'Rerversing' 카테고리의 다른 글

[Rerversing.kr] Easy_Keygen  (0) 2016.04.04
Comments