uvhd  - 文件调查实用程序

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
  1. 在上面的第一个记录上,事件是一个运行级别的更改(重新启动)。 'runlevel'在44(8)(dsplcmnt 44 0 relative,length 8)。 在其他记录上,该字段可能是:shutdown,LOGIN,userid等)。
  2. 请注意,时间以字节340(4b),Unix纪元时间,1970年1月1日以来的秒数进行二进制编码。x'8BA98248'为2008/07 / 19_19:57:15。 起始位移为320 + 20 = 340,因为行从320开始,x'8B'线在标尺下方20以下。
  3. 您可以使用'utmpdump'系统命令显示文件内容
  4. Unix / Linux系统提供'utmpdump'实用程序以用户友好的可读格式显示/ var / run / utmp和/ var / log / wtmp记录。 utmpdump将二进制Unix-times转换为人类可读的格式。 尝试'utmpdump / var / log / wtmp | 更多'。
  5. 在下一页,我们将使用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

  1. 'w'rite命令将选定的记录写入当前工作目录中的'tmp /'子目录,日期/时间戳如上所示,'W'Postfix标识为写命令输出。
  2. 注意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)
  1. u999 < - 表示(搜索)/更新下一个999条记录。 只有'u'没有计数将只更新当前显示的记录。
  2. u999 77(2),'AB'< - 此(仅第1个2操作数)将更新所有记录,如果未指定操作数3,4。
  3. ,,'AL'< - 由操作数1和2指定的更新的操作数3和4中的条件。 请注意,操作数3(,,略)默认为op1,但可以指定不同的字段
  4. 所有规则都在http://www.uvsoftware.ca/uvhd.htm中详细记录

结论

我希望这些例子给你一些关于你如何使用uvhd的想法,我欢迎任何关于你使用它的反馈。

感谢您阅读本文,希望您同意我的大多数客户说:“uvhd是我们最喜欢的实用程序”。

如果您发现任何错误或有改进建议,请给我发电子邮件(Owen Townsend,owen@uvsoftware.ca,www.uvsoftware.ca)。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏