Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Red Hat Linuxの上の位置情報技術を障害

Red Hat Linuxの上の位置情報技術を障害

  

kprobeのSystemTapのカーネル関数は非常に多くのカーネルプログラマ、カーネルはkprobeを使用するための正式なAPIを提供するため、機能は、カーネルに実装されてプロービングされ、SystemTapのを使用するよりも便利に直接kprobeの恩恵を受ける可能性があります。カーネルはkprobeハンドラ、それぞれのJProbe、kprobe、kretprobe三の観察プローブip_route_inputと、次のコード()呼び出しはarp_process機能にTCP /IPを実行中に結果を返し、3つのタイプを提供する。このコードをも:.

arp_probe.c /* * arp_probe.c *はQianfeng張([email protected])によって、次のようにプローブとRetのハンドラエントリハンドラコードの同じ機能との間の共有パラメータの方法を示すことです/

の#includeの#includeの#includeの#includeの#includeの#includeの#includeの#include

MODULE_AUTHOR(" [email protected]"); MODULE_DESCRIPTION("追跡するためのモジュール);のJProbeとkretprobe"を用いarp_process内部ip_route_inputの結果()を呼び出すMODULE_LICENSE("を、GPL");

静的INT j_arp_process(構造体sk_buff *のSKB){構造体net_d evice * DEV = skb-> devの、構造体in_device * in_dev; int型no_addr、RPF;

in_dev = in_dev_get(DEV); no_addr =(in_dev-> ifa_list == NULL); RPF = IN_DEV_RPFILTER( in_dev); in_dev_put(in_dev)のprintk(" \\ narp_processは()インターフェースデバイス%S、in_dev(no_addr =%dを、RPF =%のD)と呼ばれる\\ n" DEV->名、no_addr、RPF); jprobe_return();戻り値(0);};

静的int型j_fib_validate_source(__ BE32 SRC、__be32 DST、U8 TOS、int型OIF、構造体net_device * DEV、__be32 * spec_dst、U32 * ITAG、U32マーク)

{のprintk(" fib_validate_source()DST = 0X%X、OIF =%d個の\\ N"と呼ばれる;、DST、OIF); jprobe_return();戻り値(0);};

静的構造体のJProbeのmy_jp1 = {.ENTRY = j_arp_process、.kp.symbol_name =" arp_process"};


静的構造体のJProbeのmy_jp2 = {.ENTRY = j_fib_validate_source、.kp .symbol_name =" fib_validate_source"};

静的INT entry_handler(構造体kretprobe_instance * RI、構造体pt_regs * REGS){のprintk("呼び出し:%S()\\ N" [1-> RP-> kp.symbol_name);リターン(0);};

静的INT return_handler(構造体kretprobe_instance * RI、構造体pt_regs * REGS){int型EAX;

EAX = REGS - > AX& 0xFFFFで;のprintk("戻っ:%S()戻り値と:0X%LX(64)0X%X(32ビット)\\ N" [1-> RP-> kp.symbol_name 、regs-> AX、EAX);

リターン(0);};

静的INT fib_lookup_entry_handler(構造体kretprobe_instance * RI、構造体pt_regs * REGS){構造体fib_result * RESP; < BR>

RESP =(構造体fib_result *)regs-> DX;のprintk("呼び出し:%S()\\ N" [1-> RP-> kp.symbol_name); *((構造体fib_result **)[1->データ)= RESP;

リターン(0);};


静的INT fib_lookup_return_handler(構造体kretprobe_instance * RI、構造体pt_regs * REGS ){構造体fib_result * RESP; INT EAX;

EAX = regs-> AX&#038; 0xFFFFで、RESP = *((構造体fib_result **)[1->データ)のprintk("戻ります:;:fib_lookup()戻り値型と0X%0X%LX(64)(32ビット)、result-> X:%D \\ N" regs-> AX、EAX、resp->タイプ);

リターン(0);}

静的構造体kretprobe my_rp1 = {.handler = return_handler、.entry_handler = entry_handler、.kp.symbol_name =" ip_route_input_slow"};


静的構造体kretprobe my_rp2 = {.handler = return_handler、.entry_handler = entry_handler、.kp.symbol_name =" fib_validate_source"};


静的構造体kretprobe my_rp3 = {.handler = fib_lookup_return_handler、.entry_handler = fib_lookup_entry_handler、.kp.symbol_name ="&fib_lookup QUOT; .data_size =はsizeof(構造体fib_result *)};

静的INT __init init_myprobe(ボイド){int型RET;

のprintk(" RTN_UNICAST); IF((RET = register_jprobe(&#038; my_jp1)RTN_UNICASTは%D \\ n"ある)< 0){のprintk(" register_jprobe%秒< 0){のprintk((my_jp2);

IF((RET = register_jprobe(&#038} -1))、my_jp1.kp.symbol_name、RET);リターン%D \\ N"を返した、失敗しました"は;} <; my_jp2.kp.symbol_name、RET);リターン(-1)register_jprobe%sは失敗し、%D \\ N"を返さBR>

IF((RET = register_kretprobe(&#038; my_rp1))< 0){のprintk(" register_kretprobe%sは、失敗した返さ%D \\ N" my_rp1.kp.symbol_name、RET); unregister_jprobe(&アンプ; my_jp1); unregister_jprobe(&#038を、my_jp2);リターン(-1);}

((RET = register_kretprobe(&アンプ場合、my_rp2))< 0){のprintk(" register_kretprobe%sは失敗し、返さ%D \\ N" my_rp2.kp.symbol_name、RET); unregister_jprobe(&#038; my_jp1); unregister_jprobe(&#038; my_jp2); unregister_kretprobe(&#038; my_rp1);リターン(-1);}

IF((RET = register_kretprobe(&#038; my_rp3))< 0){のprintk(" register_kretprobe%sは、失敗した返さ%D \\ N" my_rp3.kp.symbol_name、RET); unregister_jprobe(&#038; my_jp1); unregister_jprobe (&#038; my_jp2); unregister_kretprobe(&#038; my_rp1); unregister_kretprobe(&#038; my_rp2);リターン(-1);}

戻り0;}

Copyright © Windowsの知識 All Rights Reserved