WolfKing 发表于 2022-11-23 12:24

[系统安全] Windows逆向必备知识、逆向分析小实战

本帖最后由 就叫东子吧 于 2022-11-23 12:52 编辑

文章目录:
[*]

[*]函数调用约定
[*]Windows API匈牙利表示法
[*]Windows注册表
[*]组件对象模型COM
[*]逆向分析小实战—Lab 7-3
[*]基础静态分析
[*]基础动态分析
[*]高级静态分析
[*]逆向分析总结
[*]

函数调用约定
注意:函数调用约定是编译器的事情,即在把C源码编译成汇编代码时考虑;而如果只关注源码的话,除了在函数前声明使用哪种约定外,没有任何差别。

Windows API匈牙利表示法Windows总体上使用匈牙利表达法作为API函数标识符。这个表达式使用一个前缀命名模式来使识别一个变量的类型更为容易。包含一个32位无符号整数的变量,或DWORD,会以dw开头。常见API前缀
Windows注册表
同时还可以通过.reg文件的注册表脚本来修改。

组件对象模型COM组件对象模型(Component Object Model,COM) 是基于Windows 平台的一套组件对象接口标准,由一组构造规范和组件对象库组成。组件对象不使用方法而用接口来描述自身。接口实质是一组函数指针表,每个指针必须初始化指向某个具体的函数体。
COM对象通过他们的全局唯一标识符(GUID)来进行访问,这个全局唯一标识符分为两类,是类型标识符(CLSID)和接口标识符(IID)。
COM类通过CLSID的GUID来标识,接口通过IID的GUID来标识。
通过这两个标识符来指定使用哪个类的哪个接口来实现功能,在此之前先要用这两个标识符来调用CoCreateInstance函数来完成初始化工作。
逆向分析小实战—Lab 7-3基础静态分析
strings64.exe Lab07-03.exe查看字符串,发现以下内容。

CloseHandle
UnmapViewOfFile
IsBadReadPtr
MapViewOfFile
CreateFileMappingA
CreateFileA
FindClose
FindNextFileA
FindFirstFileA
CopyFileA
KERNEL32.dll
kerne132.dll
kernel32.dll
C:\windows\system32\kerne132.dll
Lab07-03.dll
C:\Windows\System32\Kernel32.dll
WARNING_THIS_WILL_DESTROY_YOUR_MACHINE




根据函数名FindNextFileA、FindFirstFileA可以猜测这个exe文件可能会在一个目录中搜索文件。
CopyFileA、CreateFileA表示程序可能会拷贝和创建文件。
MapViewOfFile表示可能会把文件映射到内存中并进行拷贝。
还有两个很类似的dll动态库名,猜测程序的目的可能是用自己伪造的dll来替换windows自带的Kernel32.dll,以此达到隐藏的目的。




depends查看exe文件的导入表,并没有发现导入了Lab07-03.dll。



对Lab07-03.dll用string查看字符串


exec
sleep
hello
127.26.152.13
CloseHandle
Sleep
CreateProcessA
CreateMutexA
OpenMutexA
KERNEL32.dll
WS2_32.dll
strncmp
free


看到有ip字符串,表示程序可能会联网。同时CreateProcessA表示程序会创建新的进程。OpenMutexA表示程序会用到互斥量,用来控制同一时刻只能有一个恶意程序在运行


通过IDA发现这个dll并没有什么导出符号,这一点很奇怪。




基础动态分析直接双击运行程序后,apateDNS没有发现网络行为,但是Regshot发现了有修改注册表的行为,又好像这些修改跟这个软件没有什么关系,看不太懂。



高级静态分析
先分析dll文件,导入IDA。
通过图形话窗口看到这个dll里面的东西还是很多的,为了简略查看功能,搜索所有的call字符如下所示。




大多数函数在上面分析过了,这里先来到connect函数的位置。

判断是链接的127.26.152.13的80端口,接着往下看。




在创建一个新进程后,send了一个hello字符串。
根据下面的图示可以看到这个新的进程发送完hello后会收到一些数据。
根据recv收到的数据和一些字符串进行比较,进行下一步操作,是sleep还是exec还是q。





可以看到如果是exec,会调用创建进程函数



第二个参数lpCommandLine是有关创建进程的一些信息,查看这个变量。
根据负值可以判断是在当前函数的栈上申请的变量,同时距离buf变量5个字节,而buf又是recv来的数据,可以得出结论recv的数据是exec xxxx的形式。



到此知道这个DLL实现了后门功能,这允许攻击者通过发送回复给80端口上的一个数据包,来启动一个系统上的可执行文件。但依旧有一个疑问是这个dll没有导出符号。


接下来分析exe文件
mian函数一开始判断了命令格式,必须是两个字符串,并且规定了第二个字符串是什么。这就是为什么刚才双击后没有什么反应。



到此判断出执行程序的命令行为Lab07-03.exe WARNING_THIS_WILL_DESTROY_YOUR_MACHINE继续往下,看到打开了两个dll,一个是Kernel32.dll,另一个就是刚才分析的dll。

接下来是一些数据的处理,通过F5查看反汇编代码也能看出是对数据的处理。

这部分代码调用了sub_401040和sub_401070两个函数,书上说是在计算偏移地址等。最后到了结尾部分,看到CloseHandle等函数,关闭了两个文件后把Lab07-03.dll拷贝到kerne1.dll(注意这里是1)。

接着又传参调用了sub_4011E0函数,把C:\\*作为第一个参数传进去导函数里看,刚才第一个字符串参数被标记为lpFileName。这个函数第一步就开始FindFirstFile,然后是一些不调用任何函数的操作,先不管这些代码。再往后有一个malloc和call sub_4011E0,发现调用自己本身,判断这是一个递归函数。后面会和.exe字符串进行比较,如果相等的话会call sub_4010A0。然后这个函数内部还有FindNextFile等函数,到这里可以下结论,这个函数会在C盘找exe后缀的文件,如果是exe后缀文件,就调用函数进行一些操作。
跟进sub_4010A0函数,看到CreateFileA,CreateFileMappingA,MapViewOfFile,IsBadReadPtr等函数,无疑又是对文件进行操作。这个函数再往后看到stricmp函数和movsd、movsb指令,这是字符串操作函数。仔细分析是把dword_403010字符串传送ebx的位置。转到dword_403010字符串,看到如下信息,这是IDA错误的标记,高亮这个变量按a键即可转成字符串。是kerne132.dll,注意是1 。


现在知道这个可执行文件遍历整个文件系统来查找以.exe结尾的文件,在.exe文件中找到字符串kernel32.dll的位置,并使用kerne132.dll替换它。
逆向分析总结Lab07-03.dll被复制到C:\Windows\System32目录中并被命名为kerne132.dl。可以断定这个恶意代码修改可执行文件让它们访问kerne132.dll,这意味着了kerne132.dll会替代kernel32.dll被修改过的可执行文件所加载。而上面略过的繁琐的操作部分应该就是把真正的kernel32.dll的的导出表整合到自己的kerne132dll中。这样任何依赖kernel32.dll的程序都会先加载kerne132.dll,然后再通过这个加载的伪冒的dll来加载真正的kernel32.dll导出的函数。接下来可以通过基础静态分析来查看kerne132.dll的导出表来验证上面的结论。




搬运不易.....如内容有问题烦请管理立即删除即可。。。


{:5_124:}







lies 发表于 2022-11-23 20:08

谢谢分享!

Cerolluo 发表于 2022-11-23 20:17

感谢大佬,已收藏!

曾经沧海 发表于 2023-2-24 07:27

很有帮助,多多支持!

曾经沧海 发表于 2023-2-27 07:18

看了楼主的帖子。打算去自己练一下。

一生逍遥 发表于 2023-3-24 17:48

支持楼主   来学习学习下!

剑北苍 发表于 2023-4-21 00:44

谢谢分享

sjtkxy 发表于 2023-4-21 04:57

页: [1]
查看完整版本: [系统安全] Windows逆向必备知识、逆向分析小实战