[译]我们能相信自己的眼睛吗?

2012年9月11日 8 条评论

几天前一个客户向我们提交了一个样本(SHA1值为fbe71968d4c5399c2906b56d9feadf19a35beb97,检测结果为TrojanDropper:Win32/Vundo.L)。这个木马使用了一种特殊的方式劫持了vk.com以及vkontakte.ru这两个域名(都是俄罗斯的社交网站),并将他们重定向到92.38.209.252的IP地址。

通常劫持一个网站并将其重定向到攻击者的IP地址的方法是修改位于%SystemRoot%\system32\drivers\etc目录下的hosts文件,然而,当我们在被感染的机器上打开hosts文件的时候,里面并没有发现与vk.com和vkontakte.ru相关的重定向规则。

但是当设置显示隐藏文件的时候,我们发现了另一个hosts文件,该文件是隐藏的。
竟然在etc目录下存在两个名字同为hosts的文件,这到底是怎么回事呢?[......]

模拟Windows登录用户进行特殊操作

2012年8月19日 11 条评论

SYSTEM权限(服务启动程序)下如何读写当前登录用户相关的数据(桌面、开始菜单、注册表等等)?管理员权限如何提升到SYSTEM权限进行一些特殊的操作(一些关键的注册表位置、创建一个SYSTEM权限的进程等等)?一个非常关键的API就是ImpersonateLoggedOnUser,可以让当前线程模拟登陆用户进行操作(当然还可以从管理员模拟SYSTEM权限),用完之后记得调用RevertToSelf。

没有进行什么总结了,懒得写了⊙﹏⊙,贴几个地址吧:
服务应用程序如何访问当前登录用户的信息
模拟用户登录
创建高权限进程
从管理员身份获得 SYSTEM 权限的四种方法
如何读取指定用户的 HKEY_CURRENT_USER 注册表键
DLL注入到system进程后(在SYSTEM权限下弹MessageBox?)

照着从管理员权限到SYSTEM权限写了段代码:[......]

傀儡进程内存Dump

2012年8月11日 1 条评论

傀儡进程(参见《动态加载并执行Win32可执行程序》),简单的说是指通过给CreateProcess传递一个CREATE_SUSPENDED参数可以使得被创建的子进程处于挂起状态,此时EXE的映像会被加载到进程空间中,但是并不会立即被执行,除非调用ResumeThread。在ResumeThread之前,通过GetThreadContext获取主线程的上下文以取得PEB等,调用ZwUnmapViewOfSection/NtUnmapViewOfSection卸载子进程原有区块,通过VirtualAllocEx在子进程指定的基址分配空间,调用ReadProcessMemory和WriteProcessMemory这样的API来读写子进程空间的内容,调用 VirtualProtectEx修改内存的属性为可读可写可执行,最后调用SetThreadContext/ResumeThread即可让子进程执行恶意代码。

《动态加载并执行Win32可执行程序》提到的是把已知的EXE注入到其他正常的EXE之中,要获取到恶意代码直接拿到恶意的EXE就行了。而如果恶意代码是加密了的呢?[......]

msvcr90.dll下载9.0.30729.6161 9.0.21022.8

2012年8月10日 没有评论

有个网友问网卡MAC地址修改工具不能正常使用,提示“出现应用程序配置错误”,有关于“应用程序配置不正确”的问题,很多是因为缺少msvcr DLL文件(如msvcr90.dll,可以用Dependency Walker查看)或者版本不对的原因,如果要手工解决问题需要下载正确版本的msvcr DLL文件(已msvcr90.dll为例)并创建一个manifest文件到EXE的所在目录,具体参考Python2.6 py2exe打包程序提示应用程序配置不正确

这里提供9.0.30729.6161和9.0.21022.8两个版本的msvcr90.dll文件下载:
msvcr90.dll 9.0.21022.8
msvcr90.dll 9.0.30729.6161

下载下来后,把对应的DLL以及Manifest文件放在EXE所在目录即可。[......]

杂记:Sublime _ UltraCompare _ 代码重定位

2012年8月2日 没有评论

好久不写博客,也没有什么可写的,随便写写杂记吧。

文件的复制、移动除了CopyFile / MoveFile以及其Ex函数,还可以用SHFileOperation和IFileOperation(Vista后支持),具体可以参考:
http://blog.csdn.net/tht2009/article/details/6753706
http://blog.csdn.net/tht2009/article/details/6787271
代码重定位:机器码E8 00000000,也就是call $+5,shellcode及病毒代码中比较常见,
call @F
@@:
pop eax
sub eax, offset @B
详细可参考:http://blog.csdn.net/magictong/article/details/7610482

UltraCompare,一个不错的文件差异对比工具,支持二进制对比,感觉还不错。还有UltraEdit的列编辑功能很赞。
Sublime,一个不错的代码编辑器,可以考虑替换Notepad++了,装一个ConvertToUTF8插件可解决中文乱码问题。[......]

[转]虚拟机检测技术剖析

2012年7月21日 没有评论

前言

在当今信息安全领域,特别是恶意软件分析中,经常需要利用到虚拟机技术,以提高病毒分析过程的安全性以及硬件资源的节约性,因此它在恶意软件领域中是应用越来越来广泛。这里我们所谓的虚拟机(Virtual Machine)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。通过虚拟机软件(比如VMware,Virtual PC ,VirtualBox),你可以在一台物理计算机上模拟出一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,例如你可以安装操作系统、安装应用程序、访问网络资源等等。攻击者为了提高恶意程序的隐蔽性以及破坏真实主机的成功率,他们都在恶意程序中加入检测虚拟机的代码,以判断程序所处的运行环境。当发现程序处于虚拟机(特别是蜜罐系统)中时,它就会改变操作行为或者中断执行,以此提高反病毒人员分析恶意软件行为的难度。本文主要针对基于Intel CPU的虚拟环境VMware中的Windows XP SP3系统进行检测分析,并列举出当前常见的几种虚拟机检测方法。
[......]

逆向分析中快速定位Delphi TThread线程函数代码

2012年7月12日 2 条评论

Delphi中对线程的操作封装了一个TThread类,没接触过Delphi的人来说跟踪线程函数毫无头绪,即便是对CreateThread函数下断点,依然会遇到层层包装。

TThread是个抽象类,有个Execute的抽象方法。使用时需要自己派生出一个新类,并重载Execute方法,也就是Delphi的线程函数了。网上似乎也没有文章介绍如何跟踪Delphi线程函数,本人经过测试找到了一个看上去似乎很不错的快速定位方法。下面介绍本人的方法:

(1)在IDA的Functions Window中单击标题栏Function Name对函数名进行排序,然后就可以快速找到Classes::TThread:DoTerminate(void),双击来到函数;[......]

使用Windows CryptoAPI计算MD5

2012年7月7日 没有评论

About Windows CryptoAPI: Application programming interface that enables application developers to add authentication, encoding, and encryption to Windows-based applications.

直接使用Windows提供的CryptAcquireContext、CryptCreateHash、CryptHashData、CryptGetHashParam等API就可以计算MD5了,稍微封装了一下,可以算文件或者字符串的MD5值,文件传入UNICODE类型字符串的路径,字符串使用普通的CHAR,因为UNICODE和非UNICODE算出来的MD5不一样(字符串看上去一样,实际的BYTE不一样)。

计算MD5的测试代码如下:[......]

[译]动态加载并执行Win32可执行程序

2012年6月4日 20 条评论

本文所贴出的PoC代码将告诉你如何通过CreateProcess创建一个傀儡进程(称之为可执行程序A),并把dwCreationFlags设置为CREATE_SUSPENDED,然后把另一个可执行程序(称之为可执行程序B)的内容加载到所创建的进程空间中,最终借用傀儡进程(A)的外壳来执行可执行程序B的内容。同时这段代码也会告诉你如何手工对Win32可执行程序进行重定位处理,以及如何从进程空间中取消已经映射的EXE映像。

在Windows操作系统下,通过给CreateProcess传递一个CREATE_SUSPENDED参数可以使得被创建的进程处于挂起状态,此时EXE的映像会被加载到进程空间中,但是并不会立即被执行,除非调用ResumeThread。在调用ResumeThread之前,可以通过调用ReadProcessMemory和WriteProcessMemory这样的API来读写进程空间的内容,这使得这样一种情形成为可能:通过读取另一个可执行文件的内容来覆盖刚创建的处于挂起状态的进程的空间,然后通过原始进程的空间来执行第二个可执行程序的内容。可以通过如下的步骤来完成这个过程:[......]

通过异步过程调用(APC)注入DLL

2012年6月3日 没有评论

APC(Asynchronous Procedure Calls,异步过程调用)是指在一个特定的线程环境中异步的执行代码。当一个APC被添加到一个线程的APC队列的时候,系统会产生一个软中断;当线程下一次被调度的时候APC函数将被执行。操作系统产生的APC称为内核模式APC,应用程序产生的APC称为用户模式APC。只有当线程处于可唤醒状态(alertable state),用户模式的APC才会被执行。

每一个线程都有自己的APC队列,应用程序可以通过调用QueueUserAPC来队列中插入APC。当一个用户模式的APC插入APC队列之后,与之关联的线程并不会立即执行APC函数,除非线程进入可唤醒状态。当线程调用SleepEx、SignalObjectAndWait、MsgWaitForMultipleObjectsEx、WaitForMultipleObjectsEx、WaitForSingleObjectEx这些函数的时候会进入可唤醒状态。如果在APC插入队列之前线程已经进入等待状态,那么APC函数将不会被执行,但APC会仍然存在于队列之中,所以APC函数将会在线程下一次进入可唤醒状态的时候被执行。[......]