bpf_image.c
上传用户:tjescc
上传日期:2021-02-23
资源大小:419k
文件大小:5k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1990, 1991, 1992, 1994, 1995, 1996
  3.  * The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that: (1) source code distributions
  7.  * retain the above copyright notice and this paragraph in its entirety, (2)
  8.  * distributions including binary code include the above copyright notice and
  9.  * this paragraph in its entirety in the documentation or other materials
  10.  * provided with the distribution, and (3) all advertising materials mentioning
  11.  * features or use of this software display the following acknowledgement:
  12.  * ``This product includes software developed by the University of California,
  13.  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
  14.  * the University nor the names of its contributors may be used to endorse
  15.  * or promote products derived from this software without specific prior
  16.  * written permission.
  17.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  18.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  20.  */
  21. #ifndef lint
  22. static const char rcsid[] =
  23.     "@(#) $Header: /usr/local/cvs/nessus-libraries/libpcap-nessus/bpf_image.c,v 1.3 2003/02/06 20:28:07 renaud Exp $ (LBL)";
  24. #endif
  25. #include <sys/types.h>
  26. #include <sys/time.h>
  27. #include <stdio.h>
  28. #include <string.h>
  29. #include "pcap-int.h"
  30. #include "gnuc.h"
  31. #ifdef HAVE_OS_PROTO_H
  32. #include "os-proto.h"
  33. #endif
  34. char *
  35. bpf_image(p, n)
  36. struct bpf_insn *p;
  37. int n;
  38. {
  39. int v;
  40. char *fmt, *op;
  41. static char image[256];
  42. char operand[64];
  43. v = p->k;
  44. switch (p->code) {
  45. default:
  46. op = "unimp";
  47. fmt = "0x%x";
  48. v = p->code;
  49. break;
  50. case BPF_RET|BPF_K:
  51. op = "ret";
  52. fmt = "#%d";
  53. break;
  54. case BPF_RET|BPF_A:
  55. op = "ret";
  56. fmt = "";
  57. break;
  58. case BPF_LD|BPF_W|BPF_ABS:
  59. op = "ld";
  60. fmt = "[%d]";
  61. break;
  62. case BPF_LD|BPF_H|BPF_ABS:
  63. op = "ldh";
  64. fmt = "[%d]";
  65. break;
  66. case BPF_LD|BPF_B|BPF_ABS:
  67. op = "ldb";
  68. fmt = "[%d]";
  69. break;
  70. case BPF_LD|BPF_W|BPF_LEN:
  71. op = "ld";
  72. fmt = "#pktlen";
  73. break;
  74. case BPF_LD|BPF_W|BPF_IND:
  75. op = "ld";
  76. fmt = "[x + %d]";
  77. break;
  78. case BPF_LD|BPF_H|BPF_IND:
  79. op = "ldh";
  80. fmt = "[x + %d]";
  81. break;
  82. case BPF_LD|BPF_B|BPF_IND:
  83. op = "ldb";
  84. fmt = "[x + %d]";
  85. break;
  86. case BPF_LD|BPF_IMM:
  87. op = "ld";
  88. fmt = "#0x%x";
  89. break;
  90. case BPF_LDX|BPF_IMM:
  91. op = "ldx";
  92. fmt = "#0x%x";
  93. break;
  94. case BPF_LDX|BPF_MSH|BPF_B:
  95. op = "ldxb";
  96. fmt = "4*([%d]&0xf)";
  97. break;
  98. case BPF_LD|BPF_MEM:
  99. op = "ld";
  100. fmt = "M[%d]";
  101. break;
  102. case BPF_LDX|BPF_MEM:
  103. op = "ldx";
  104. fmt = "M[%d]";
  105. break;
  106. case BPF_ST:
  107. op = "st";
  108. fmt = "M[%d]";
  109. break;
  110. case BPF_STX:
  111. op = "stx";
  112. fmt = "M[%d]";
  113. break;
  114. case BPF_JMP|BPF_JA:
  115. op = "ja";
  116. fmt = "%d";
  117. v = n + 1 + p->k;
  118. break;
  119. case BPF_JMP|BPF_JGT|BPF_K:
  120. op = "jgt";
  121. fmt = "#0x%x";
  122. break;
  123. case BPF_JMP|BPF_JGE|BPF_K:
  124. op = "jge";
  125. fmt = "#0x%x";
  126. break;
  127. case BPF_JMP|BPF_JEQ|BPF_K:
  128. op = "jeq";
  129. fmt = "#0x%x";
  130. break;
  131. case BPF_JMP|BPF_JSET|BPF_K:
  132. op = "jset";
  133. fmt = "#0x%x";
  134. break;
  135. case BPF_JMP|BPF_JGT|BPF_X:
  136. op = "jgt";
  137. fmt = "x";
  138. break;
  139. case BPF_JMP|BPF_JGE|BPF_X:
  140. op = "jge";
  141. fmt = "x";
  142. break;
  143. case BPF_JMP|BPF_JEQ|BPF_X:
  144. op = "jeq";
  145. fmt = "x";
  146. break;
  147. case BPF_JMP|BPF_JSET|BPF_X:
  148. op = "jset";
  149. fmt = "x";
  150. break;
  151. case BPF_ALU|BPF_ADD|BPF_X:
  152. op = "add";
  153. fmt = "x";
  154. break;
  155. case BPF_ALU|BPF_SUB|BPF_X:
  156. op = "sub";
  157. fmt = "x";
  158. break;
  159. case BPF_ALU|BPF_MUL|BPF_X:
  160. op = "mul";
  161. fmt = "x";
  162. break;
  163. case BPF_ALU|BPF_DIV|BPF_X:
  164. op = "div";
  165. fmt = "x";
  166. break;
  167. case BPF_ALU|BPF_AND|BPF_X:
  168. op = "and";
  169. fmt = "x";
  170. break;
  171. case BPF_ALU|BPF_OR|BPF_X:
  172. op = "or";
  173. fmt = "x";
  174. break;
  175. case BPF_ALU|BPF_LSH|BPF_X:
  176. op = "lsh";
  177. fmt = "x";
  178. break;
  179. case BPF_ALU|BPF_RSH|BPF_X:
  180. op = "rsh";
  181. fmt = "x";
  182. break;
  183. case BPF_ALU|BPF_ADD|BPF_K:
  184. op = "add";
  185. fmt = "#%d";
  186. break;
  187. case BPF_ALU|BPF_SUB|BPF_K:
  188. op = "sub";
  189. fmt = "#%d";
  190. break;
  191. case BPF_ALU|BPF_MUL|BPF_K:
  192. op = "mul";
  193. fmt = "#%d";
  194. break;
  195. case BPF_ALU|BPF_DIV|BPF_K:
  196. op = "div";
  197. fmt = "#%d";
  198. break;
  199. case BPF_ALU|BPF_AND|BPF_K:
  200. op = "and";
  201. fmt = "#0x%x";
  202. break;
  203. case BPF_ALU|BPF_OR|BPF_K:
  204. op = "or";
  205. fmt = "#0x%x";
  206. break;
  207. case BPF_ALU|BPF_LSH|BPF_K:
  208. op = "lsh";
  209. fmt = "#%d";
  210. break;
  211. case BPF_ALU|BPF_RSH|BPF_K:
  212. op = "rsh";
  213. fmt = "#%d";
  214. break;
  215. case BPF_ALU|BPF_NEG:
  216. op = "neg";
  217. fmt = "";
  218. break;
  219. case BPF_MISC|BPF_TAX:
  220. op = "tax";
  221. fmt = "";
  222. break;
  223. case BPF_MISC|BPF_TXA:
  224. op = "txa";
  225. fmt = "";
  226. break;
  227. }
  228. (void)sprintf(operand, fmt, v);
  229. (void)sprintf(image,
  230.       (BPF_CLASS(p->code) == BPF_JMP &&
  231.        BPF_OP(p->code) != BPF_JA) ?
  232.       "(%03d) %-8s %-16s jt %dtjf %d"
  233.       : "(%03d) %-8s %s",
  234.       n, op, operand, n + 1 + p->jt, n + 1 + p->jf);
  235. return image;
  236. }