lab20-01
1sub_401040函数使用,参数this,用ecx来传递这个参数
在sub_401040函数内部,也可以证实这点,而且URL就是上面的http://www.practicalmalwareanalysis.com/cpp.html
可以看到程序非常简单,就在上面那个URL下载文件到c:\tempdownload.exe
Lab20-02
1注意字符串
关键函数是sub_401000
这个函数内部在搜索.doc和.pdf文件.并且是遍历了c盘下的全部目录
下面三个连续的判断是,再看文件属性是不是一个目录,是不是当前目录,是不是父目录,如果不是,说明是一个文件而不是目录,所以跳到loc_40113F判断是个.doc还是.pdf文件(这里有个疑惑,如果strncmp返回0那么说明是父目录或是当前目录也就是说不递归调用了,但是第一个判断FILE_那个不为0的时候,那么他的属性也不一定就是我们要的FILE_ATTRIBUTE_DIRECTORY可能是隐藏文件什么的,那么这个时候也执行递归调用明显是不合理的,看od结果,程序会递归搜索,这样一个目录,明显是不合理的虽然程序回正确返回,回正确执行,但是这个代码这样写是不太高效的)
也就是程序应该,最好只递归调用属性为目录的文件,而且注意到程序递归调用深度为7
如果不是目录就会判断是.doc还是.pdf文件
这里有三个处理方式,一个是为.doc文件时候
这里的off_4060E0和off_4030DC都是虚函数表,而且明显off_4060DC是子类,所以他会执行下面三个函数中的sub_401440函数
再看.pdf是执行sub_401380函数
这两种都不是则调用父类的unknow_libname函数,这个函数没做什么
现在看一下.doc和.pdf做了什么
打开这个ftp链接
用主机名和序号填充如下格式
然后用上面得到的文件名,上传我们找到的.doc文件到之前打开的ftp
.pdf做类似的事不再赘述
lab20-03
1字符串信息蛮多的,不过下面三个比较重要
注意到这个函数调用,我们很容易想到这是对config.dat文件的操作.具体作什么进去看看
看到第一个函数调用sub_403180
在进入查看函数,知道打开了config.dat文件,并且在下面读取文件内容,再往下看(注意这里的esi+18c)
注意到这个函数调用,这里参数ecx事读取文件数据的缓冲区指针,90h是长度,eax就是上面的esi+18c的内容,4E
进入函数查看,关键地方,我们知道是用4E和原来内容异或
我们用winhex打开.dat文件然后和4E异或,得到下面字符,可以看到有很多有用信息
所以我们知道第一个函数sub_401EE0是config.dat相关的函数,他读取并且译码了config.dat里面数据,还初始化一些全局变量
注意到程序里面不少这样的代码块,从CxxThrowException我们可以知道这是一个异常处理函数,而,异常处理对象是var_AC,他在sub_4036F0函数调用时候作为一个this指针,使用一个字符串初始化异常处理对象
看了课后分析才注意到,对于sub_401EE0函数之前,创建了一个新的对象,并且传到ecx作为this指针,在sub_401EE0函数内部被赋值给ESI,而后的一些列操作,都是对这个esi也就是this指向的对象的初始化操作
还有一个就是sub_403180之前也创建一个对象,并且作为this指针传给sub_301080作为参数,在sub_403180内部同样这个this被赋值给esi后面的一系列操作也都是针对这个this对象的
这个对象有如下数据(sendobject)
104:127.0.0.1
144:50
148:127.0.0.1
188:5A
18c:4E
190:01
然后之前那个对象有如下数据firstobject(var_14)
0:sendobject
10:/index.html
14:/info..html
18:/response.html
1c:/get.html
20:/put.html
24:/srv.html
28:TOCI
2c:ASGD
上面的数据是ollydbg跟踪sub_401EE0之后的对象情况并不是只有这些数据,还有很多数据都在后面被填充
现在看sub_401F80函数,在这个函数之前又创建一个对象,同样传递了this指针给sub_403D50函数,再看这个函数的两个参数,(向前追溯可以知道esi为firstobject)所以,144h偏移为50h这个应该是端口,104h偏移是127.0.0.1
sub_4051D0是正常的网络初始化操作不用管
sub_4042c0是做ip转换的也不用管
后面就是建立连接了
我们可以知道sub_403D50是个建立连接的函数
sub_402FF0是得到主机信息的函数
sub_404ED0函数由提示信息知道是send http post,发送http请求的函数
sub_404B10函数同样不难知道是接受http回应信息的函数
sub_4015C0可以推测是检测回应信息是否合法的
这之后的loc_40207D就只是做一些转换和赋值操作
回到函数sub_403BE0
现在我们知道函数sub_401F80是和远端建立连接并且发送http请求并且读取相应信息的函数(实际上要分析细节还是很麻烦的,这里面我们这么快能得到信息确定每个函数做什么其实是因为很多的提示信息告诉我们的,并不是我们具体分析每个函数细节得到的)
最后一个函数sub_402410函数先调用sub_404cF0函数发送http请求,然后sub_404B10函数接收相应数据,sub_4015c0检查相应数据
最后由对象esi偏移为4的数据决定做什么操作
看关键的switch语句
可以看到
case 98 : sub_4025E0内部调用sleep函数
case 100:sub_402BA0内部注意到调用了writefile和createfile函数,知道这应该是个下载功能
case 101:sub_402c70是上传文件,注意提示信息uploading error
case 102;sub_402D30应该是发送主机信息的函数
case 99 :sub_402F80运行程序
case 97:返回函数,删除对象这个对象是之前分析的firstobject
可以知道这一遍下来分析是要比我们之前的程序要困难的,我们大多直接根据提示信息得知这个函数做什么,而不是具体分析,应该c++语言的封装性,让我们对于很多变量参数的分析变得困难.
分析结束