恶意代码分析

1.下载器和启动器

从远程主机下载其他文件,数据.  启动其他程序, 启动包含在本pe中进程,dll: 通常处于资源节中.用到FindResource,LoadResource,SizeofResource函数

2.后门

可能有的功能: 操作注册表, 列举窗口, 创建目录文件, 搜索文件, 本地监听端口, 外连外部端口..................

3.反向shell

windows 反向shell原理: 调用createprocess函数,并操作startupinfo结构,创建cmd.exe的进程.  再创建一个socket并与远程服务器连接,然后将这个socket与cmd.exe的标准流绑定      

4.远控程序

5.僵尸网络

6.凭证获取器

7.gina拦截

xp中,为了让第3方通过添加一些代码自定义登陆过程,如令牌,智能卡等. 这样就被恶意利用,用以拦截winlogon输入的凭证

即:winlogon-> eyi.dll->msgina.dll  

但是为了正常工作,恶意代码中必须包含至少15个前缀Wlx的函数, 可以通过这个分析某模块是否是拦截了gina

8.口令hash值转存, 如pwdump

pwdump原理是通过dll注入到lsass进程(本地安全认证子系统服务),因为这个进程有足够的权限来调用能获取hash的函数?

涉及的dll和函数:samsrv.dll!samrqueryinformationuser, samigetprivatedata, advapi32.dll!systemfunction025,systemfunction027

secur32.dll!lsaenumeratelogonsessions  msv1_0.dll!nlpgetprimarycredential

9.键盘记录

内核级: 绑定设备到键盘设备栈栈顶

用户级:hook 和轮询实现

hook使用setwindowshookex 函数

轮询使用getasynckeystate:按键是弹起还是按下, getforegroundwindow:识别当前聚焦的窗口

所以可能通过识别这些函数判断, 一些特殊键字符串:up, num lock, down, right,left,pagedown ... 

10 存活机制

1.自启注册表

2.appInit_DLL 中的dll会被调用了user32.dll的程序加载

3.hook特殊事件:登陆,注销,关机,锁屏,在注册表winlogon的notify键中

4.伪装成服务和覆盖服务:对于svchost.exe,作为它的一个dll使用.. .....  windows服务编程?

5.修改系统dll, 如dll的入口点劫持,并插入恶意代码到dll中而不破坏dll还能正常执行代码.

6.dll加载顺序劫持

xp默认加载dll顺序: 当前目录,/windows/system32/,/windows/system/, /windows/ ,环境变量PATH的目录. 

其次优先在一个注册表为KnownDLL键中的dll搜索. 所以如果一个不在KnownDLL中的且在搜索路径后面的dll可以前面被加载目录中的dll劫持.

7.windows xp以上的管理员权限获取, sedebugPrivilege. 

即使是管理员运行程序,还是没有管理员应有的所有权限. 如果设置sedebugPrivilege 后就有了. 涉及的函数

GetCurrentProcess(), OpenProcessToken,LookupPrivilegeValue,AdjustTokenPrivileges

8.进程替换

恶意程序以挂起状态创建一个正常的进程,然后替换该进程内存空间:ZwUnmapViewOfSection,释放目标进程内存,然后再分配内存,写入恶意数据代码

到目标进程中. 隐蔽性很高

9.apc注入?

数据加密

将用到的字符串,文件进行加密. 加密算法一般选择简单的算法以达到混淆的效果即可, 开销低,可定制化高,被识别出来几率低(对于des和aes等高级加密算法)

网络特征

1.先分析关于恶意代码所有数据. 提供真实环境分析数据痕迹和行为痕迹

针对痕迹进行搜索,再收集更多的被动信息. 如果url,dns  .....

2.混入正常协议如http,https,dns. 

3.使用隧道,如dns隧道.  利用协议字段,不是该字段原有的意义

4.与服务器通信的服务器端服务不单一. 利用合法请求中嵌入恶意数据

5.网络socket api信息

对抗反汇编

反汇编算法:线性反汇编和代码流反汇编

前者一次一条反汇编字节码,从不偏离 后者根据代码流的控制指令如jmp,call等指令针对性的反汇编

对于后者. 遇到条件跳转,总会反汇编它的下一条指令. 虽然跳转可能总是跳过去,这样可以在跳转指令下面插入字符串,但反汇编器

却会对字符串进行反汇编导致错误结果. 同理call指令下面如果写入字符串,也会对call指令下面进行反汇编.导致错误.在IDA pro中

使用d快捷键解决.

1.相同目标跳转指令对抗

2.固定条件跳转指令: xor eax, eax  jz $+1

4.指令间共用: eb ff c0 jmp指令和inc eax共用 ff

3.使用函数指针

4.使用retn 和ret

5.滥用结构化异常  通过seh来进行函数调用,迷惑反汇编:

push 函数地址

push fs:[0]

mov fs:[0],esp  

看到这种代码就是设置seh

还原栈: mov esp,[esp+8]; mov eax, fs:[0] ;mov eax,[eax];mov eax,[eax];mov fs:[0],eax;add esp,8

反调试:

1.windows函数: isdebuggerpresent和checkremotedebuggerpresent  都是检测peb中的beingdebugged属性,修改就能绕过.作用不大

ntqueryinformationprocess 函数

使用outputdebugstring: 向调试器输出字符串,如果没被调试肯定调用失败了,getlasterror()的返回值就不是error

dword error=11111; setlasterror(error);outputdebugstring("aaa");if(getlasterror()==error){正在被调试) 

2.processheap属性和ntglobalflag 当被调试时processheap将是不为0,后者为0x70. 在windbg -hd 程序.exe 即可禁用调试堆

3.系统痕迹检测:默认调试器注册表值如果是od之类的.   容易绕过

4.int 3 扫描. 使用硬件断点即可

5.代码完整校验.

6.时钟检测: rdtsc获取时钟数到edx,eax中

7.线程本地存储tls回调. 通过注册tls,pe文件将在入口点之前执行tls回调函数. 但设置了tls会多出一个.tls节. 并且通过ida的ctrl+e可以分析tls

8.使用异常: 如果调试器处理某些异常,那么处理后就不会讲异常发给程序的异常处理函数了,这时可以检测到异常没有下发下来,就检测到了调试器

9.使用int 3(0xcd03的双字节断点干扰windbg)干扰分析人员:  自己在代码中插入int 3,让分析者误以为是自己下的断点:

push offset continue; push dword fs[0];mov fs:[0],esp ;int 3 //被调试  continue: 没被调试

int 2d断点,探测内核调试器.

10.调试器漏洞,没什么用,换个版本,换个调试器即可

反虚拟机 针对vmware

1.vmware痕迹: 安装了tool后,3个进程:vmwareservice, vmwaretray,vmwareuser. 

带vmware的服务: net start | findstr VMware. 

vmware创建的目录, 注册表,设备如网卡,bios .   ........

2.绕过vmware痕迹检测. 和软件破解差不多

3.查询i/o通信端口. 类似于这种代码:mov eax,'VMXh';mov ebx,[ebp+var_1c];mov ecx,0xA;mov dx,'VX';in eax,dx;

mov [ebp+var_24],eax,mov [ebp+var_1c],ebx; ........ mov eax,[ebp+var_1c];cmp eax, 'VMXh';jnz 地址

跟踪代码直到检测虚拟机处,修改条件跳转.等 和软件破解差不多,反正就是让它正常继续执行

原文地址:https://www.cnblogs.com/freesec/p/6240082.html