作者:冷锋(LengF) –[BHST]

博客:www.81sec.com      时间:2011-5-22

0x00 概述

最近搞一个国外的网站,对方是用的赛门铁克的诺顿杀毒软件,而内网又只对外开放了80端口,于是就想着传个端口转发或者端口复用的工具上去,可是一上传就没了。既然已经提权了,又不想轻易放弃这台服务器。于是就想着怎么办了。自己对非源码的免杀不熟悉,于是就想到自己手头有类似于LCX的工具c源码。对此,翻了以前学习源码免杀的笔记进行了一些总结。很少看到有朋友总结这方面的资料,我就以自己的一些经验总结一些关于源码免杀的一些技巧和方法,在文中我会以一些简单的例子来表达我的思路。为此,我分享我的经验的同时,也希望大家分享自己的免杀思路,毕竟一个人的力量有限,文章中难免有些错误,还望指出。

0x01 基于源码免杀原理

在学习源码免杀原理你要了解下PE结构,懂得如何去分析一个PE的各个部分。我们在源码免杀过程中可能涉及到下面一些情况:

[1]文件头的免杀(这种情况比较少,国外杀软杀的比较比较多);

[2]代码区的免杀(最常见);

[3]字符串的免杀(也很常见);

[4]输入表和输出表的免杀;

[5]版权信息的免杀;

[6]等待你的补充……

在测试免杀的过程中我们经常会用到一些工具,比如:

MyCCL…………..用于定位特征码,应用各种类型特征码定位

C32ASM…………16进制查看和字符串查找,字符串免杀和

Ollydbg…………..反汇编动态调试工具,代码区的免杀

LoadPE…………..查看PE结构信息,段区地址/输入表地址/输出表地址等查询

做好了工具准备,我们以一个测试的VC6.0编译出来为例来描述PE的各种结构,先给出代码:

#include "stdio.h"

void PrintMsg()

{

printf("Hello!LengF.\n");

}

int main()

{

PrintMsg();

getchar();

return 0;

}

我们以Release编译输出,我们先用LoadPE打开看看,如图01:

查看下入口点地址,还有子系统类型,另外就是区段表地址和输入表地址信息,对于下面分析有帮助。在用C32ASM打开这个程序,我分离各个我们在本文要涉及的区域,如图02:

这是对于PE结构的信息一些基本信息,我们往往并不需要准确定位各个区段的起始地址。我们在通过ollydbg查看下,了解下VC6.0程序的一些特点,如图03:

了解完这些我们就可以开始对基于C/C++的源代码进行免杀了。下面将根据不同部分提出自己的一些思路和经验。

0x02 免杀步骤

步骤:

1.免杀前,我们做一些简单的花指令(就是一些没有实际功能的指令,比如NOP),我们可以写这样一段函数:

Void NOPCode() // 花指令代码

{

__asm

{ // 我以NOP为例,NOP的个数随便,不过建议不要太多

NOP

NOP

NOP

}

}

然后再需要地方调用这个函数就可以了。这一步我们并不知道该PE文件的特征码的位置,只是按照经验添加,比如在调用某些特定的API函数,或者某些敏感的字符串。一般在调用前添加就可以了,当然你也可以添加在后面或者中间,只要不影响程序的正常运行即可。当然也可以是其他花指令,我们把这一步叫做预处理。源码免杀的好处就是不用重新确定程序的入口地址,编译完会自己确定。花指令的变化很多,大家自行研究。

2.利用MyCCL定位文件特征码的地址,尝试两种定位方法,即采用正向定位和反向定位。

经过多次MyCCL的定位得到一个特征码地址,然后通过C32ASM查看特征码在整个PE结构的中位置,就可以确定是处于文件头,还是代码区,还是输入表,还是字符串等位置。

3.最后一步就是经过一些特殊源码处理实现源码的免杀。下面将针对于各种类型的源码免杀思路。

0x03 常用源码免杀思路

1.字符串的源码免杀

我们以上面的源码为例,仅作稍微修改:

#include

#include

void PrintMsg()

{

MessageBox(NULL,”Hello!LengF”,NULL,MB_OK);

}

int main()

{

PrintMsg();

return 0;

}

首先我们通过C32ASM打开该release的文件,假设我们利用MyCCL定位到地址00006030为特征码,其内容如图04:

我们发现是字符串LengF,再到源码中搜索这个字符串。我们可以通过字符串的合并和分割方式来进行免杀,有几种方法:

[1]利用wsprintf,sprintf,strcat等进行字符串的格式化实现合并和分割,我们把代码改成:

char StrMsg[]={'H','e','l','l','o','!','L','e','n','g','F','\0'};

MessageBox(NULL,StrMsg,NULL,MB_OK);

再用C32ASM看下,发现已经找不到该字符串了。同理,我们可以先将两个字符串分成两个字符串,最后通过wsprintf或者sprintf或者strcat来合并起来。同理也是可以合并一些没用扰乱的字符串来蒙混过关。

[2]利用API函数倒序输出函数strrev函数,我们将上面代码改成:

char StrMsg[]="FgneL!olleH";

MessageBox(NULL,strrev(StrMsg),NULL,MB_OK);

这也是一种方法,能够躲过很多杀毒软件的查杀。

[3]字符串加密方式,有些只要经过简单的变形加密即可,对于那些比较复杂算法加密的不大建议;

除了上面三种方法,大家兴许还有更好的方法,还望分享,不过我想上面的几种思路已经足以应付了,只要灵活应用。

2.输入表函数源码免杀

输入表函数源码免杀只特征码被定位在PE文件的输入表函数(源码中的API函数)上的免杀处理方法。我们先通过LOADPE先看看我们上面字符串免杀那个程序的输入表的地址和大小,如图05

假设我们的特征码定位在MessageBoxA函数的地址(只是举个例子,一般这个函数不会被杀,其他函数也类似方法)那么我们到源码里面发现,我们在PrintMsg函数中调用了这个API函数,那么我们就要对他进行处理。对于输入表被查杀我们一般的处理方法是修改函数的调用方式,比如采用dll动态调用,通过上图,我们知道我们是以非unicode方式编译的MessageBox,他对应的非Unicode的函数为MessageBoxA,同时我们也得到这个MessageBoxA函数在UER32.dll文件中。那么我们修改MessageBox的调用方式为dll的动态调用,其代码修改成:

typedef int (WINAPI *MessageBoxAT)

(

HWND hWnd,

LPCSTR lpText,

LPCSTR lpCaption,

UINT uType

);

void PrintMsg()

{

char StrMsg[]="FgneL!olleH";

MessageBoxAT pMessageBoxA= (MessageBoxAT)GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA");

pMessageBoxA(NULL,strrev(StrMsg),NULL,MB_OK);

}

这样以后我们就修改了输入表中调用API函数的名称了。其他API函数也可以类似的修改调用方式。

3.版权免杀

这种没什么好讲的,只要修改源码中的版权信息即可。

4.一些编译技巧的免杀方法(推荐)

在利用VC6.0进行编译前我们可以利用一些预定义方法来修改编译的一些参数设置。我们我们没有设置就是按照默认的编译方式编译,你会发现明明没写几行代码,这就是为什么当你用C32ASM打开查看的时候你会发现存在很多没用的代码的原因了。我们可以参考下Microsoft的文档进行设置,我这里只对免杀一些比较好用的方法进行描述

[1]设置默认的程序入口函数名

学c语言的第一个知道的就是其程序入口为main,其实在操作系统装载应用程序后,完成初始化工作就进入main执行你写好的代码,在VC6.0下默认的控制台程序入口函数并不是main,而是mainCRTStartup,只是默认有一个预定义的编译参数:

#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )

同理,我们知道Win32程序的默认入口函数是WinMain,它对应的默认编译参数是:

#pragma comment( linker, "/subsystem:windows /entry:WinMainCRTStartup" )

而具体是设置哪个入口点是可以由连接器“/subsystem:”选项来设置的,可以指定四种方式:“CONSOLE|WINDOWS|NATIVE|POSIX”如果这个选项参数的值为“WINDOWS”,则表示该应用程序运行时不需要控制台。我们在VC6.0也可以使用图形化界面来设置,如图06:

当然我们也可以通过程序添加预定义代码来设置,比如:

#pragma comment(linker,"/subsystem:windows")

设置这个以后,控制台程序运行的时候就不会运行控制台了(背后的那个黑黑窗口),那设置这个选项有对于源码免杀有什么好处呢?

(1)修改程序的入口点可以让杀毒软件混淆,用OD载入后发现程序的入口点已经和原来不一样了,比如我设置:

#pragma comment(linker, "/ENTRY:procentry")

那么此时你的主函数名就不是main而是procentry了。

(2)设置子系统模式可以修改程序的运行方式了,更加隐蔽了,大部分木马服务端都是这样设置;

[2]优化编译选项

程序的编译方式是由连接器默认指定的,但是你会发现默认指定的并不是最好最优化的方式,它主要考虑的是兼容性方面的问题。所以我们有必要对其进行优化设置,在免杀中我们经常需要设置有以下几种:

(1)设置对齐方式

#pragma comment(linker, "/FILEALIGN:16")

// 设置最小节的大小,数值越小文件的体积就越小,不过最小是16

#pragma comment(linker, "/ALIGN:16")

(2)优化选项

// 清除从未引用的函数和/或数据

#pragma comment(linker, "/opt:ref")

#pragma comment (linker, "/OPT:ICF")

// 获得精简应用程序,减小体积

#pragma comment(linker, "/opt:nowin98")

作用:减小生成的PE文件体积,改变默认编译出来PE结构和地址分配。

(2)区段的合并和独立

我们利用LoadPE可以看到一个PE程序有多少个区段,比如上面那个程序有3个区段:.text,.rdata,data。那么我们在编译一个程序的时候也可以对这个程序进行区段的合并和独立。在编辑区段前要设置区段的属性,使用预定义参数设置:

// 设置data段属性为可读可写可执行

#pragma comment(linker, "/section:.data,RWE")

// 接下来就可以进行区段合并操作了比如,将上面的text和rdata都合并到data去

#pragma comment(linker, "/MERGE:.rdata=.data")

#pragma comment(linker, "/MERGE:.text=.data")

另外一种方法就是将一个文件的代码全部放置到一个自定义段中

#pragma code_seg("section1")

我分别使用截取了这三种方式的区段表,如图07:

通过上面的这些免杀的简单思路,他们具有很多有有点,包括:有效减小了release的生成PE文件体积大小;同时改变了PE结构的分布,有效的实现了对杀毒软件的干扰。有时候我们并不进行其他的免杀方式就可以实现免杀了。

0x04 总结

对于非源码的免杀来说,源码免杀具有更多的灵活性和降低免杀的实现复杂度。源码的免杀如果要完整的写就要写一本书了,本文只是做一下简单的描述,适合初学者学习,高手掠过。本文只是抛砖引玉,再次希望大家也分享自己的免杀思路。有任何问题建议请联系cn_lgz[at]126.com,或者博客(www.81sec.com)留言交流讨论。

参考资料:

[+]http://support.microsoft.com/kb/235956/zh-cn

[+]http://blog.csdn.net/lostangels/archive/2008/01/06/2027642.aspx

[+]http://msdn.microsoft.com/zh-cn/wf5kss02.aspx

[+]http://msdn.microsoft.com/zh-cn/library/bxwfs976(d=lightweight,v=VS.90).aspx

[+]http://wenku.baidu.com/view/abb27e4c2b160b4e767fcfea.html

上传的附件:

01.JPG

(98.00kb,540次下载)

02.JPG

(157.03kb,546次下载)

03.JPG

(60.12kb,535次下载)

04.jpg

(20.28kb,530次下载)

05.jpg

(48.51kb,534次下载)

06.JPG

(56.79kb,533次下载)

07.JPG

(54.31kb,536次下载)

c语言免杀程序源码,[原创]Window下基于C/C++源码免杀理论及思路(新手篇)相关推荐

  1. c语言免杀程序源码,Window下基于C/C++源码免杀理论及思路(新手篇)

    作者:冷锋(LengF) [BHST] 博客:www.81sec.com      时间:2011-5-22 0x00 概述 最近搞一个国外的网站,对方是用的赛门铁克的诺顿杀毒软件,而内网又只对外开放 ...

  2. c语言键盘连续双击程序,编了个C语言的键盘程序有点问题,请指点下!

    编了个C语言的键盘程序有点问题,请指点下! [复制链接] 做了个机械手,想用键盘来控制抓,放物品,现在他显示字符时有点错,高手能帮我在keil里跑下,把我的这个错改下吗?谢谢了!原程序如下:(P2.0 ...

  3. linux中yum源在那个目录下,Linux ---各种yum源配置详解

    yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.yum 的理念是使用一个中心仓库(repository)管理 ...

  4. 基于MATLAB的turbo码代码,一种基于Simulink的Turbo码仿真实现

    一种基于Simulink的Turbo码仿真实现 Implementation of Turbo Code Simulation Based on Simulink DOI: 10.12677/HJWC ...

  5. 7位格雷码计算风向_基于九位格雷码盘的风向传感器的制造方法

    基于九位格雷码盘的风向传感器的制造方法 [专利摘要]基于九位格雷码盘的风向传感器,涉及风向传感器设计领域,解决了采用七位码盘测量风向的风向传感器存在的测量精度低的问题,包括带有透光部分和遮光部分的九位 ...

  6. 如何用c语言编写发邮件程序,想学C语言发邮件程序?5分钟教会你:附送源码+教学!...

    关注<一碳科技>,获取更多知识! 前言 相信大家都有过被C语言网络编程所支配的恐惧吧?其实,小编在刚刚学习这方面的知识的时候也有这样的感受,并且所有的资料都是从网络寻找的,但是,现在你们不 ...

  7. 知识付费网站php源码,原创在线教育知识付费类源码只要50元

    语言: PHP 数据库: Mysql 带手机端+集成支付功能+课程分销系统 运行环境:整站程序采用PHP+MYSQL架构,内核使用的是织梦Dedecms5.7 源码语言:UTF-8 注意:该模板只能手 ...

  8. linux nat源码分析,Linux下NAT/NAPT规则源码分析

    前面有一篇文章分析了为什么在PREROUTING做DNAT对本地连接不起作用?本文再紧接着上文,深入分析一下NAT/NAPT的规则. 事情的起因要从上的那篇的文章说起,因为我的本科生毕业设计也是做P2 ...

  9. c语言流水调度作业,最简C语言流水灯程序,给初学者看下,高手请绕行。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 你好!请教一个问题. 在下面的程序中,while(1)这个循环,注释掉和没注释掉板子上的led的动作是一样的.请问一下会是哪里出问题呢? #include ...

  10. C语言在建筑专业的应用,新工科背景下基于OBE的《C语言程序设计》课程建设

    摘要 针对高校工科专业<C语言程序设计>课程教学,分析了目前课程教学存在教材的内容组织不合理.教学模式落后.教学资源与教学匹配度不好等问题,这些问题严重阻碍了开展新工科背景下的以" ...

最新文章

  1. 124页,UC伯克利大学胡戎航博士论文公布:视觉与语言推理的结构化模型
  2. thinkphp中出现unserialize(): Error at offset 533 of 1857 bytes如何解决
  3. 古塔问题matlab,基于 Matlab 对古塔变形趋势探究的数学模型
  4. 实操:商品列表三级分类的实现方法
  5. VMWare虚拟机下为Ubuntu 12.04.1配置静态IP(NAT方式)
  6. 翻转二叉树—leetcode226
  7. TensorFlow CIFAR-10数据集
  8. note同步不及时 one_一辆理想ONE又“跪了”?理想官方紧急发文回应
  9. python numpy教程_Python中的Numpy入门教程
  10. asp.net的一些对话
  11. Java并发编程之CountDownLatch闭锁
  12. 开闭原则应用-书店打折Java代码实现
  13. java移动业务大厅案例_基于Java的SOSO移动大厅项目(功能全部实现了)
  14. 导致ERP企业管理系统实施失败的四点原因
  15. smartbi连接mysql数据库_Smartbi_V9配置MySQL8作为知识库
  16. C#串口编程基础入门
  17. 怎么正确理解股票量化的概念?
  18. 家用路由器常见之基本概念
  19. 百度地图让用户“私人定制“:一场语音定制背后的AI能力强势输出
  20. 谁锁了我的帐号?(AD账号的锁定状态查询)

热门文章

  1. 沃特玛采集均衡模块_采集均衡模块以及电池管理系统技术方案
  2. java 异步写_Java异步编程实战
  3. 基于python实现微信公众号爬虫_基于Python实现微信公众号爬虫进行数据分析
  4. 小甲鱼 C语言 帮助社区大妈编写一个打疫苗登记程序
  5. 74xx系列芯片说明
  6. centos 5.6 x86 安装 文泉驿字体
  7. js一键批量打印_前端vue项目实现批量打印功能
  8. matlab菲涅尔衍射光强分布,矩孔菲涅耳衍射的光强分布.pdf
  9. 安装Spyder IDE
  10. 第十三届蓝桥杯省赛模拟赛