cielavenir

spsearch rev2

Nov 23rd, 2011
569
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.00 KB | None | 0 0
  1. //usage: spsearch boot_img_via_dump_image
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. unsigned int read32(const void *p){
  7.     const unsigned char *x=(const unsigned char*)p;
  8.     return x[0]|(x[1]<<8)|(x[2]<<16)|(x[3]<<24);
  9. }
  10.  
  11. int main(const int argc, const char **argv){
  12.     unsigned char *mem;
  13.     unsigned size,c=1,startaddr;
  14.     FILE *f;
  15.  
  16.     if(argc<2){fprintf(stderr,"s_protect_info searcher\nspsearch kernel...\n");return 1;}
  17.  
  18.     //read
  19.     //startaddr=strtoul(argv[1],NULL,0);
  20.     for(;c<argc;c++){
  21.         //fprintf(stderr,"%s: ",argv[c]);
  22.         f=fopen(argv[c],"rb");
  23.         if(!f){fprintf(stderr,"cannot open kernel\n");continue;}
  24.         fseek(f,0,SEEK_END);
  25.         size=ftell(f);
  26.         fseek(f,0,SEEK_SET);
  27.         if(size>0x2000000){fprintf(stderr,"too big\n");fclose(f);continue;} //32MB
  28.         mem=(unsigned char*)malloc(size);
  29.         if(!mem){fprintf(stderr,"cannot alloc memory\n");fclose(f);continue;}
  30.         fread(mem,1,size,f);
  31.         fclose(f);
  32.  
  33.         //search
  34.         {
  35.             unsigned int i=0,p=0,x=0;
  36.             for(;i<size-100;i+=4){
  37.                 if(
  38.                     mem[i+ 3]==0xe5&&mem[i+ 2]==0x9f                                   && // ldr r*,=immediate
  39.                     mem[i+ 7]==0xe3&&mem[i+ 6]==0xa0&&mem[i+ 5]==0x10&&mem[i+ 4]==0x48 && // mov r1,#0x48
  40.                     mem[i+11]==0xe5&&(mem[i+10]&0xf0)==0x90                            && // ldr ...
  41.                     ((
  42.                         mem[i+15]==0xe3&&mem[i+14]==0xa0                               && // mov r*...
  43.                         mem[i+19]==0xeb                                                   // bl
  44.                     )||(
  45.                         mem[i+15]==0xeb                                                   // bl
  46.                     ))
  47.                 ){
  48.                     //fprintf(stderr,"%08x\n",i);
  49.                     if(p){fprintf(stderr,"multiple hits (search error)\n");free(mem);goto next;}
  50.                     x=((mem[i+1]&0x0f)<<8)|mem[i];
  51.                     p=i+x+8;
  52.                     //fprintf(stderr,"%08x %08x -> %08x\n",i,p,read32(mem+p));
  53.                 }
  54.             }
  55.             if(!p){fprintf(stderr,"no hits (search error)\n");free(mem);goto next;}
  56.             fprintf(stderr,"%08x\n",read32(mem+p));
  57.             if(!isatty(fileno(stdout)))printf("%08x",read32(mem+p));
  58.         }
  59.  
  60.         free(mem);
  61.         next:;
  62.         break;
  63.     }
  64.     return 0;
  65. }
  66.  
  67.  
Advertisement
Add Comment
Please, Sign In to add comment