主要是实现了一些工具,比如加密解密信息等等的。还实现了一个wget函数,其中的加密模块重用率还是比较高的,虽然key不同,但是方式基本相同。
x
void *x(void *_buf, int len)
{
unsigned char *buf = (char *)_buf, *out = malloc(len);
int i;
uint8_t k1 = table_key & 0xff,
k2 = (table_key >> 8) & 0xff,
k3 = (table_key >> 16) & 0xff,
k4 = (table_key >> 24) & 0xff;
for (i = 0; i < len; i++)
{
char tmp = buf[i] ^ k1;
tmp ^= k2;
tmp ^= k3;
tmp ^= k4;
out[i] = tmp;
}
return out;
}
nodbg
这是用来对抗gdb调试的,linux下的调试器并没有Windows上那么丰富,大多数还是基于gdb,所以对抗gdb就相当于对抗了很多。
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>
#include <elf.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/procfs.h>
#include <fcntl.h>
int main(int argc, char** argv)
{
int f;
static Elf32_Ehdr* header;
printf(".: Elf corrupt :.\n");
if(argc < 2){
printf("Usage: %s file", argv[0]);
return 1;
}
if((f = open(argv[1], O_RDWR)) < 0)
{
perror("open");
return 1;
}
//MAP_SHARED is required to actually update the file
if((header = (Elf32_Ehdr *) mmap(NULL, sizeof(header), PROT_READ | PROT_WRITE, MAP_SHARED, f, 0)) == MAP_FAILED){
perror("mmap");
close(f);
return 1;
}
// 修改文件本身的头部元素来对抗gdb调试
printf("[*] Current header values:\n");
printf("\te_shoff:%d\n\te_shnum:%d\n\te_shstrndx:%d\n",
header->e_shoff, header->e_shnum, header->e_shstrndx);
header->e_shoff = 0xffff;
header->e_shnum = 0xffff;
header->e_shstrndx = 0xffff;
printf("[*] Patched header values:\n");
printf("\te_shoff:%d\n\te_shnum:%d\n\te_shstrndx:%d\n",
header->e_shoff, header->e_shnum, header->e_shstrndx);
if(msync(NULL, 0, MS_SYNC) == -1){
perror("msync");
close(f);
return 1;
}
close(f);
munmap(header, 0);
printf("You should no more be able to run \"%s\" inside GDB\n", argv[1]);
return 0;
}
上述代码的思路还是修改elf的文件头来对抗gdb的,但是如果通过ida远程影响还是小一些。