Advertisement
Guest User

Untitled

a guest
Jun 8th, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.25 KB | None | 0 0
  1. /* C standard headers */
  2. #include <errno.h>
  3. #include <inttypes.h>
  4. #include <setjmp.h>
  5. #include <stdbool.h>
  6. #include <stddef.h>
  7. #include <stdint.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11.  
  12. /* Linux headers */
  13. #include <dirent.h>
  14. #include <fcntl.h>
  15. #include <sys/mman.h>
  16. #include <sys/ptrace.h>
  17. #include <sys/types.h>
  18. #include <sys/wait.h>
  19. #include <unistd.h>
  20. #include <sys/user.h>
  21. /* Architecture-specific headers */
  22. #include <asm/ptrace.h>
  23. #include <asm/unistd.h>
  24.  
  25. #include <signal.h>
  26. #include <assert.h>
  27.  
  28. typedef void fun_moved_from_context();
  29. //using namespace std;
  30. void attachTo(pid_t pid, int id) {
  31.     long ret = ptrace (PTRACE_ATTACH, pid, NULL, NULL);        
  32.     printf("%i  attachTo: %ld\n", id, ret);
  33. }
  34. void seizeTo(pid_t pid, int id) {
  35.     long ret = ptrace (PTRACE_SEIZE, pid, NULL, NULL);      
  36.     //assert(ret > 0);
  37.     printf("%i  seizeTo: %ld\n", id, ret);        
  38. }
  39. void detachFrom(pid_t pid, int id) {    
  40.     long ret = ptrace (PTRACE_DETACH, pid, NULL, NULL);        
  41.     printf("%i  detachFrom: %ld\n", id, ret);    
  42. }
  43. void setOptions(pid_t pid, int id) {    
  44.     long ret = ptrace(PTRACE_SETOPTIONS, pid, NULL, (void*) (PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXEC | PTRACE_O_TRACEEXIT | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK));  
  45.     printf("%i  setOptions: %ld\n", id, ret);    
  46. }
  47. void setVarData(pid_t pid, volatile bool* can_run, void* data, int id) {
  48.     long ret = ptrace(PTRACE_POKEDATA, pid, (void*)can_run, (void*)data);
  49.     printf("%i  setVarData: %ld\n", id, ret);    
  50. }
  51. void cont(pid_t pid, int id) {
  52.     long ret = ptrace (PTRACE_CONT, pid, NULL, NULL);
  53.     printf("%i  cont: %ld\n", id, ret);    
  54. }
  55. void interrupt(pid_t pid, int id) {
  56.     long ret = ptrace (PTRACE_INTERRUPT, pid, NULL, NULL);
  57.     printf("%i  interrupt: %ld\n", id, ret);    
  58. }
  59. void debug(int id) {
  60.     int status;  
  61.     while (true) {          
  62.         printf("%i  while\n", id);
  63.         sleep(1);
  64.         struct user_regs regs;    
  65.         pid_t recv = wait(&status);  
  66.         if (recv == -1) {
  67.             printf("%i  Debugger exiting\n", id);
  68.             return 0;
  69.         } else {
  70.             if (WIFSTOPPED(status)) {
  71.                 int signal = WSTOPSIG(status);    
  72.                 printf("%i  signal: %i\n",id,signal);
  73.                 switch (signal) {
  74.                     case SIGTRAP: {                
  75.                         int event_code = (status >> 8) ^ SIGTRAP;
  76.                         printf("%i  event_code: %i\n",id,event_code);
  77.                         switch (event_code) {
  78.                             case PTRACE_EVENT_FORK << 8:
  79.                                 printf("%i  FORK EVENT.\n", id);
  80.                                 cont(recv,id);
  81.                                 break;
  82.                             case PTRACE_EVENT_EXIT << 8:
  83.                                 printf("%i  %li exited.\n", id, recv);
  84.                                 return 0;
  85.                                 break;
  86.                             default: {
  87.                                 printf("%i  recv: %i ; status: %i\n", id, recv, status);
  88.                                 long ret=ptrace (PTRACE_GETREGS, recv, NULL, &regs);
  89.                                 regs.uregs[15] += 2;//addr_size;
  90.                                 printf("%i  p: new PC: %lx\n", id, regs.uregs[15]);
  91.                                 ptrace (PTRACE_SETREGS, recv, NULL, &regs);                
  92.                                 cont(recv,id);
  93.                             }
  94.                         }  
  95.                         break;                      
  96.                     }  
  97.                     default: {
  98.                         cont(recv,id);
  99.                         break;
  100.                     }                
  101.                 }
  102.             }
  103.  
  104.         }        
  105.     }
  106. }
  107.  
  108. int main() {    
  109.     int pid;
  110.     int me = getpid();
  111.     printf("Hello, I am %d\n", me);
  112.     printf("pid:");
  113.     scanf("%d",&pid);
  114.     if (pid == 0) {
  115.         printf("bkpt asm\n");
  116.         asm("bkpt");
  117.     } else {
  118.         attachTo(pid, me);
  119.         printf("start waitpid\n");
  120.         waitpid(pid, NULL, __WALL);
  121.         printf("end waitpid\n");
  122.         setOptions(pid, me);  
  123.         cont(pid,me);  
  124.         debug(me);
  125.     }
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement