分析一个程序(逆向工程)要从如下几点:
文件的创建、修改和删除(WinHex二进制编辑器)
注册表项目的创建、修改和删除(Process Monitor文件和注册表监控
https://technet.microsoft.com/en-us/sysinternals/bb896645)
网络通信(Wireshark 网络监控 https://www.wireshark.org/ )
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup存放在这个文件夹中的程序,会随着Windows启动自动运行(注:不同的系统可能不太一样)
注册表是Windows系统提供给应用程序的一个用于保存配置信息的数据库,其中保存的数据包括浏览器设置、文件夹类型关联、用户密码等。
Windows API信息 https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505.aspx
静态分析(总览全局)
阅读反汇编代码(将可执行程序用二进制编辑器WinHex打开或用反汇编工具
https://hex-rays.com/products/ida/support/download.shtml )
提取可执行文件中的字符串,分析使用了哪些单词
动态分析(细看局部)
获取文件和注册表访问日志(Process Monitor)
抓取网络包
调试器(http://ollydbg.de/)的一般功能:
断点
单步跳入、跳出(调用函数时是否进入函数内部)
查看寄存器和内存数据
分析Java编写的应用程序
在编译时,源代码会被编译成字节码(一种抽象的中间语言)
为各种环境分别安装能够解释执行字节码的虚拟机
Java反编译器(将字节码还原成源代码) http://java.decompiler.free.fr/ (eclipse)
如何防止软件被别人分析
反调试技术 IsDebuggerPresent 一种检测是否挂载了调试器的API函数 inr2dn
通过代码混淆来防止分析
将可执行文件进行压缩 打包器 http://upx.sourceforge.net/(支持ELF、DLL、COFF等)
通过unpacker、手动解包upx、硬件断点对ASPack进行解包
(软件断点:调试器将断点位置的指令改写成了0xCC(int3h)。处理器遇到0xCC指令,会通过操作系统将异常报告给调试器。硬件断点是通过直接写入寄存器(DR寄存器)来实现的,硬件断点只能设置4个)
利用软件的漏洞进行攻击
(虚拟环境: http://www.vmware.com/products/players.html
http://07c00.com/tmp/FreeBSD_8.3_binbook.zip(用户名:root/guest、密码root/guest;) http://07c00.com/tmp/Ubuntu-12.04_binbook.zip(用户名密码同上))
利用缓冲区溢出来执行任意代码;
绕开安全机制的技术:1.使用libc中的函数来进行攻击:return-into-libc;利用未随机化的模块内部的汇编代码进行攻击:ROP(面向返回编程)
防御攻击的技术
地址随机化:ASLR
除存放可执行代码的内存空间以外,对其余内存空间尽量禁用执行权限:Exec-shield
在编译时插入检测栈数据完整性的代码:StackGuard
用Metasploit Framework验证和调查漏洞
https://www.rapid7.com/products/metasploit/
各种安全漏洞的信息都在一个叫作CVE的数据库中进行统一管理 http://cve.mitre.org/find/index.html