• 恶意代码分析


    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 地址

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

  • 相关阅读:
    9.5(day3)
    9.4(day2)
    web第一阶段 9.3(day1)
    8.29
    8.28
    8.27
    8.24
    dockerfile的编写
    深入解析pod对象的基本概念
    k8s最小调度pod的概念
  • 原文地址:https://www.cnblogs.com/freesec/p/6240082.html
Copyright © 2020-2023  润新知