디컴파일 툴 없이 이미지매직만으로 디컴파일된 이미지 만들기 기본입니다.
파일의 npTc 바이트를 읽어서 그려넣기 입니다.
특정 문자열 바이트의 위치 확인을 위해서 gnu_grep 을 썼습니다.
png9=test.9.png
#png=kbbank.png
rpng=resized_$png9
mpng=mod_$png
mpng9=$rpng.9.png
ww=$( convert $png9 -format "%[fx:w]" info: )
hh=$( convert $png9 -format "%[fx:h]" info: )
- 이미지의 가로 세로 해상도를 알아냅니다.
echo original
echo $png9
echo $ww x $hh
npTc=$( gnu_grep --byte-offset --only-matching --text npTc $png9 | cut -d":" -f1 )
나인패치 이미지에서 헥사에디터로 봤을때 npTc 부분의 위치를 확인합니다.
옵션이 길지요. gnu_grep 에서 정상동작합니다.
IDAT=$( gnu_grep --byte-offset --only-matching --text IDAT $png9 | cut -d":" -f1 )
IHDR=$( gnu_grep --byte-offset --only-matching --text IHDR $png9 | cut -d":" -f1 )
echo
echo hdr $IHDR
echo npTc $npTc
lnpTc=$((IDAT-npTc))
snpTc=$((npTc-1))
echo lnpTc $lnpTc
echo snpTc $snpTc
echo dat $IDAT
#header=$((IDAT-1))
#echo modifying
#convert $png -resize $ww"!x"$hh"!" $rpng
#convert $png9 -fill cyan -stroke red -strokewidth 5 -draw "circle 30,30 30,20" $rpng
#convert $png9 -roll +10x0 $rpng
cp $png9 $rpng
pxcnt=$((npTc+5))
pycnt=$((npTc+6))
npTc 위치에서 5번째 뒤에 오는게 가로에 찍히는 점의 갯수입니다.
(이미지의 북쪽에 늘이는 부분에 찍는 작은점 말이지요)
6번째가 세로축 점의 갯수이구요.
plt=$((npTc+19))
prt=$((npTc+23))
pup=$((npTc+27))
pdn=$((npTc+31))
19,23,27,31 번째 바이트는 남쪽과 동쪽에 문자 등이 들어갈 영역을 지정하는 위치입니다.
(우측과 하단 그러니까 2번쨰와 4번째 값은 좌표가 아닌 우측, 하단에서 시작해서 남겨지는 공간을 의미합니다. 좌표로 계산하려면 가로폭, 세로높이에서 각각 뺴줘야 합니다.)
pxx1=$((npTc+39))
pxx2=$((npTc+43))
pyy1=$((npTc+47))
pyy2=$((npTc+51))
이 위치 4개는 북쪽과 서쪽에 늘이는 부분의 좌표입니다.
복수로 존재할 수도 있는데 그 경우엔 가로 먼저 모두 나열되고 뒤에 세로가 찍힙니다. 4씩 늘여져 있는데 이게 이미지가 아주 크면 4바이트 모두를 계산해야 하지만 편의상 마지막 바이트만 잡았습니다.
xcnt=$( hexdump -s $pxcnt -n 1 $png9 | cut -c 9- )
dxcnt=$((16#${xcnt}))
ycnt=$( hexdump -s $pycnt -n 1 $png9 | cut -c 9- )
dycnt=$((16#${ycnt}))
ltv=$( hexdump -s $plt -n 1 $png9 | cut -c 9- )
dltv=$((16#${ltv}))
rtv=$( hexdump -s $prt -n 1 $png9 | cut -c 9- )
drtv=$((16#${rtv}))
upv=$( hexdump -s $pup -n 1 $png9 | cut -c 9- )
dupv=$((16#${upv}))
dnv=$( hexdump -s $pdn -n 1 $png9 | cut -c 9- )
ddnv=$((16#${dnv}))
xx1v=$( hexdump -s $pxx1 -n 1 $png9 | cut -c 9- )
dxx1v=$((16#${xx1v}))
xx2v=$( hexdump -s $pxx2 -n 1 $png9 | cut -c 9- )
dxx2v=$((16#${xx2v}))
yy1v=$( hexdump -s $pyy1 -n 1 $png9 | cut -c 9- )
dyy1v=$((16#${yy1v}))
yy2v=$( hexdump -s $pyy2 -n 1 $png9 | cut -c 9- )
dyy2v=$((16#${yy2v}))
dyy2v=$((16#${yy2v})) 이 명령은 16진수인 yy2v 변수를 10진수로 변환해서 dyy2v 에 저장합니다.
echo
echo "pxcnt" $pxcnt "dxcnt" $dxcnt
echo "pycnt" $pycnt "dycnt" $dycnt
echo
echo "plt" $plt "dltv" $dltv
echo "prt" $prt "drtv" $drtv
echo "pup" $pup "dupv" $dupv
echo "pdn" $pdn "ddnv" $ddnv
echo
echo "pxx1" $pxx1 "dxx1v" $dxx1v
echo "pxx2" $pxx2 "dxx2v" $dxx2v
echo "pyy1" $pyy1 "dyy1v" $dyy1v
echo "pyy2" $pyy2 "dyy2v" $dyy2v
www=$((ww+1))
hhh=$((hh+1))
ddrtv=$((www-drtv))
dddnv=$((hhh-ddnv))
가로 세로 늘여지는 픽셀을 대비해서 사이즈 늘이고 남겨지는 부분의 여백을 가로, 높이에서 빼서 좌표로 바꾸는 동작입니다.
echo $dltv $ddrtv
echo $dupv $dddnv
convert $rpng -bordercolor white -compose Copy -border 1x1 -stroke black -draw "line $dxx1v,0 $dxx2v,0" -draw "line 0,$dyy1v 0,$dyy2v" -draw "line $dltv,$hhh $ddrtv,$hhh" -draw "line $www,$dupv $www,$dddnv" $mpng9
이런 원본이 아래처럼 디컴파일 된 이미지가 보여집니다.
이게 꼭 필요한 것은 아닌데 그냥 학문적 호기심에서 시작했네요.
간단하게 정리하면 npTc 바이트의 구조를 알아서 hexdemp 로 바이트 값을 뽑고 이미지매직으로 그려주기 입니다.