binHack.perl
1.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#! /usr/sbin/perl
#----------------------------------------------------------------------#
# Copyright (C) 1997, Nintendo.
#
# File binHack.perl
# Coded by Yoshitaka Yasumoto. Nov 7, 1997.
#
# $Id: binHack.perl,v 1.1.1.1 2002/05/02 03:29:11 blythe Exp $
#----------------------------------------------------------------------#
#
# Usage:
#
# perl binHack.perl [top] [bottom] [ucode] ([ucode.dbg])
#
# Function:
# ucode.dbg から [top] と [bottom] を探し,
# ucode の先頭 top バイト位置から bottom バイト位置までの
# データを標準出力へ出力する.
# もし ucode.dbg を省略した場合は, ucode + .dbg を使用する
#
#
if ($ARGV[3] eq ""){
$ARGV[3] = $ARGV[2].".dbg";
}
open(CODE_FILE, $ARGV[2]) || die "Cannot open $ARGV[2]\n";
open(DBG_FILE, $ARGV[3]) || die "Cannot open $ARGV[2].dbg\n";
# ラベルのサーチ
$code_start = -1;
$code_end = -1;
while (<DBG_FILE>){
/^$ARGV[0] (\S*)/&&($code_start = unpack("N",pack("H*", $1)));
/^$ARGV[1] (\S*)/&&($code_end = unpack("N",pack("H*", $1)));
}
# ラベルが見つからないなら終了
($code_start != -1) || die "Not found entry $ARGV[0]\n";
($code_end != -1) || die "Not found entry $ARGV[1]\n";
$code_size = $code_end - $code_start;
# code ファイルの code_start から code_end までを読み込む
seek(CODE_FILE, $code_start, 0) || die "Too short file $ARGV[2]\n";
read(CODE_FILE, $buf, $code_size) == $code_size
|| die "Too short file $ARGV[2]\n";
# 標準出力へ書き出す
print $buf;
#======== End of binHack.perl ========#