main函数call的是sub_40100
双击跳转到相应位置
InterntGetConnectedState查阅文档,是检查本地系统是否连接网络的函数,将函数的返回值存储在[ebp+var_4]位置,比较是否为0,若函数返回值为0,cmp比较后赋予ZF为1,跳转到loc_40102B,否则继续执行输出success,显然是个明显的if语句
可以看到无论跳转到哪个分支,程序都会调用子函数sub_40105F,跳转到相应位置
通过汇编无法看出具体的功能,答案指出是printf,依据是调用前其都会压入字符串,N键给他重命名成printf方便后面分析
由此可见此程序的目的就是检测系统是否存在网络连接并打印出相关字符
第一个子过程和第一个程序一样,调用的子过程40117F也是printf
跳转到第二个子过程
调用了三个打开网络HTTP请求的API函数,请求相应网址,若打开成功,跳到loc_40109D,否则输出打印失败
再看loc_40109D,InternetReadFile接受InternetOpenurlA返回的句柄
也就是cc.htm
继续看loc_4010E5
前四个字节是对<!--字符的对比,匹配失败打印,成功则把匹配的第五个字符传入al,然后结束子过程
继续往下看
al会被传入[ebp+var_8],然后传入eax,test结果不为0,jnz跳转到40115C,传入ecx作为40117F的参数打印,最后执行Sleep函数
和之前的程序多了一个sub_401130,可以看到多了两个参数,一个是401130子过程的返回值,即之前提到的注释之后的第五个字符。
另一个ida已经给出了注释,存在的文件名,反编译查看是argv,即本身文件名
审视文件结构,arg_0即在htm中读到的字符,最后会被传入ecx,减61h即a,变成0,此时与4比较,第一个操作数小于第二个操作数,ja指令不跳转,继续赋值到edx,无条件跳转到jpt_401153,ida很贴心的给出了注释,swich跳转
双击即可看到switch语句汇编中经常使用的跳转表
分别跳转的是这几个功能
注意右边的注释,case97,即''a",创建目录C:\\temp,case98,即b,复制自身程序为cc.exe,case99,删除文件
case100
将程序作为键值写入注册表,注册表记录的是系统自启动项
case 101,即e,执行sleep,除了这五种跳转外,其他的命令会输出不是一个有效命令,反编译可清楚看到相应结构
并且结合程序功能来看,被添加的键值和创建的目录都是该程序的本地特征
对比结构,发现多了一个调用,该子过程在执行结束后又指向了之前的子过程
直接反编译,实际上是套了一层for循环
同样与lab3不同的是sub_401040,双击点开,这里新出来一个agent
程序会带上这个agent访问目标url,回到汇编
var_C负责计数,程序结束后会无条件跳转回loc_401251完成自增,在loc_40125A中首先和540A也就是1440比较,jpe指令的跳转条件是:如果上一条指令结果中又偶数个1则跳转,否则继续执行,若eax自增到1441,即使得PF=1,触发jpe指令,每一轮循环都会跳到sub_401040
接着分析sub_401040,首先压入了arg_0和一串字符串,之前for循环中压入了Var_C作为sub_401040
arg_0应当就是计数的值,随后将szagent赋值ecx压入,sprintf的三个参数集齐
随着计数的变化,agent也会发生变化,有利于躲避一些检测agent的机制或提取agent筛选日志的方法。功能大致和lab-3程序相同。