第七章
第一题
首先先关注几个函数(积累)
上述函数很可能是创建服务,有可能开机自启动服务
上述函数有可能连接一个URL并进行下载
StartServiceCtrlDispatcherA函数中把sub_401040加入服务控制管理器会调用的服务控制函数
组合控制互斥量,没有就创建,有就打开
OpenSCManagerA:打开一个服务控制管理器的句柄,以便可以添加修改服务
GetModuleFileNameA:返回当前正在执行的可执行程序或一个被加载的Dll的全路径名,第一个参数是要获得路径名模块句柄,设置NULL来获取这个歌可执行的全路径名
CreateServiceA:创建新服务
注意划线参数
lpBinaryPathName就是获得可执行文件的路径名字,以便安装这个服务
dwStartType:设置服务的启动方式,有好几个值,本例子设置的是开机自启
首先
xor edx , edx 把edx清零
然后所有值设置成0
然后再年(year)的位置设置成2100
然后调用函数在不同格式之间进行转换
注意lpDueTime参数
是上面SystemTimeToFileTime返回的Filename参数
然后使用waitForsingleObject进行等待
esi循环体
Start表示启动函数
注意无条件跳转,无条件请求URL进行下载
总结:
1.创建互斥量,保证单独运行
2.创建一个服务保证自启运行
3.2100年1月1日
4.无限下载URL
第二题
首先注意以下函数
首先复习传递引用类型
很明显传递了ppv的地址,然后把经过函数改变的ppv的值传给了eax,判空eax
举例:ebp-4 为地址 [ebp-4] 为局部变量
首先初始化了一个COM对象,获得一个COM对象,对象存在局部变量中,标记为ppv,如果要判断COM功能,还需看iid与clsid参数
分别是IIDIWebBrowser2与Internet Explorer
不理解哈哈哈!!!!!
第三题
先看字符串
Lab07-03.dll告诉我们该exe可能访问dll
看导入表
注意函数
CreateFileA,CreateFileMappingA,MapViewOfFile
有可能打开文件并且映射到内存
FineNextFileA,FineFirstFileA
有可能搜索目录
CopyFileA有可能复制搜索到的文件
检查DLL的字符串
看到了一个ip,有可能连接到它
查看导入表,发现包含网络发送和接收的所有函数
技巧
函数图过于复杂我们可以线先只分析Call指令
View->OpenView->Function CALL
浏览函数大概
_alloca_probe:在空间分配一个巨大的栈空间
打开互斥体
scoket-------recv一定是要传输和接收数据,至于是什么不知道
首先检查connect窗口
一个固定的IP
一个80端口号
send函数
传输了一个hello数据
发送hello给服务器
查看期望回复什么数据
首先eax存放指针,指向缓冲区buf的指针
再次访问了缓冲区的指针,然后调用strncmp函数判断是否是sleep,如果是,则执行sleep函数,如果不是,则再次比较字符串是不是exec,通过strncmp的返回值来判定跳转
注意CommandLine参数
不理解,时候再补充
分析exe
开始比较eax的值是否为2,如果不是那么跳转直接结束
如果是,往下执行
发现了一个向上的循环代码
继续往下
这些函数应该是创建一个文件
我们发现这些函数出奇的复杂,应该是文件内存的偏移计算,这时候不要把时间浪费在分析这种函数的上面,直接查看他们调用了什么函数,最后直接动态调试这些函数往往更具有明显的价值
查看sub_401140与sub_401170
发现也是一堆关于内存偏移计算的函数,先跳过
仍然是一堆关于内存偏移计算的函数
此时这些函数应该代表着一个文件已经被修改完毕得到的结果
我们现在查看sub_4011E0函数
发现这个FindFirstFileA应该是和前面字符串c:\\一起调用组成在C这个路径搜索文件的一个操作
接下来又是一些浪费时间的函数
接下来查看下面调用了哪些函数,首先sub_4011E0是一个递归自己的函数
调用了sub_4010A0,查看该函数
首先这些都是映射文件到内存
频繁调用IsBadReadPtr,目的是判断进程是否可以有权限访问指定内存块
首先先对比字符串
然后注意几个函数 repne scasb和 rep movsd函数
这两个指令功能上与srtlen 与memcpy等价
继续观察主要部分,需要进行计算的部分
movsd与movsb是从esi指向的内存位置复制到edi指向的内存位置,预示我们要查看edi中是哪里
然后找到ebx和dword_403010
ebx出现在stricmp函数上面,我们发现下面的指令是把esi-----edi=ebx,也就是把esi的东西覆盖到ebx中,esi是dword_403010,查看一下
3,4,5,6,7开头的十六进制数字应该为ascii字符,按A键转换字符串之后
那么就真相大白,先比较字符串,如果不是kernel123.dll,那么就替换成kernel132.dll
第九章
先牢记几个指令