uvhd - 文件调查工具
'uvhd'是一个二进制文件调查工具。 它以垂直十六进制格式显示任何文件的内容,并提示用于浏览,搜索,选择,更新,扫描/替换,打印,翻译等命令。uvhd是一个具有命令行界面和18个帮助屏幕的交互式实用程序。
版权所有(C)1993-2008,UV Software Inc,分布在GPLv3下
在GPLv3下许可
该程序是免费软件:您可以根据自由软件基金会发布的GPLv3(GNU通用公共许可证版本3)的条款重新分发和/或修改它。 请参阅GNU通用公共许可证的完整说明: http : //www.gnu.org/licenses 。
下载和编译
您可以从http://www.uvsoftware.ca/libuvhd.htm下载uvhd 。 uvhd只需要标准的ANSI C库。 编译如下:
cc src/uvhd.c -o bin/uvhd <-- compile uvhd =========================
以上假设您已在Linux或Unix上登录到您的主目录,设置了子目录“src”和“bin”,并将下载的源( uvhd.c
)存储在“src”子目录中。 我们还将假设您已将$ HOME / bin
添加到您的$ PATH
以获取以下教程。
uvhd教程
本文将介绍3个插图,使用uvhd 3种类型的二进制文件,演示文件显示,浏览,搜索,选择和更新。
在本文中,我们将不会介绍参考手册http://www.uvsoftware.ca/uvhd.htm中记录的许多其他功能和选项。
A1。 | 教程#1 - 调用可执行的二进制程序 |
- 搜索uvhd程序本身(for'version') |
B1。 | 教程#2 - 调查/ var / log / wtmp日志文件 |
- 记录事件,如:reboot,shutdown,logins(userids) | |
- 为指定的userid选择记录,写入单独的文件 |
C1。 | 教程#3 - 调查迁移到Unix / Linux的典型大型机文件 |
- 客户主文件,名称,地址和24包装十进制每月销售 | |
- 一次互动搜索和更新1条记录 | |
- 或1命令搜索用第二模式替换1个模式的所有记录 |
A1。 教程#1 - 搜索可执行文件
如果您已经下载并编译了uvhd(如上所述),则可以立即执行本教程。 对于我们要调查的第二个二进制文件,我们来使用编译的uvhd程序。 我们还将指定选项'r256s3',其中将'r'的大小定义为256,并将's'作为3(缩放之后的空间和组之间)。
uvhd bin/uvhd r256s3 <-- execute uvhd to display bin/uvhd with options r256s3 ==================== - r256 Record-size (256 is the default if omitted) - s3 Spaces between scale and 3 line groups
filename = / home / uvadm / bin / uvhd options = r256s3 records = 813 filesize = 104126 recsize = 256 fsize%rsize(remaining)= 62
10 20 30 40 50 60 r# 1 0123456789012345678901234567890123456789012345678901234567890123
0 .ELF..............>.......@.....@.......H[..........@.8...@..... <-chars 744400000000000000300000B040000040000000450000000000403000401010 <-zones F5C621100000000020E010000D000000000000008B100000000000808000D0A0 <-digits
64 ........@.......@.@.....@.@..................................... 00000000400000004040000040400000C0000000C00000000000000000000000 6000500000000000000000000000000001000000010000008000000030004000
128 ..........@.......@............................................. 0000000000400000004000001000000010000000000000000000000000000000 020000000200000002000000C0000000C0000000100000001000500000000000
192 ..@.......@......9.......9........ ..............@.......@a..... 0040000000400000E3000000E300000000200000000000000400000004600000 0000000000000000491000004910000000000000100060000010000000100000
null = next,r#= rec,s = search,u = update,x = rollback,p = print,i = iprint,w = write,e = count,g = genseq#,c = chkseq#,t = translate (ta = Asc,te = Ebc,tu = Upr,tl = Lwr,tc = Chars,tp = Pers),R#= Recsize,h1 = char,h2 = hex,q = quit,?= help -
uvhd以“垂直十六进制”显示数据,64字节段,3行组(字符,区域和数字)。 例如,'ELF'中的'E'是水平十六进制的x'45'。 请注意,任何不可打印字节在“字符”行显示为句点,但您可以在“区域”和“数字”行中看到真实值。 当然有一些字节,其区/数位刚好与ASCII可打印字符(例如'@'x'40')重合。
另请注意,字节偏移(零相对位移)显示在每个3行组的开头。 例如,“128”是第三组中第一个字节的偏移量为64。
如果文件大小不能被指定的记录大小整除,您还会收到警告(仅在第1个记录上)。 我没有在这里显示它,因为它与程序可执行文件不相关,但对于固定长度的数据文件(可能从大型机迁移到Unix / Linux)而言很重要。
A2。 搜索命令
显示uvhd数据后,系统将提示您输入命令。 显示简要的命令摘要(null = next,r#= rec,s = search,u = update,...,?= help)。 你可以输入'?' 用于18个帮助屏幕(选项,命令格式等)。
我们使用'search'命令搜索'version'(假设程序包含该单词)。
uvhd bin/uvhd r256 <-- execute uvhd with option 'r' recsize=256 ================== (r256 is the default if no options specified)
---> s 'version' <-- 's'earch for 'version' anywhere in program ===========
10 20 30 40 50 60 r# 276 0123456789012345678901234567890123456789012345678901234567890123 70400 useful,.but WITHOUT ANY WARRANTY; without even the implied warra 7766762067725454455244525455445532767667726766276626676666276776 53565CC025407948F5401E9071221E49B07948F540565E048509D0C954071221 64 nty of..MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE..... 6772660044544445444445526724454455244524254554454452555545420000 E490F600D52381E4129C9490F20694E53306F20100124935C1200520F35E0000 128 See the full description of the GNU General Public License at:.h 5662766267662667676776662662766244524666766257666624666676267306 3550485065CC0453329049FE0F6048507E5075E521C0052C930C935E35014A08 192 ttp://www.gnu.org/licenses......uvhd version 20080807 - Copyrigh 7773227772667267626666676720000077662767766623333333322246777666 440AFF777E7E5EF27FC935E353E000005684065239FE0200808070D03F092978 ******* found--> s 'version' <--at byte# 229 of record# 276 rec#=276 rcount=406 rsize=256 fsize=104126 bin/uvhd
- 在#406#256 = 104,126字节的文件中,#####的文件中找到'version'
- 找到的图案显示在反向视频中(为本文删除)
- 我添加了'*******'来补偿这里缺乏反向视频
---> ss <-- may enter 'ss' to repeat the last 's' search === - will find 'version' in 2 other records (not shown here)
---> 1 <-- could then reset to record# 1 and repeat 'ss' to find again ===
B1。 教程#2 - / var / log / wtmp search / select
对于我们的第二个例子,我们来研究/ var / log / wtmp,一个Unix / Linux系统文件,用于存储诸如:reboot,shutdown,runlevel更改,登录和用户登录的事件。这是一个二进制文件,具有固定的记录大小384字节。
uvhd /var/log/wtmp r384 <-- investigate wtmp (recsize=384) =======================
uvhd filename=/var/log/wtmp options=r384 lastmod=2008081704 today=20080817143240 print=p1 rec#=1 rcount=1343 filesize=515712 recsize=384 fsize%rsize(remainder)=0 10 20 30 40 50 60 r# 1 0123456789012345678901234567890123456789012345678901234567890123 0 ....05..~...............................~~..runlevel............ 0000330070000000000000000000000000000000770077666766000000000000 10000500E0000000000000000000000000000000EE0025EC565C000000000000 64 ............2.6.18-92.1.6.el5xen................................ 0000000000003232332332323266376600000000000000000000000000000000 0000000000002E6E18D92E1E6E5C585E00000000000000000000000000000000 128 ................................................................ 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 192 ................................................................ 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 256 ................................................................ 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 320 .......................H<....................................... 000000000000000000008A843900000000000000000000000000000000000000 00000000000000000000B928C0B0000000000000000000000000000000000000
- 在上面的第一个记录上,事件是一个运行级别的更改(重新启动)。 'runlevel'在44(8)(dsplcmnt 44 0 relative,length 8)。 在其他记录上,该字段可能是:shutdown,LOGIN,userid等)。
- 请注意,时间以字节340(4b),Unix纪元时间,1970年1月1日以来的秒数进行二进制编码。x'8BA98248'为2008/07 / 19_19:57:15。 起始位移为320 + 20 = 340,因为行从320开始,x'8B'线在标尺下方20以下。
- 您可以使用'utmpdump'系统命令显示文件内容
- Unix / Linux系统提供'utmpdump'实用程序以用户友好的可读格式显示/ var / run / utmp和/ var / log / wtmp记录。 utmpdump将二进制Unix-times转换为人类可读的格式。 尝试'utmpdump / var / log / wtmp | 更多'。
- 在下一页,我们将使用uvhd为所需的用户ID选择记录,然后使用utmpdump显示内容。
B2。 为userid uvadm搜索/ var / log / wtmp
uvhd /var/log/wtmp r384 <-- startup uvhd for /var/log/wtmp (recsize 384) ======================= - will display 1st record (same as above) - not shown here to save space
--> s 44(5),'uvadm' <-- search for records with userid 'uvadm' - displays 1st record found as follows:
r# 74 0123456789012345678901234567890123456789012345678901234567890123 28032 ........tty2............................2...uvadm............... 0000800077730000000000000000000000000000300077666000000000000000 70006F004492000000000000000000000000000020005614D000000000000000 64 ................................................................ 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 128 ................................................................ 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 192 ................................................................ 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 256 ................................................................ 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 320 ....................A..H9....................................... 000000000000000080004C843E00000000000000000000000000000000000000 00000000000000006F0019489640000000000000000000000000000000000000
发现 - > s 44(5),'uvadm'< - 在记录#74的字节#44
我们可以使用'ss'来重复搜索下一个匹配的记录(就像我们在“#”的教程#1中所做的那样),但现在我们将演示select / write命令。
B3。 选择userid'uvadm'的所有记录
--> w9999 44(5),'uvadm' <-- Write all records with 'uvadm' in bytes 44-48 =================== to a tmp/file
10 20 30 40 50 60 r# 1340 0123456789012345678901234567890123456789012345678901234567890123 514176 ........tty2............................2...uvadm............... 0000800077730000000000000000000000000000300077666000000000000000 70005F004492000000000000000000000000000020005614D000000000000000 ----- bytes 64-319 omitted to save space ----- 320 .......................H.8...................................... 0000000000000000000011A4E300000000000000000000000000000000000000 0000000000000000000050888890000000000000000000000000000000000000
w9999 44(5),'uvadm'30写,tmp / wtmp_080817_151157W
- 'w'rite命令将选定的记录写入当前工作目录中的'tmp /'子目录,日期/时间戳如上所示,'W'Postfix标识为写命令输出。
- 注意tmp / ...在你当前的工作目录(NOT / tmp)中。 如果./tmp不存在,uvhd将会这样做。
B4。 检查写入选择的记录
我们现在可以检查选定的记录如下:
uvhd tmp/wtmp_080817_153211W r384 <-- examine selected records (user 'uvadm') =================================
uvhd filename=/home/uvadm/tmp/wtmp_080817_153211W options=r384 lastmod=2008081715 today=20080817153306 print=p1 rec#=1 rcount=30 filesize=11520 recsize=384 fsize%rsize(remainder)=0 10 20 30 40 50 60 r# 1 0123456789012345678901234567890123456789012345678901234567890123 0 ........tty2............................2...uvadm............... 0000800077730000000000000000000000000000300077666000000000000000 70006F004492000000000000000000000000000020005614D000000000000000 ----- bytes 64-319 omitted to save space ----- 320 ....................A..H9....................................... 000000000000000080004C843E00000000000000000000000000000000000000 00000000000000006F0019489640000000000000000000000000000000000000
现在我们可以使用'utmpdump'以用户友好的格式显示所选择的记录,二进制时间转换为可读格式。
utmpdump tmp/wtmp_080817_153211W ================================
[7] [03974] [2 ] [uvadm ] [tty2 [Mon Jul 21 10:37:05 2008 PDT] [7] [03936] [2 ] [uvadm ] [tty2 [Tue Jul 22 07:39:50 2008 PDT] [7] [03974] [2 ] [uvadm ] [tty2 [Wed Jul 23 10:07:30 2008 PDT] - - - - - 24 records omitted to save space - - - - - [7] [03971] [2 ] [uvadm ] [tty2 [Fri Aug 15 06:32:59 2008 PDT] [7] [03973] [2 ] [uvadm ] [tty2 [Sat Aug 16 08:06:10 2008 PDT] [7] [03973] [2 ] [uvadm ] [tty2 [Sun Aug 17 04:48:37 2008 PDT]
C1。 教程#3 - 包装十进制字段的客户主
对于我们的第三个例子,我们将使用文件'custmas1',您可以从http://www.uvsoftware.ca/custmas1下载。 这是已经迁移到Unix / Linux的大型机式客户名称和地址。 它具有256字节的固定长度记录,具有24 * 5字节的压缩十进制字段(月销售)和无换行(通常的Unix / Linux编辑器需要)。 现场布局如下:
000-005 - cust# 010-034 - customer name 035-059 - address 060-075 - address 077-078 - province 080-089 - postal code 090-101 - telephone# 102-119 - contact name 120-179 - this year monthly sales 12 * 5 byte packed decimal 180-239 - last year monthly sales 12 * 5 byte packed decimal 240-256 - unused
将custmas1演示文件从http://www.uvsoftware.ca/custmas1下载到您的homedir中的数据/子目录中。
uvhd data/custmas1 r256u <-- execute uvhd on custmas1 with options r256u ======================== - option 'u' is required to allow Updates - uvhd displays 1st record and prompts for commands
uvhd filename = / home / uvadm / data / custmas1 rec#= 1 rcount = 32 filesize = 8192 recsize = 256 fsize%rsize(remaining)= 0
10 20 30 40 50 60 r# 1 0123456789012345678901234567890123456789012345678901234567890123 0 130140 EVERGREEN MOTORS LTD. 1815 BOWEN ROAD NANA 3333332222454545444244545524542222233332445442544422222222224444 130140000056527255E0DF4F230C44E0000181502F75E02F140000000000E1E1 64 IMO BC V9S1H1 250-754-5531 LARRY WRENCH ..4V|... 4442222222222442535343222233323332333324455525544442222201357000 9DF00000000002306931810000250D754D55310C12290725E38000000246C000 128 .........W0....`........)X}..f3.....\.................4V}...f... 0000000005300016000000002570063100095000000000000000013570016000 0C0000C0270D0540C0000C0098D0263C0444C0000C0000C0000C0246D0056C00 192 .E|...V}.......................f.....<........f.C 19950531 0470005700000000880000000018000680001300000000694233333333222222 35C0046D0000C0023C0000C0083C0056D0012C0000C0016D3019950531000000
null = next,r#= rec,s = search,u = update,x = rollback,p = print,i = iprint,w = write,e = count,g = genseq#,c = chkseq#,t = translate (ta = Asc,te = Ebc,tu = Upr,tl = Lwr,tc = Chars,tp = Pers),R#= Recsize,h1 = char,h2 = hex,q = quit,?= help -
注意120-239的24 * 5字节压缩十进制字段。 第一个字段是x'001234567C',这是$ 12,345.67 +包装字段可以通过每个字段的右手半字节中的符号x'_C'(+)或x'_D'( - )来标识。
C2。 custmas1 - 搜索/更新
对于本教程,我们将搜索不正确的省代码并更新它们。 上述第一条记录中的省代码是不列颠哥伦比亚省正确的“BC”,但有一些记录编号为“AL”(阿拉巴马州),应修正为“AB”(阿尔伯塔省)。
我们将把搜索字段指定为'77(2)',偏移77(0相对)和长度(2)。 如果我们没有上面的记录布局,我们可以通过添加64 + 13 = 77来确定偏移量。 IE 64字节在第1段+13字节进入第2段。 省代码(BC,AL,AB等)的第1个字节在记录之前按比例排列在13以下。
--> s 77(2),'AL' <-- Search for record with 'AL' in bytes 77-78 ============ - will display found record and prompt for commands
10 20 30 40 50 60 r# 13 0123456789012345678901234567890123456789012345678901234567890123 3072 201120 ALLTYPE RENTAL LTD. BOX 1819 DRAY 3333332222444555425445442454222222244523333222222222222222224545 20112000001CC4905025E41C0C44E0000002F801819000000000000000004219 'AL'--> 64 TON VALLEY AL T0E0M0 403-246-5274LARRY ZOLF ........ 5442544445222442534343222233323332333344555254442222222200000000 4FE061CC590001C04050D00000403D246D5274C12290AFC6000000000000C000 128 ..........Fl...Il......................................vl..9q... 0000000000460014600000000000000000000000000008900000000760037100 0C0000C0086C0039C0000C0000C0000C0000C0000C0003C0000C0066C0091C00 192 .4..................%.L.............I...........A 20010731 1390000000000000000020400810000000004000000000004233333333222222 24C0000C0000C0000C0054C0095C0000C0039C0000C0000C1020010731000000
found--> s 77(2),'AL' <--at byte# 77 of record# 13 rec#=13 rcount=32 rsize=256 fsize=8192 dat1/custmas1 null=next,r#=rec,s=search,u=update,x=rollback,p=print,i=iprint,w=write,e=count ,g=genseq#,c=chkseq#,t=translate(ta=Asc,te=Ebc,tu=Upr,tl=Lwr,tc=Chars,tp=Pers) ,R#=Recsize,h1=char,h2=hex,q=quit,?=help -->
--> u 77(2),'AB' <-- Update bytes 77-78 with 'AB' ============ - re-displays record to confirm Update to 'AB' - Updated record not shown here to save space
--> ss <-- repeat previous Search (double letters repeat commands) === - next AL record not shown here to save space
--> uu <-- repeat previous Update === - Updated AB record not shown here to save space
C3。 custmas1 - 多记录搜索/更新
可能有许多记录不正确的省“AL”被更正为“AB”,是的,有更快的方法来执行多记录搜索/更新。 我们假设您将原始下载的custmas1演示文件恢复到$ HOME / data / custmas1。
uvhd data/custmas1 r256u <-- re-execute uvhd on restored custmas1 ======================== - displays 1st record and prompts for command - 1st record not shown here to save space
--> u999 77(2),'AB',,'AL' <-- Update 77-78 to 'AB', IF existing 'AL' ===================== - displays last record updated as follows:
10 20 30 40 50 60 r# 27 0123456789012345678901234567890123456789012345678901234567890123 6656 318833 TOP NOTCH CONSTRUCTION BOX 308, STN J CALG 3333332222545244544244455554544422244523332255424222222222224444 31883300004F00EF43803FE3425349FE0002F80308C034E0A0000000000031C7 64 ARY AB T2A4X6 403-385-2965HARRY SMIRNOFF ..85\... 4552222222222442534353222233323332333344555254454444222200335000 12900000000001204214860000403D385D29658122903D92EF6600000085C000 128 ................................................................ 0000000000000000000000000000000000000001100000000000000000000000 0C0000C0000C0000C0000C0000C0000C0000C0007C0000C0000C0000C0000C00 192 .....................p...............<..%P......C 20021130 0000000000000000000017800000000000008300258000004233333333222222 00C0000C0000C0000C0000C0000C0000C0027C0050C0000C3020021130000000
EOF, 32 records read, 11 updated u999 77(2),'AB',,'AL' rec#=27 rcount=32 rsize=256 fsize=8192 tmp/custmas1 null=next,r#=rec,s=search,u=update,x=rollback,p=print,i=iprint,w=write,e=count ,g=genseq#,c=chkseq#,t=translate(ta=Asc,te=Ebc,tu=Upr,tl=Lwr,tc=Chars,tp=Pers) ,R#=Recsize,h1=char,h2=hex,q=quit,?=help --> ** quit request - program ended **
关于多记录搜索/更新的注意事项
--> u999 77(2),'AB',,'AL' <-- Update 77-78 to 'AB', IF existing 'AL' ===================== - displays last record updated (as shown above)
- u999 < - 表示(搜索)/更新下一个999条记录。 只有'u'没有计数将只更新当前显示的记录。
- u999 77(2),'AB'< - 此(仅第1个2操作数)将更新所有记录,如果未指定操作数3,4。
- ,,'AL'< - 由操作数1和2指定的更新的操作数3和4中的条件。 请注意,操作数3(,,略)默认为op1,但可以指定不同的字段
- 所有规则都在http://www.uvsoftware.ca/uvhd.htm中详细记录
结论
我希望这些例子给你一些关于你如何使用uvhd的想法,我欢迎任何关于你使用它的反馈。
感谢您阅读本文,希望您同意我的大多数客户说:“uvhd是我们最喜欢的实用程序”。
如果您发现任何错误或有改进建议,请给我发电子邮件(Owen Townsend,owen@uvsoftware.ca,www.uvsoftware.ca)。