Lab 6-4
问题
1.在实验6-3和6-4的main函数中的调用之间的关系的区别是什么?
解答: 和以前一样,先按照书中的步骤走一遍
先是静态分析
导入的函数都和Lab 6-3
一样
字符串的话
也基本差不多,都和上一个程序一样,除了这点之外
然后这里会出现一个格式输出符%d
这是上一个程序里没有的
然后会发现这个代码的结构和上三个都不一样
我们从开始,这里和原来一样,调用sub_401000
,sub_401000
返回的是此时网络连接的状态,如果是不可用的状态,就返回0
,反之返回1
然后下面比较返回值和0
的关系,如果返回值不等于0
,则ZF=0
,然后jnz
跳转
跳转之后就继续执行其他的函数,反之如果返回值等于0
,那程序就跳转结束了,并且返回0
如果连接可用的话,继续查看这个代码就
这里程序将一个值0
赋给了var_C
然后无条件跳转到这里
将var_c
和5A0h
比较,再根据比较结果跳转,jge
是有符号大于跳转,现在var_C
是0
,所以这个跳转是不会实现的,那我们继续看,他不跳转之后会执行什么
函数不跳转之后,来到了这里,把var_C
压入了栈中,然后调用了sub_401040
这个函数
这个函数是调用InternetOpenA
来初始话一个网路连接,然后调用InternetReadFile
来从网络获取文件,最后比较获得文件的头四个数是不是<!--
最后返回第五个字符
我们可以将这个函数重命名为GetCommand
之类的
最后获得返回值之后,test
一下是不是为0
,如果是,则跳转结束,如果不是,继续执行
var_8
是程序从网页中获得的命令,压栈var_8
和一个字符串,之后调用sub_401285
,这个函数打开我们可以发现就是printf
函数,之后又压栈了一些参数,再调用sub_401150
,这个函数我们分析过,其实就是那个switch
语句,如果参数等于a
,b
,c
,d
,e
之类的,会执行不同的操作,我们可以将这个函数命名为CommandSwitch
之类的
然后函数睡眠60
s,再跳到loc_401251
的位置执行
这个代码是将刚刚被push进去栈中的数据赋值给eax
,然后将eax
增加1
,然后又把这个值返回栈中,有点像C语言的i+=1
哈
然后便是函数又跳回到这个程序开始的地方
不过这时候var_C
已经变成1
了
关系就是这么个关系
2.什么新的代码结构已经被添加到main中
解答: 新的代码结构我们刚刚已经说了其实,如果对C语言很熟的同学马上就会看出来,这其实就是个for
循环
3.这个实验的解析HTML的函数和前面实验中的那些有什么区别
解答: 书中的说法是
会调用
sprintf
函数来对输出进行格式化
也就是会改变User-Agent
的值
arg_0
是函数最后push进栈的参数
也就是var_C
的值,var_C
的值代表了函数已经
循环的次数,这里并不是函数已经运行的分钟数(书中解答有点潦误)
4.这个程序会运行多久?(假设它已经连接到互联网。)
解答: 因为这个for
循环是这样的
for(int var_C = 0; var_C <= 5A0h; i++)
这里要注意i++
和++i
的区别,i++
是在函数的最后执行完了之后才+1
,而++i
是立马就把1
加上了,IDA
中显示+1
是在最后,所以我们这里用i++
5A0h
翻译过来就是1440d
,然后这样算过了,这个函数会执行1440
次,一次会休眠60
s也就是一分钟,除去运行程序本身的时间,这个函数会运行1440
m,也就是24
h,也就是1
day
5.在这个恶意代码中有什么新的基于网络的迹象吗?
解答: 新的基于网络的迹象就是这个程序运行次数会写在User-Agent
里面,我们可以通过这个来确定这个程序已经运行了多少分钟多少次了
6.这个恶意代码的目的是什么?
解答: 和上一题一样,只是加入了for
循环
本文完