덤프 이미지 분석은 내가 갑~ 왼쪽에 그림이 덤프 이미지입니다.
화욜날 간만에 댓글의 reinhard, zoops 횽들을 만나서 술을 한 잔 했습니다. 그러면서 이런저런 이야기를 하는데 reinhard 님께서 드미트리옹께서 크래시 덤프의 이미지를 만들어서 재미를 보고 계셨다는 이야기를 해주시더군요. 제가 또 드미트리옹과 페친 아니겠습니까? 드미트리옹의 책도 다 샀는데 눈 뜬 장님이었더군요. 책 표지 자체가 크래시 덤프 이미지였다는 사실을 알고는 충격과 공포에 빠졌습니다. 역시 사람은 아는만큼 보인다는 옛 이야기가 다 헛말이 아니었습니다. 핡~
그래서 저도 해봤습니다. 제가 가진 게임 덤프 파일 중에 하나를 돌려보았지요. 가운데 텅 빈 공간이 웬지 무한한 우주 공간에서 찰나의 순간을 살다가는 인간이라는 존재의 한없는 고독함을 나타내 주고 있는듯한 느낌입니다 ㅋㅋㅋ~
글을 보고는 바이너리를 이미지로 변환을 어떻게 하시는지 궁금해 하시는 분들이 계시는 듯 하여 소스 코드도 같이 올려드립니다. 지난 번에 작업한 스크립트 파일은 앞에 비트맵 헤더 붙이고 귀찮아서 뒤에다 0으로 전부 패딩을 넣었었는데요, 이번 버전은 비트맵 의도대로 중간 중간에 패딩을 넣도록 한 버전입니다. bin2img.py input.tar output.bmp 하시면 됩니다.
'''
Copyright 2014 YoungJin Shin <[email protected]>
bin2img.py input.tar output.bmp
'''
import math
import struct
import sys
BPP = 24
BPP_BYTES = BPP / 8
BMP_HDR_SIZE = 14
DIB_HDR_SIZE = 40
DPI = 2835
def GetImageFileSize(sz):
px = int(math.ceil(sz / float(BPP_BYTES)))
wpx = int(math.ceil(math.sqrt(px)))
xbytes = int(math.floor((wpx * BPP + 31) / 32.0) * 4)
return (wpx * xbytes, wpx, wpx, xbytes)
def GetBmpHeader(sz, w, h):
return struct.pack('=BBLHHLLLLHHLLLLLL'
, 0x42
, 0x4d
, sz + BMP_HDR_SIZE + DIB_HDR_SIZE
, 0
, 0
, BMP_HDR_SIZE + DIB_HDR_SIZE
, DIB_HDR_SIZE
, w
, h
, 1
, BPP
, 0
, sz
, DPI
, DPI
, 0
, 0)
def GetPadBuffer(sz):
pad = ''
for x in range(sz):
pad += struct.pack('=B', 0)
return pad
def BinaryToImage(bin_path, img_path):
inf = open(bin_path, 'rb')
buffer = inf.read()
inf.close()
buffer_size = len(buffer)
fsz, w, h, wbytes_pad = GetImageFileSize(buffer_size)
hdr = GetBmpHeader(fsz, w, h)
outf = open(img_path, 'wb')
outf.write(hdr)
wbytes = w * BPP_BYTES
pad_size = wbytes_pad - wbytes
pos = 0
for i in range(h):
remain = buffer_size - pos
if remain < wbytes:
pad_size = wbytes_pad - remain
outf.write(buffer[pos : pos + wbytes])
outf.write(GetPadBuffer(pad_size))
pos += wbytes
outf.close()
if __name__ == "__main__":
BinaryToImage(sys.argv[1], sys.argv[2])