首页
社区
课程
招聘
[原创]默默无闻·恶意代码分析Lab6
发表于: 2021-4-6 00:37 8601

[原创]默默无闻·恶意代码分析Lab6

2021-4-6 00:37
8601

[原创]默默无闻·恶意代码分析Lab1

[原创] 默默无闻·恶意代码分析Lab5

参照书籍:《恶意代码分析实战》;

文件来源:官网随书文件、或者附件中(文件密码:apebro);

使用工具:WinHex、CFF、StudyPE+、Exeinfo PE、Resource Hacker、Depends Walker、OD、IDA、MSDN;

在这个实验中,你将分析在文件Lab06-01.exe中发现的恶意代码;

image-20210405155120562

结果无壳;

问题

1、由main函数调用的唯一子过程中发现的主要代码结构是什么?

image-20210405160134778

main函数开始找第一个调用sub_401000,双击进函数一探究竟;

image-20210405160453794

image-20210405161550501

如果IneternetGetConnectedState函数如果有连接,返回1,否则返回0;

返回值与0比较:

image-20210405163543162

2、位于0x40105F的子过程是什么?

image-20210405160819432

看这个函数传递的参数是一个字符串;

这里我盲猜是一个printf函数,为了验证,我们可以写一个例程进行反汇编;

再使用IDA反汇编找到printf函数一直看下去,找到如下页面;

image-20210405165219662

看眼熟不。所以基本上可以判断,是一个printf函数。

要说一句的是,我是编译成Realeass版本,而不是Debug版本,后者调试信息太多了,不适用对比

3、这个程序的目的是什么?

分析在文件Lab06-02.exe中发现的恶意代码;

image-20210405165904626

结果无壳;

问题:

1、main函数调用的第一个子过程执行了什么操作?

image-20210405170130995

image-20210405170338806

image-20210405170556878

返回值与0比较:

2、位于0x40117F的子过程是什么?

image-20210405171013786

image-20210405171104393

不解释了,又是一个printf函数(如有问题看Lab06-1);

3、被main函数调用的第二个子过程做了什么?

image-20210405171513799

image-20210405171756508

image-20210405172031255

image-20210405173844899

image-20210405174003035

我们重点来看看loc_4010E5处的解析规则;

image-20210405174548869

选定字符使用r键进行转换后;

image-20210405174652517

image-20210405175105079

image-20210405175300577

选择拉取后发现,共0x200也就是512个字节;

image-20210405175726903

回到这个函数,我们发现,如果前面四个字符都匹配的话,会将第五个字符传给al,也就是函数的返回值;

所以我们可以判断此函数的功能就是找到注释正文开始的地方将字符串首地址返回;

由标注出的被调用函数来看,这个函数的功能是从www.practicalmalwarenalysis.com下载了网页,并且解析;

4、在这个子过程中使用了什么类型的代码结构?

image-20210405180813125

很显然,这是一个多层if的结构;

5、在这个程序中有任何基于网络的指示吗?

image-20210405181233215

6、这个恶意代码的目的是什么?

综上所述:

在这个实验中,我们会分析在文件Lab06-03.exe中发现的恶意代码;

问题:

1、比较在main函数与实验6-2的main函数的调用。从main中调用的新的函数是什么?

image-20210405211259010

2、这个新的函数使用的参数是什么?

image-20210405211529032

call上方是两个push,所以是有两个参数;

因为函数传参是从右往左进行压栈;

所以函数可以看作sub_401130(ecx,eax)

image-20210405212815439

仅仅到这里就够了吗?真的是逼死强迫症,我们还是试着找一下var_8argv[0]两个具体是啥;

image-20210405213736941

image-20210405214759495

image-20210405215132034

还记得var_20C是啥么?没错,就是从HTML注释中解析出的字符串首字符;

所以var_8就是HTML注释中解析出的字符串首字符

image-20210405220435448

再看argv是入口函数的参数,所以应该是用户输入;

image-20210405223224950

image-20210405223442278

又传给了CopyFileA()函数,上神器MSDN瞅瞅;

image-20210405224336582

原来是个指向字符串的指针;

至于书上答案说:argv就是Argv[0],是一个对当前运行程序名字,也就是Lab06-03.exe的字符串引用。可惜的是,我并没有搜到Lab06-03.exe这个字符串。所以我还是坚信是入口函数人为输入的字符串。如果有哪个大佬能指出问题所在,感激不尽;

3、这个函数包含的主要代码结构是什么?

image-20210405225441767

4、这个函数能够做什么?

image-20210405225734003

看到一个很亲切的数字61h,这就是ASCll码中的a

image-20210405225958673

紧凑的,由此可见,switch判断的就是指令字符arg_0是否为abcde

然后根据选择的不同,执行不同的功能;

image-20210405230326518

image-20210405230410157

switch功能列表如下所示除了b的参数字符串没找到

(a):调用CreateDirectory,参数是C:\\Temp,如果目录不存在,就创建一个;

(b):调用CopyFile,两个参数,一个源文件,一个目的文件。此处功能将Lab06-03.exe(没找到这个字符串)复制为C:\Temp\cc.exe;

(c):调用DeleteFile,参数是C:\\Temp\\cc.exe,如果该文件存在就删除;

(d):在windows注册表中设置一个值,获得持久性运行。此处是将注册表键Software\Microsoft\Windows\CurrentVersion\Run\Malware的值设置为C:\Temp\cc.exe

(e):休眠100秒;

(default):打印Error 3.2:Not a valid command provided

5、在这个恶意代码中有什么本地特征吗?

image-20210405231347857

可以将这些作为本地特征;

6、这个恶意代码的目的是什么?

在这个实验中,我们会分析在文件Lab06-04.exe中发现的恶意代码;

问题:

1、在实验6-3和6-4的main函数中的调用之间的区别是什么?

image-20210405232814534

多了些间接调用,感觉是加了其他结构;

2、什么新的代码结构已经被添加到main中?

image-20210405233240195

加了循环操作;

3、这个实验的解析HTML的函数和前面实验中的那些有什么区别?

image-20210405233928008

这里出现了一个之前没用遇见的字符串Internet Explorer 7.50/pma%d

调用了下方是_sprintf函数;

sprintf返回存储在缓冲区中的字节数,不包括结束的null字符。swprintf返回存储在缓冲区中的宽字符数,不包括结束的null宽字符;

image-20210405235214974

传入字符串参数经过sprintf–>InternetOpenA最终赋值给了InternetOpenUrlAhInternet字段;

4、这个程序会运行多久?(假设它已经链接到互联网)

image-20210405235910754

image-20210406000111617

image-20210406000323334

image-20210406001544899

5、在这个恶意代码中有什么新的基于网络的迹象吗?

image-20210406002448122

此字符串是一个User-Agent,包含了一个计数器,记录了该程序运行了多久;

6、这个恶意代码的目的是什么?

第三篇了,感觉渐渐找到点感觉了

帖子中有所不足之处,还请看贴大佬指点一下,让我进步快一些;

 
 
 
 
 
#include <stdio.h>
int main()
{
    printf("hello World\n");
    return 0;
}
#include <stdio.h>
int main()
{
    printf("hello World\n");
    return 0;
}
 
 
 
 
 
 
 
 
// 初始化应用程序对Win32 Internet函数的使用。
HINTERNET InternetOpen(
    IN LPCSTR lpszAgent,
    IN DWORD dwAccessType,
    IN LPCSTR lpszProxyName,
    IN LPCSTR lpszProxyBypass,
    IN DWORD dwFlags
);
// 开始读取完整的FTP、Gopher或HTTP URL。如果使用的URL包含由空格分隔的相对URL和基URL,则首先使用InternetCanonicalizeUrl。
HINTERNET InternetOpenUrl(
    IN HINTERNET hInternetSession,
    IN LPCSTR lpszUrl,
    IN LPCSTR lpszHeaders,
    IN DWORD dwHeadersLength,
    IN DWORD dwFlags,
    IN DWORD dwContext
);
// 从InternetOpenUrl、FtpOpenFile、GopherOpenFile或HttpOpenRequest函数打开的句柄读取数据。
BOOL InternetReadFile(
    IN HINTERNET hFile,
    IN LPVOID lpBuffer,
    IN DWORD dwNumberOfBytesToRead,
    OUT LPDWORD lpNumberOfBytesRead
);
// internetCloseHeadle很显然就是关闭句柄,我就不再赘述了,有兴趣可以查一下MSDN;
// 初始化应用程序对Win32 Internet函数的使用。
HINTERNET InternetOpen(
    IN LPCSTR lpszAgent,
    IN DWORD dwAccessType,
    IN LPCSTR lpszProxyName,
    IN LPCSTR lpszProxyBypass,
    IN DWORD dwFlags
);
// 开始读取完整的FTP、Gopher或HTTP URL。如果使用的URL包含由空格分隔的相对URL和基URL,则首先使用InternetCanonicalizeUrl。
HINTERNET InternetOpenUrl(
    IN HINTERNET hInternetSession,
    IN LPCSTR lpszUrl,
    IN LPCSTR lpszHeaders,
    IN DWORD dwHeadersLength,
    IN DWORD dwFlags,
    IN DWORD dwContext
);
// 从InternetOpenUrl、FtpOpenFile、GopherOpenFile或HttpOpenRequest函数打开的句柄读取数据。
BOOL InternetReadFile(
    IN HINTERNET hFile,
    IN LPVOID lpBuffer,
    IN DWORD dwNumberOfBytesToRead,
    OUT LPDWORD lpNumberOfBytesRead
);
// internetCloseHeadle很显然就是关闭句柄,我就不再赘述了,有兴趣可以查一下MSDN;
 
 
 
 
 
 
 
 
 
 
 
 
0x401000();        // 检查Internet连接;
0x401040();        // 下载网页并解析HTML注释;
0x401271();        // printf;
0x401000();        // 检查Internet连接;
0x401040();        // 下载网页并解析HTML注释;
0x401271();        // printf;
 
+ `ecx`中存放的是`byte`的`var_8(是IDA给命名的)`;
+ `eax`中存放的是dword的`argv`;
+ `ecx`中存放的是`byte`的`var_8(是IDA给命名的)`;
+ `eax`中存放的是dword的`argv`;
 
 
 
 
 
 
CopyFile函数的作用是将一个现有文件复制到一个新的文件中。
 
BOOL CopyFile(
  LPCTSTR lpExistingFileName,
                          // pointer to name of an existing file
  LPCTSTR lpNewFileName,  // pointer to filename to copy to
  BOOL bFailIfExists      // flag for operation if file exists
);
CopyFile函数的作用是将一个现有文件复制到一个新的文件中。
 
BOOL CopyFile(
  LPCTSTR lpExistingFileName,
                          // pointer to name of an existing file
  LPCTSTR lpNewFileName,  // pointer to filename to copy to
  BOOL bFailIfExists      // flag for operation if file exists
);
 
 
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2021-4-8 14:55 被平头猿小哥编辑 ,原因:
上传的附件:
收藏
免费 4
支持
分享
最新回复 (5)
雪    币: 47147
活跃值: (20410)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
建议将件Lab06-01.exe,RAR加个密码以附件形式上传论坛一份,方便其他人学习,谢谢分享!
2021-4-8 11:25
0
雪    币: 2810
活跃值: (2913)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
kanxue 建议将件Lab06-01.exe,RAR加个密码以附件形式上传论坛一份,方便其他人学习,谢谢分享!
OK,马上上传文件链接;
2021-4-8 12:44
0
雪    币: 47147
活跃值: (20410)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
平头猿小哥 OK,马上上传文件链接;

若文件不大,直接上传附件,建议RAR加个密码,附上密码。

其他几篇的附件也上传一下。


2021-4-8 13:37
0
雪    币: 2810
活跃值: (2913)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
kanxue 建议将件Lab06-01.exe,RAR加个密码以附件形式上传论坛一份,方便其他人学习,谢谢分享!
已全部上传附件,密码帖子开头注明,感谢大佬的认可;
2021-4-8 14:57
0
雪    币: 16
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一定是程序的名称,并且包含了程序所在的完整路径
2022-11-3 15:04
0
游客
登录 | 注册 方可回帖
返回
//