点击蓝字 · 关注我们 前言 恶意代码分析是安全从业人员非常重要的一个技能。 之前提到过SSDT hook隐藏和PEB断链隐藏,今天接触一下其他的。 参考书籍:<<恶意代码分析实战>> <> Lab13-1 这里先运行一下,可以看到对一个网站的请求。 然后用IDA查看,没有看到这个域名相关的信息。 看到这里抽取资源文件,并对资源文件进行了异或操作。 这里我们对资源文件提取,进行异或操作,可以看到域名。 之后再调用了一个函数,获得主机名。 这里之后调用一个函数,我们用od看一下这里干了啥。 可以知道这里进行了base64编码 然后发送请求 读取返回内容。 然后进行判断。 Lab13-2 用IDA打开。 GetTickCount GetTickCount返回(retrieve)从操作系统启动所经过(elapsed)的毫秒数,它的返回值是DWORD。 函数解除锁定的内存块,使指向该内存块的指针无效 GlobalFree 释放指定的全局内存块 GetSystemMetries 通过设置不同的标识符就可以获取系统分辨率、窗体显示区域的宽度和高度、滚动条的宽度和高度。 GetDesktopWindows 该函数返回桌面窗口的句柄。桌面窗口覆盖整个屏幕。桌面窗口是一个要在其上绘制所有的图标和其他窗口的区域。 该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。 该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。 CreateCompatibleBitmap 该函数创建与指定的设备环境相关的设备兼容的位图。 SelectObject 该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。 GetObjectA t函数得泛指得到对象,到指定图形对象的信息,根据图形对象,函数把填满的或结构,或表项(用于逻辑调色板)数目放入一个指定的缓冲区。 GlobalAlloc 该函数从堆中分配一定数目的字节数。Win32内存管理器并不提供相互分开的局部和全局堆。提供这个函数只是为了与16位的Windows相兼容。简称全局堆分配 GlobalLock 锁定内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处。 GlobalUnlock 函数解除锁定的内存块,使指向该内存块的指针无效,GlobalLock锁定的内存,一定要用GlobalUnlock解锁。 GlobalFree 释放指定的全局内存块 ReleaseDC 函数释放设备上下文环境(DC)供其他应用程序使用。函数的效果与设备上下文环境类型有关。它只释放公用的和设备上下文环境,对于类或私有的则无效。 DeleteDC 函数删除指定的设备上下文环境(Dc)。 DeleteObject 该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了。 先获得操作系统的时间,作为文件名 然后截图 之后进入一个加密函数 最后写入文件 那么怎么看到这个截图呢,一种方法是在加密前直接返回。 还有一种是将加密后的图片内容取出来,放到加密的参数,这里是先假设自定义加密是可逆的进行尝试。按住第一个字节,shift往下脱,在最后一个字节上面按一下。 Lab13-3 放入PEid,无壳,并且可以看到有加密字段。 放入IDA中查看,这里通过插件可以看到先是调用了AES相关的函数 接着启用了socket初始化,与服务器通信 然后这里创建了两个管道 之后创建了cmd的进程。 之后创建了一个线程,从socket读取内容。 这里还涉及到了一个函数,点进去查看,可以得知是base64 然后调用了另一个函数,也是读和写的操作,这里进行了AES加密操作。 理一下,就是socket获取服务器base64编码后的数据,然后解码传递给cmd,然后cmd运行结果aes加密,然后传递给服务器。 这里通过插件和字符串可以判断出AES加密和base64编码,AES的私钥可以从main函数中得知。