程序分析 - task2

程序分析

首先,这好像是一个Delphi写的动态链接库。查询了一下DllmainDllEntryPoint之间的区别,大概是VC++的工程里入口函数叫做DLLMain,在其他编译器里叫做DllEntryPoint

然后载入程序进入DLLMain能看到如下界面:

image-20191029151631771


CreateSemaphore

网上查询能看到,是创建信号变量。但是好像在最后调用的CreateThread的新线程StartAddress里也没有使用到这个东西。


之后会调用check_filename函数,检查当前运行的进程是不是以xplore.exe结尾的,并返回一个bool值

image-20191029151717326

也就是相当于启动的父进程为资源管理器时就会开始hook,所以配套这个dll的应该还有一个注入器,作为第一个入侵的跳板


start_hook函数

image-20191029152224417

收先会取到Windows的Temp目录,并且在目录下找到一个配置文件,文件名为:ka.ini,再之后取出其中一个值与字符串1对比,意思应该是是否hook。之后就会加载这个dll(一开始并不知道他想要的dll就是他本身,后来继续看才发现的),并且调用函数HookWin32Apia这个函数去hook两个函数HttpSendRequestW/A


HookWin32Apia函数

这个函数可以在Export窗口,也就是导出表中找到。

image-20191029152819961

所以这种hook应该是hook的魔术表,并不是直接修改了库函数的代码

函数一开始会检测是否已经保存原始函数地址,之后寻找需要hook之后替换的函数地址并保存

再往下,就开始调整原始空间权限,然后将新的汇编代码写入那里

image-20191029153351203

image-20191029153416864

也就是比较传统的直接修改程序代码。

如果我没有理解错的话,这个函数的第二个参数就是switcher,用于控制hook和unhook


image-20191029153704332

这里直接检测是否为Windows,之后进入函数判断某个全局变量,不知道这个全局变量从何而来,不过也是一个完整的路径,判断是否为rundll32.exe

image-20191029153842209

以上是rundll32.exe的用途,应该就是直接运行dll的吧。

image-20191029154037557

如果是则开始放置messagehook开始监听消息Hookid是3,没写过这个东西,不太清楚是hook了哪一种,应该是WH_GETMESSAGE

image-20191029154153076

callback这里什么都没有做,直接传给了下一个hook。


image-20191029154307847

最后这里会检测某个全局变量保存的地址是否可读,然后如果不可读则进入条件体,开始调整空间权限。并且。当fdwReason == 0xE8的时候,会新开一个线程在后台运行,直接使用while 1,不停止驻留在系统进程里。


StartAddress函数

image-20191029154920050

一开始,以全局变量CurrentPID作为信号,当取得CurrentPID之后开始往下运行

下面的函数主要做的事情就是去patch了很多函数,而且是循环检测,保持patch的存在

但是我不太清楚为什么要patch这些地方,感觉他patch的这几个地方应该在hook之后都不用管吧。


image-20191029155619734

导出表中的这两个函数分别是替换掉的HttpSendRequestA/W

image-20191029155745499

其中的check_str函数中会检测URL中是否包含某些特定字符串,还有账号密码,然后通过发请求的方式发送到自己的vps上。

image-20191029155854868

然后开始我最不能理解的地方就是,这个函数的第二个参数应该是hook与unhook的控制器,但是在hook之后的回调流程中,他应该选择的是先解除hook回调之后再hook,但是整体流程是他解除hook之后就没有再hook回去了。

image-20191029161445064

很奇怪的流程,不太清楚具体用意。

总结

感觉不能用常规的思路去理解运行。