strlen_count.php 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. <?php
  2. $bpf_text = <<<EOT
  3. #include <uapi/linux/ptrace.h>
  4. struct key_t {
  5. char c[80];
  6. };
  7. BPF_HASH(counts, struct key_t);
  8. int count(struct pt_regs *ctx) {
  9. if (!PT_REGS_PARM1(ctx))
  10. return 0;
  11. struct key_t key = {};
  12. u64 zero = 0, *val;
  13. bpf_probe_read_user(&key.c, sizeof(key.c), (void *)PT_REGS_PARM1(ctx));
  14. // could also use `counts.increment(key)`
  15. val = counts.lookup_or_try_init(&key, &zero);
  16. if (val) {
  17. (*val)++;
  18. }
  19. return 0;
  20. };
  21. EOT;
  22. $b = new Bpf(["text" => $bpf_text]);
  23. $b->attach_uprobe("c", "strlen", "count");
  24. echo "Tracing strlen()... Hit Ctrl-C to end.\n";
  25. pcntl_signal(SIGINT, "signalHandler");
  26. pcntl_async_signals(true);
  27. # sleep until Ctrl-C
  28. while (true) {
  29. sleep(99999999);
  30. }
  31. function signalHandler($signo)
  32. {
  33. global $b;
  34. switch ($signo) {
  35. case SIGINT:
  36. echo sprintf("%10s %s\n", "COUNT", "STRING");
  37. $counts = $b->get_table("counts");
  38. $vals = $counts->values();
  39. foreach ($vals as $v) {
  40. $k = unpack("A80c", $v['key']);
  41. $v = unpack("Qval", $v['value']);
  42. printf("%10d \"%s\"\n", $v['val'],$k['c']);
  43. }
  44. exit(0);
  45. }
  46. }