有关彩虹猫病毒的一些小小的分析

关于这次分析,是AHDX,XY老师的实验课程的作业

以下仅代表个人part的一些小分析,希望能够帮助到大家

有关/main部分:调用:利用shellExecuteExW,参数为/main

 

 

进到/main的功能部分:上边所说的main进程,主要的功能部分是下方,从开始看起,定义了两个变量V8,V9,V8初始化为0,V9初始化为了一个静态的(因为以OFF开头)地址

 

点进V9的地址内部,发现V9是函数的地址集合,里面包含了10个地址集,也就是10个函数的起始地址,两个双字节型的变量排列的很整齐,基本上是一个地址一个值,所以猜想V9存储的是一个结构体型的数组

 

继续往下看:发现V9的确存储的是一个数组

 

 

这个部分调用了sleep函数,Sleep函数的功能是将程序挂起一段时间,也就是暂停运行一段时间,所以sleep函数的参数就是时间,联系上面可以知道,V9[0]存储的是所调用的函数物理地址,而V9[1]存储的是程序执行的挂起时间,也就是停止等待的时间。所以现在可以猜测V9的结构体的结构为:

Struct

{

    DWORD   函数地址;

    DWORD   等待时间;

}

继续往下看,V8初值为0,经历了循环,判定值是V8<0xA,所以这个循环体经历了10次循环

 

接着看循环体内部结构,发现CreateThread函数,利用了V9以及sub_401A2B函数作为参数,下面给出CreateThread函数的参数示意

function CreateThread(
  lpThreadAttributes: Pointer;        {安全设置}
  dwStackSize: DWORD;             {堆栈大小}
  lpStartAddress: TFNThreadStartRoutine; {入口函数}
  lpParameter: Pointer;            {函数参数}
  dwCreationFlags: DWORD;            {启动选项}
  var lpThreadId: DWORD            {输出线程ID}
): THandle; stdcall;               {返回线程句柄}

所以程序调用的时候以Sub_401A2B作为函数的入口地址,以V9作为函数参数创建线程。点进Sub_401A2B函数内部

 

发现它将传入的参数作为一个循环,分别调用。总的来说/main部分就是分别调用了上述V9结构体数组中存有的10个函数。下面分别分析10个函数的作用。

第一个函数sub_4014FC

 

 

这里调用了shellExecuteA函数,功能是打开一个外部程序

ShellExecuteA(

0, {0表示系统打开}

  "open", {操作}

 "1.mp3", {操作路径}
0, {第四个,第五个参数都是保留参数,默认都为0}
0,
0); {0隐藏,1正常,3最大化,6最小化}

 

所以这里是打开了V3路径的一个外部程序,看一下V3,V3调用了sub_401A55函数,跳转过去看一下

 

这里最重要的是CryptGenRandom函数,它的功能是产生随机数

 BOOL WINAPI CryptGenRandom(

 

  HCRYPTPROV hProv,    是一个CSP句柄, 

DWORD dwLen, 缓存区的大小

  BYTE* pbBuffer 存放返回随机数据的缓存区

);

所以子函数sub_401A55的函数功能是返回一个随机数,回到函数sub_4014FC,发现它的功能就是随机打开外部程序

 

好的,第一个函数分析结束,下面开始第二个函数Sub_40156D分析:

 

 

这个子函数主要的就是两个部分:GetCursorPos以及SetCursorPos函数,这两个函数是WINAPI,作用是获取鼠标当前坐标以及设置鼠标当前坐标,所以就很简单:这个子函数sub_40156D功能是让鼠标跳动起来

 

OK,第二个子函数也分析结束,第三个Sub_4017A5:

 

 

第三个子函数最主要的调用是SendInput函数

下面给出sendinput的函数参数

SendInput(
    __in UINT cInputs,            //缓冲区大小

  __in_ecount(cInputs) LPINPUT pInputs,  // 参数
    __in int cbSize);            // 参数大小

Sendinput的主要功能是模拟键盘输入,这里将Pinputs作为函数参数,实现模拟键盘输入的功能

第四个函数sub_4015D4

 

在第四个函数中,起作用的主要是PlaySoundA函数

下面给出PlaySoundA函数原型

BOOLPlaySound(

LPCSTR pszSound,  是要播放声音的文件名

HMODULE hmod, 应用程序的实例句柄

DWORD fdwSound); 标志的组合掩码

 

fdwSound可选值有SND_FILENAME、SND_ASYNC、SND_SYNC等。
  SND_FILENAME表示pszSound参数指定的是文件名(pszSound还可以指定资源、内存音乐、系统音乐等等);
SND_ASYNC:用异步方式播放声音,PlaySound函数在开始播放后立即返回;
  SND_SYNC:同步播放声音,在播放完后PlaySound函数才返回;
  SND_LOOP一遍遍的重复播放声音,必须与SND_ASYNC标志一块使用。

所以子函数Sub_4016A0的作用是播放声音(现象中听到的提示音)

 

第五个函数Sub_4015D4

 

这个函数中包含有5个windos API函数,现在一个个来看

第一个GetDeskTopWindow函数->该函数返回桌面窗口的句柄。桌面窗口覆盖整个屏幕。桌面窗口是一个要在其上绘制所有的图标和其他窗口的区域。

第二个GetWindowDC函数->返回hWnd参数所指定的窗口的设备环境。获得的设备环境覆盖了整个窗口(包括非客户区),例如标题栏、菜单、滚动条,以及边框。这使得程序能够在非客户区域实现自定义图形,例如自定义标题或者边框。

第三个GetWindowRect函数->取指定窗口的边框尺寸。屏幕坐标的尺寸是相对于屏幕的左上角。

第四个BitBlt函数,这个函数是这个大子函数的核心函数,函数参数如下:

BOOL BitBlt(

int x,     逻辑单元x轴左上角坐标;

int y,   逻辑单元y轴左上角坐标;

int nWidth, 设备矩形宽度

int nHeight, 设备矩形高度

CDC* pSrcDC, 源设备上下文

int xSrc, 源矩形 x轴左上角坐标

int ySrc, 源矩形y 轴左上角坐标

DWORD dwRop  指定要进行的光栅操作

);

所以这个函数的功能是获得了当前屏幕存在的窗口,使得窗口闪烁

第五个ReleaseDC->与GetWindowDC配合使用,释放句柄hwnd

 

第六个子函数Sub_40162A

 

这个子函数创建了一个以Sub_401994作为函数入口的线程

 

点进参数sub_401994

 

发现内部存在4个函数,接下来一个个分析

GetCurrentThreadID函数:判断是否在同一个线程中

SetWindowsHookExW函数:这是一个钩子函数,它可以向操作系统注册一个特定类型的消息拦截处理方法

函数原型如下:

HHOOK WINAPI SetWindowsHookEx(

__in int idHook,

__in HOOKPROC lpfn,

__in HINSTANCE hMod,

__in DWORD dwThreadId);

MessageBoxW函数:弹出对话框

所以这个函数的主要功能是给操作系统下了一个钩子,检测到相同线程的话,就继续运行自己(因为第三个参数是0所以钩子钩了自己)所以弹出的对话框无法关闭正是因为这个钩子的原因。

 

第七个子函数Sub_401866

 

相比于上面的函数,这里新出现的函数有3个

GetSystemMetrics函数->GetSystemMetrics函数可以获取系统分辨率,所以上述的V1与V2分 别为屏幕的宽度与高度的一半即为中心。

LoadIconW函数->这个函数的主要功能是加载一个图标资源在此子函数中主要配合下面 DrawIcon函数使用

DrawIcon函数->这个函数的主要功能是绘制一个图标

所以通过这三个主要函数我们可以分析得到,这个子函数的功能是在屏幕上绘制一些图标,而其中利用了GetCursorPos函数获取到鼠标的坐标,所以这个函数的功能也就显而易见了,也就是在鼠标当前位置上绘制一些系统内部自带图标我们可以观察到的在鼠标移动的时候出现了一些怪异的图标。

 

第八个子函数Sub_401688

 

相对来说这个函数比较简单,只有一个新函数:EnumChildWindows函数

首先,此函数给V0赋值为桌面所有窗口的句柄(GetDesktopWindow()函数返回),然后调用EnumChildWindows函数遍历窗口上的所有控件

对于此函数原型

BOOL EnumChildWindows(

HWND hWndParent,     父窗口句柄

WNDENUMPROC lpEnumFunc, 回调函数的地址

 LPARAM lParam); 自定义的参数

所以这个函数利用了V0作为父窗口句柄,EnumFunc函数作为回调函数遍历控件,我们现在点进EnumFunc函数内部:

 

这里首先分配了空间给V2,之后调用SendMessageTimeoutW函数

 

lresult sendmessagetimeout(

hwnd hwnd,   窗口句柄

uint msg, 信息

wparam wparam, 第一个参数

lparam lparam,     第二个参数

uint fuflags,   发送选项

uint utimeout,   持续时间

pdword_ptr lpdwresult   同步调用的返回值

);

一般每个线程有两个队列,一个用来接受通过Send函数的消息第一个参数),另外一个队列接收通过Post接收的消息第二个参数)。该两个函数的基本区别是,一个函数需要等待返回的,相当于函数调用,这个是SendMessage;另外一个是将消息放到对方的队列中直接返回。

所以这里是将V2放入了队列中直接放回,之后调用了sub_401AA0子函数

 

点进去发现这里是对V2进行了一些数学上的变换,这里就不做细致分析了。

整体上来说,这个子函数其中最主要的函数就是EnumChildWindows,所以这个子函数的作用是遍历存在的所有窗口。

第九个子函数Sub_4017E9

 

点进去发现这个子函数最主要的功能性函数是StretchBlt函数

下面给出此函数的函数原型(与上面的BitBlt函数有点相似):

BOOL StretchBlt(

HDC hdcDest, 指向目标设备环境的句柄

int nXOriginDest, 指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。

int nYOriginDest, 指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。

int nWidthDest, 指定目标矩形的宽度,按逻辑单位表示宽度

int nHeighDest, 指定目标矩形的高度,按逻辑单位表示高

HDC hdcSrc, 指向源设备环境的句柄

 int nXOriginSrc,          指向源矩形区域左上角的X轴坐标,按逻辑单位表示坐标。

int nYOriginSrc, 指向源矩形区域左上角的Y轴坐标,按逻辑单位表示坐标。

 int nWidthSrc, 指定源矩形的宽度,按逻辑单位表示宽度。

int nHeightSrc,   指定源矩形的高度,按逻辑单位表示高度。

DWORD dwRop) 指定要进行的光栅操作。光栅操作码定义了系统如何在输出操作中组合颜色,这些操作包括刷子、源位图和目标位图等对象。参考BitBlt可了解常用的光栅操作码列表。

V1首先获得了桌面所有窗口的句柄

V2获得了窗口的设备环境

调用GetWindowRect函数获得v1(也就是桌面所有窗口)窗口的尺寸,存放入Rect中

所以这里是获得了所有的窗口句柄,对现有窗口进行更改,与第五个子函数Sub_4015D4相似,都是对窗口进行操作,但是不同的是这里是对窗口的颜色进行更改,而第五个子函数是针对于窗口的闪烁进行更改。

第十个子函数Sub_4016CD

 

这个子函数没有涉及到新的函数,所涉及函数上面都已经给出,看到了sub_401A55生成随机数,又看到了对Rect.right和Rect.bottom的修改,所以很容易的得到了,这个函数修改的是窗口的尺寸参数,也即窗口分辨率。

 

综上,main部分调用的10个函数分析完毕,总结如下:

sub_4014FC   打开外部应用程序

sub_40156D  实现鼠标跳动

sub_4017A5   模拟键盘输入

Sub_4016A0   播放声音

Sub_4015D4   窗口闪烁

Sub_40162A   弹出对话框,对话框无法关闭

Sub_401688   遍历所有子窗口

Sub_4017E9   窗口颜色怪异化
Sub_4016CD   更改窗口分辨率

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值