[原创]默默无闻·恶意代码分析Lab1
[原创] 默默无闻·恶意代码分析Lab5
参照书籍:《恶意代码分析实战》;
文件来源:官网随书文件、或者附件中(文件密码:apebro
);
使用工具:WinHex、CFF、StudyPE+、Exeinfo PE、Resource Hacker、Depends Walker、OD、IDA、MSDN;
在这个实验中,你将分析在文件Lab06-01.exe中发现的恶意代码;
结果无壳;
问题:
1、由main
函数调用的唯一子过程中发现的主要代码结构是什么?
从main
函数开始找第一个调用sub_401000
,双击进函数一探究竟;
如果IneternetGetConnectedState
函数如果有连接,返回1,否则返回0;
返回值与0比较:
2、位于0x40105F
的子过程是什么?
看这个函数传递的参数是一个字符串;
这里我盲猜是一个printf
函数,为了验证,我们可以写一个例程进行反汇编;
再使用IDA
反汇编找到printf
函数一直看下去,找到如下页面;
看眼熟不。所以基本上可以判断,是一个printf
函数。
要说一句的是,我是编译成Realeass版本,而不是Debug版本,后者调试信息太多了,不适用对比
3、这个程序的目的是什么?
分析在文件Lab06-02.exe中发现的恶意代码;
结果无壳;
问题:
1、main
函数调用的第一个子过程执行了什么操作?
返回值与0比较:
2、位于0x40117F
的子过程是什么?
不解释了,又是一个printf
函数(如有问题看Lab06-1);
3、被main
函数调用的第二个子过程做了什么?
我们重点来看看loc_4010E5
处的解析规则;
选定字符使用r
键进行转换后;
选择拉取后发现,共0x200
也就是512个字节;
回到这个函数,我们发现,如果前面四个字符都匹配的话,会将第五个字符传给al
,也就是函数的返回值;
所以我们可以判断此函数的功能就是找到注释正文开始的地方将字符串首地址返回;
由标注出的被调用函数来看,这个函数的功能是从www.practicalmalwarenalysis.com
下载了网页,并且解析;
4、在这个子过程中使用了什么类型的代码结构?
很显然,这是一个多层if
的结构;
5、在这个程序中有任何基于网络的指示吗?
6、这个恶意代码的目的是什么?
综上所述:
在这个实验中,我们会分析在文件Lab06-03.exe中发现的恶意代码;
问题:
1、比较在main
函数与实验6-2的main
函数的调用。从main
中调用的新的函数是什么?
2、这个新的函数使用的参数是什么?
在call
上方是两个push
,所以是有两个参数;
因为函数传参是从右往左进行压栈;
所以函数可以看作sub_401130(ecx,eax)
;
仅仅到这里就够了吗?真的是逼死强迫症,我们还是试着找一下var_8
和argv[0]
两个具体是啥;
还记得var_20C
是啥么?没错,就是从HTML注释中解析出的字符串首字符;
所以var_8
就是HTML注释中解析出的字符串首字符
再看argv
是入口函数的参数,所以应该是用户输入;
又传给了CopyFileA()
函数,上神器MSDN瞅瞅;
原来是个指向字符串的指针;
至于书上答案说:argv就是Argv[0],是一个对当前运行程序名字,也就是Lab06-03.exe
的字符串引用。可惜的是,我并没有搜到Lab06-03.exe
这个字符串。所以我还是坚信是入口函数人为输入的字符串。如果有哪个大佬能指出问题所在,感激不尽;
3、这个函数包含的主要代码结构是什么?
4、这个函数能够做什么?
看到一个很亲切的数字61h
,这就是ASCll码中的a
;
紧凑的,由此可见,switch
判断的就是指令字符arg_0
是否为a
、b
、c
、d
、e
;
然后根据选择的不同,执行不同的功能;
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、在这个恶意代码中有什么本地特征吗?
可以将这些作为本地特征;
6、这个恶意代码的目的是什么?
在这个实验中,我们会分析在文件Lab06-04.exe中发现的恶意代码;
问题:
1、在实验6-3和6-4的main
函数中的调用之间的区别是什么?
多了些间接调用,感觉是加了其他结构;
2、什么新的代码结构已经被添加到main
中?
加了循环操作;
3、这个实验的解析HTML的函数和前面实验中的那些有什么区别?
这里出现了一个之前没用遇见的字符串Internet Explorer 7.50/pma%d
;
调用了下方是_sprintf
函数;
sprintf
返回存储在缓冲区中的字节数,不包括结束的null
字符。swprintf
返回存储在缓冲区中的宽字符数,不包括结束的null宽字符;
传入字符串参数经过sprintf
–>InternetOpenA
最终赋值给了InternetOpenUrlA
的hInternet
字段;
4、这个程序会运行多久?(假设它已经链接到互联网)
5、在这个恶意代码中有什么新的基于网络的迹象吗?
此字符串是一个User-Agent
,包含了一个计数器,记录了该程序运行了多久;
6、这个恶意代码的目的是什么?
第三篇了,感觉渐渐找到点感觉了
帖子中有所不足之处,还请看贴大佬指点一下,让我进步快一些;
int
main()
{
printf(
"hello World\n"
);
return
0
;
}
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
被平头猿小哥编辑
,原因: