实验环境:
实验设备环境:windows xp
实验工具:strings,IDAPro,Ollydbg,Process explore
实验过程
使用strings进行静态分析:
我们可以看到此字符串中包含有一些网络连接函数以及创建线程的API函数。
接下来我们采用OD结合IDA的方式进行分析:
但是由于OD无法准确的定位到main函数开始的位置,所以需要采用IDA确定函数开始执行的位置:
在这里我们可以看到main函数的地址为:00401128
,现在我们可以在OD中跳到这个地址(Ctrl+G以后输入地址)并下断点:
运行程序到达断点处后我们会发现一系列数字,但是我们并不知道是什么含义,可以通过IDA获得字符串含义如下:
我们会发现其实在IDA中也是同样存在这些数字,鼠标点击相应数字后按'r'
建就可以转换成字符如下:
当然在OD中也可以获得,OD中单步执行到数字命令上方后点击跟踪执行按钮:
在单步执行过后就会发现:
继续向下执行到调用系统函数getmodulefilename处,这个函数的作用是获得当前运行程序的路径,现在来观看一下堆栈窗口:
现在我们可以通过跟踪其数据的方式查看运行程序路径,点击单步运行以后步过此系统函数后:
下面我们继续单步运行,会发现其调用了一个函数,在堆栈窗口发现其存在两个参数:
并且对比数据窗口中的地址会发现第一个参数就是路径信息,但是od并没有告诉我们此函数时什么,所以现在我们可以利用IDA进行查看:
也就是说od中的00401550
其实是_strrchr
函数。
分析IDA中程序,此函数的作用是获取文件名称(Filename)。
现在用OD步过此函数,会发现在寄存器EAX中会保存此文件名称:
继续向下步过,停在下一个调用call指令的位置(004014C0
),通过堆栈窗口我们可以发现其调用了两个参数:
但是OD还是没有给出此函数名称,我们可以通过IDA查看:
我们会发现此函数其实就是strcmp
函数,字符串比较函数,因为两个参数并不相等,所以就会返回一个非0值存储在EAX中。
接着步过,其会对eax中的值进行与运算之后会进行判断跳转,但是在OD中这样的结构并不明显,不直观,我们可以利用IDA进行分析:
其在运行完jz命令之后就会走红色的这条流程,跟随红色的流程其实就是函数结束流程,这也就解释了为什么我们点击程序就会闪退。
为了使程序运行我们需要将文件更改名字为:ocl.exe
使其可以通过strcmp
函数的比较。
更改名字后重新打开OD以及ODA,在OD中直接跳转到比较函数的位置,下断点之后运行,到达call指令位置后步过,此时我们会发现EAX寄存器中的值变为了全0。
此时就可以继续运行了,利用IDA图形化查看流程:
我们会发现其会调用一些有关于套接字的函数。向下分析发现其调用了一个无法辨析名字的函数:sub_401089
,其存在两个参数,我们可以利用OD运行到函数运行前:
即4012BD
的位置,下断点以后步过:
我们会发现其参数信息就是之前我们解析出来的字符串的一部分,第二个参数是一串unicode编码,在IDA中进入此函数,利用IDA反汇编出c语言代码:
重点在于上图中圈出的位置,其会将unicode字符串循环和之前我们解析出来的字符串进行异或。
同样在OD中我们会发现汇编语言中也会发现异或的汇编指令如下:
点击运行(此过程是函数内部过程,可以点击函数进入查找),持续运行以后我们会发现解析出来的数据信息:
我们可以发现会解析出一个网址。步过继续分析,退出此函数后回到主函数中,接下来调用函数:
但是我们发现在OD中无法识别此函数,但是在IDA中我们发现此函数就是gethostbyname
函数:
在OD中会的堆栈窗口显示出了此函数的两个参数:
此函数执行以后会返回一个IP地址。查看IDA流程图:
如果解析不成功那么就会休眠并返回继续循环解析,如果成功了,就会调用htons
函数将主机字节顺序转变为网络字节顺序,之后会调用connect函数进行远程连接。无论connect函数是否成功都会调用sleep函数然后返回主函数继续循环解析。
如果调用成功的话:
会调用上图中圈出的函数,双击进入:
其实图中所示的函数是一个远程的shell,在调用createprocess函数以前会使用startupinfo作为参数,并进行了相应的修改:
其中此参数就是将显示的窗口隐藏(因为等于的是0)。
最后会调用cmd.exe程序,同样也是隐式调用,用户无法发现。