home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume14 / nlist_wht / part01 next >
Text File  |  1990-07-26  |  8KB  |  330 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v14i038: nlist: nlist interface/kmem dumper
  3. From: wht@n4hgf.UUCP (Warren Tucker)
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 14, Issue 38
  7. Submitted-by: wht@n4hgf.UUCP (Warren Tucker)
  8. Archive-name: nlist_wht/part01
  9.  
  10. [A solid week of network bounces and non-reconnectable sessions can lead to
  11. major frustration... and not just for the person getting bounced.  ++bsa]
  12.  
  13. This is a command-level interface to nlist(3)/nlist(S) for
  14. exploratory hacking.   It can also dump kernel memory, privilege
  15. permitting.  Works on *IX systems which support nlist.
  16. comp.sources.misc v06i019 xlist is an equivalent for XENIX systems.
  17.  
  18. Compile by:     cc -O -o nlist nlist.c
  19. Usage is below in the source header.
  20.  
  21. Root is usually the only user who can even read /unix to nlist
  22. but certainly /dev/kmem should be protected as SOP.
  23.  
  24. #!/bin/sh
  25. # This is nlist, a shell archive (shar 3.32)
  26. # made 07/17/1990 18:32 UTC by wht@n4hgf.Mt-Park.GA.US
  27. # Source directory /u1/src/u386mon/nlist
  28. #
  29. # existing files WILL be overwritten
  30. # This format requires very little intelligence at unshar time.
  31. # "echo" and "sed" will be needed.
  32. #
  33. # This shar contains:
  34. # length  mode       name
  35. # ------ ---------- ------------------------------------------
  36. #   6328 -rw-r--r-- nlist.c
  37. #
  38. # ============= nlist.c ==============
  39. echo "x - extracting nlist.c (Text)"
  40. sed 's/^X//' << 'SHAR_EOF' > nlist.c &&
  41. X/* CHK=0x8201 */
  42. X/*+--------------------------------------------------------------------------
  43. X    nlist.c - peruse /unix symbol table, optionally dumping kmem
  44. X    wht@n4hgf.Mt-Park.GA.US
  45. X
  46. X  This is a command-level interface to nlist(3)/nlist(S) for
  47. X  exploratory hacking. 
  48. X
  49. X  Compile by:     cc -O -o nlist nlist.c
  50. X
  51. X  Root is usually the only user who can even read /unix to nlist
  52. X  but certainly /dev/kmem should be protected as SOP.
  53. X
  54. X  Usage: nlist ksym[:length] ...
  55. X
  56. X  where ksym is a kernel symbol and length is an optional parameter
  57. X  indicating the length of a block of data to dump from /dev/kmem
  58. X  for example:
  59. X
  60. X$ nlist proc:0x20 sio_tty:010 v:23 ttyhog doo_dad 
  61. X     name                         type  class   value
  62. X--------------------------------  ----  -----  --------
  63. Xproc                              0000   02    d007cda0
  64. Xsio_tty                           0000   02    d007ba0c
  65. Xv                                 0000   02    d0072214
  66. Xttyhog                            0000   02    d00741a8
  67. Xdoo_dad: not found
  68. X
  69. Xproc addr=d007cda0 length=00000020
  70. XD007CDA0 01 00 00 14 19 20 00 00 00 00 00 00 00 00 00 00 | ..... .......... |
  71. XD007CDB0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ |
  72. X
  73. Xsio_tty addr=d007ba0c length=00000008
  74. XD007BA0C 00 00 00 00 00 00 00 00                         | ........         |
  75. X
  76. Xv addr=d0072214 length=00000017
  77. XD0072214 58 02 00 00 32 00 00 00 C8 00 00 00 40 DC 09 D0 | X...2...H...@\.P |
  78. XD0072224 C8 00 00 00 34 C4 08                            | H...4D.          |
  79. X
  80. X---------------------------------------------------------------------------*/
  81. X/*+:EDITS:*/
  82. X/*:07-17-1990-13:43-wht-adapt xlist */
  83. X
  84. X#include <stdio.h>
  85. X#include <fcntl.h>
  86. X#include <sys/types.h>
  87. X#include <nlist.h>
  88. X
  89. X#define UNIX_KERNEL "/unix"
  90. X
  91. X#define UINT8 unsigned char
  92. X#define UINT16 unsigned short
  93. X#define UINT32 unsigned long
  94. X
  95. Xint fd_kmem;
  96. X
  97. X#define dump_putc(ch)        fputc((ch),stdout)
  98. X#define dump_puts(str)        fputs(str,stdout)
  99. X
  100. X/*+-----------------------------------------------------------------------
  101. X    hex_dump#... subservient routines
  102. X------------------------------------------------------------------------*/
  103. Xvoid hex_dump4(int4)
  104. XUINT8    int4;
  105. X{
  106. X    int4 &= 15;
  107. X    dump_putc((int4 >= 10) ? (int4 + 'A' - 10) : (int4 + '0'));
  108. X}
  109. X
  110. Xvoid hex_dump8(int8)
  111. XUINT8    int8;
  112. X{
  113. X    hex_dump4(int8 >> 4);
  114. X    hex_dump4(int8);
  115. X}
  116. X
  117. Xvoid hex_dump16(int16)
  118. XUINT16    int16;
  119. X{
  120. X    hex_dump8(int16 >> 8);
  121. X    hex_dump8(int16);
  122. X}
  123. X
  124. Xvoid hex_dump32(int32)
  125. XUINT32    int32;
  126. X{
  127. X    hex_dump16((UINT16)(int32 >> 16));
  128. X    hex_dump16((UINT16)int32);
  129. X}
  130. X
  131. X/*+-----------------------------------------------------------------
  132. X    hex_dump(str,len)
  133. X------------------------------------------------------------------*/
  134. Xvoid
  135. Xhex_dump(str,len,offset)
  136. XUINT8    *str;
  137. Xint len;
  138. Xlong offset;
  139. X{
  140. X    register int itmp;
  141. X    register int istr = 0;
  142. X
  143. X    while(istr < len)
  144. X    {
  145. X        hex_dump32(offset + istr);
  146. X        for(itmp = 0; itmp < 16; ++itmp)
  147. X        {
  148. X            dump_putc(' ');
  149. X            if( istr + itmp >= len)
  150. X            {
  151. X                dump_putc(' ');
  152. X                dump_putc(' ');
  153. X                continue;
  154. X            }
  155. X            hex_dump8(str[istr + itmp]);
  156. X        }
  157. X        dump_puts(" | ");
  158. X        for(itmp = 0; itmp < 16; ++itmp)
  159. X        {
  160. X            register char dchar;
  161. X            if(istr + itmp >= len)
  162. X                dump_putc(' ');
  163. X            else
  164. X            {
  165. X                dchar = str[istr + itmp] & 0x7F;
  166. X                dump_putc(((dchar >= ' ') && (dchar < 0x7f)) ? dchar : '.' );
  167. X            }
  168. X        }
  169. X        dump_puts(" |\n");
  170. X        istr += 16;
  171. X    }   /* end of while(istr < len) */
  172. X
  173. X}    /* end of hex_dump */
  174. X
  175. X/*+-------------------------------------------------------------------------
  176. X    dump_kmem(seekpos,length)
  177. X--------------------------------------------------------------------------*/
  178. Xvoid
  179. Xdump_kmem(seekpos,length)
  180. Xlong seekpos;
  181. Xint length;
  182. X{
  183. X    char *kmemdata;
  184. X    char *malloc();
  185. X    long lseek();
  186. X
  187. X    if((kmemdata = malloc(length)) == NULL)
  188. X    {
  189. X        printf("cannot allocate %d bytes\n",length);
  190. X        return;
  191. X    }
  192. X
  193. X    if(lseek(fd_kmem,seekpos,0) == -1L)
  194. X    {
  195. X        fprintf(stderr,"cannot seek kmem (%d) to %08lx",fd_kmem,seekpos);
  196. X        perror("");
  197. X        free(kmemdata);
  198. X        return;
  199. X    }
  200. X
  201. X    if(read(fd_kmem,kmemdata,length) != length)
  202. X    {
  203. X        perror("kmem read");
  204. X        free(kmemdata);
  205. X        return;
  206. X    }
  207. X
  208. X    hex_dump(kmemdata,length,seekpos);
  209. X    free(kmemdata);
  210. X
  211. X}    /* end of dump_kmem */
  212. X
  213. X/*+-------------------------------------------------------------------------
  214. X    open_kmem()
  215. X--------------------------------------------------------------------------*/
  216. Xvoid
  217. Xopen_kmem()
  218. X{
  219. X    if((fd_kmem = open("/dev/kmem",O_RDONLY,0)) < 0)
  220. X    {
  221. X        perror("/dev/kmem");
  222. X        exit(1);
  223. X    }
  224. X}    /* end of open_kmem */
  225. X
  226. X/*+-------------------------------------------------------------------------
  227. X    main(argc,argv,envp)
  228. X--------------------------------------------------------------------------*/
  229. Xmain(argc,argv,envp)
  230. Xint argc;
  231. Xchar    **argv;
  232. Xchar    **envp;
  233. X{
  234. X    register int iargv;
  235. X    struct nlist *nlst;
  236. X    register struct nlist *nn;
  237. X    register int *count;
  238. X    char *cptr;
  239. X    char *strrchr();
  240. X    char *calloc();
  241. X    int need_kmem = 0;
  242. X
  243. X    if(argc < 2)
  244. X        exit(1);
  245. X
  246. X#ifdef REPEAT_ARGV
  247. X    for(iargv = 0; iargv < argc; iargv++)
  248. X        printf("%s ",argv[iargv]);
  249. X    printf("\n");
  250. X#endif
  251. X
  252. X    if((nlst = (struct nlist *)calloc(argc,sizeof(struct nlist))) ==
  253. X        (struct nlist *)0)
  254. X    {
  255. X        fprintf(stderr,"memory not available\n");
  256. X        exit(1);
  257. X    }
  258. X
  259. X    if((count = (int *)calloc(argc,sizeof(int))) == (int *)0)
  260. X    {
  261. X        fprintf(stderr,"memory not available\n");
  262. X        exit(1);
  263. X    }
  264. X
  265. X    nn = nlst;
  266. X    for(iargv = 1; iargv < argc; iargv++)
  267. X    {
  268. X        if(cptr = strrchr(argv[iargv],':'))
  269. X        {
  270. X            *cptr++ = 0;
  271. X            sscanf(cptr,"%i",&count[iargv - 1]);
  272. X            need_kmem = 1;
  273. X        }
  274. X        nn->n_name = argv[iargv];
  275. X        nn++;
  276. X    }
  277. X
  278. X    nlist(UNIX_KERNEL,nlst);
  279. X
  280. X    if(need_kmem)
  281. X        open_kmem();
  282. X
  283. X    nn = nlst;
  284. X    fputs("     name                         type  class   value\n",stdout);
  285. X    fputs("--------------------------------  ----  -----  ---------\n",stdout);
  286. X    for(iargv = 1; iargv < argc; iargv++)
  287. X    {
  288. X        if(!nn->n_sclass && !nn->n_value)
  289. X        {
  290. X            printf("%s: not found\n",nn->n_name);
  291. X            nn++;
  292. X            continue;
  293. X        }
  294. X
  295. X        printf("%-32.32s  %04x   %02x    %08lx\n",
  296. X            nn->n_name,
  297. X            nn->n_type,
  298. X            (unsigned char)nn->n_sclass,
  299. X            nn->n_value);
  300. X
  301. X        nn++;
  302. X    }
  303. X
  304. X    nn = nlst;
  305. X    for(iargv = 1; iargv < argc; iargv++)
  306. X    {
  307. X        if(!nn->n_sclass && !nn->n_value)
  308. X        {
  309. X            nn++;
  310. X            continue;
  311. X        }
  312. X
  313. X        if(count[iargv - 1])
  314. X        {
  315. X            printf("\n%s addr=%08lx length=%08x\n",
  316. X                nn->n_name,nn->n_value,count[iargv - 1]);
  317. X            dump_kmem(nn->n_value,count[iargv - 1]);
  318. X        }
  319. X
  320. X        nn++;
  321. X    }
  322. X    exit(0);
  323. X}    /* end of main */
  324. X
  325. X/* vi: set tabstop=4 shiftwidth=4: */
  326. X/* end of nlist.c */
  327. SHAR_EOF
  328. exit 0
  329.  
  330.