首页
社区
课程
招聘
[原创]反调试之检测类名与标题名
发表于: 2019-1-25 22:46 6730

[原创]反调试之检测类名与标题名

2019-1-25 22:46
6730

分为两部分:1.介绍涉及到的API 2.实践

定义:GetProcAddress是一个计算机函数,功能是检索指定的动态链接库(DLL)中的输出库函数地址。lpProcName参数能够识别DLL中的函数。**

GetProcAddress函数被用来检索在DLL中的输出函数地址.

功能:CreateToolhelp32Snapshot可以通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照。

位置:Kernel32.dll
功能:OpenProcess函数用来打开一个已存在的进程对象,并返回进程的句柄。

功能:process32First 是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用process32First函数来获得第一个进程的句柄.

功能:Process32Next是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用Process32Next函数来获得下一个进程的句柄

功能:结束一个程序

功能:findwindow是函数检索处理顶级窗口的类名和窗口名称匹配指定的字符串,这个函数不搜索子窗口。

测试文件:bugger.exe(已上传至附件)
使用工具:OllyDbg v1.10
运行环境:windows xp(虚拟机)

①当我们打开bugger.exe,会弹出如下提示:

②当我们先打开ollydbg,再打开此软件时,无任何弹窗。

①首先将此软件载入od(如下图所示):

检查函数列表(ctrl+N):

我们发现函数列表中只有一个退出进程函数,并没有什么可疑函数供我们下断。我在前文介绍的第一个函数就是GetProAddress(需要了解的话可以看下)。此函数我们可以理解为一个间接调用函数,它里面存储了大量函数的地址。我们这里也可以猜想一下程序是否调用了此函数,此函数非常重要需要我们重点掌握,我们可以给此函数下F2断点(如图),这个函数由于没有在函数列表中显示,我们可以采取用bp的方式。这里也需要强调一点,不能对在函数列表中没有的函数使用bp的方式下断点,此函数不知道为什么是可以的,如果读者想要弄清楚可以自行研究,哈哈。

查看断点窗口,检查是否下好,已存在(如下图)

②F9运行OD(如图)。

程序断在了我们设置的断点处,我们也看到堆栈窗口处的GetProAddress函数及其参数(前面已经学习过,应该并不陌生吧)。我们这里看到它的第二个参数内容是“FreeLibrary”,这个对我们此实验没有用处,如果需要了解的话可以自己去了解一下,我这里不在做过多的讲述(后面还有几十个函数,一一介绍篇幅太长),这里我只介绍我们此次试验涉及到的几个重要函数。因为我们第一次断下来的这个函数并不是我们想要的,我们继续F9,寻找可疑的函数,并设置相应的断点(如下图),这个寻找过程需要花点时间,耐心一点。


以上函数的功能都已在上文给出,对应查看即可。

③紧接着我们继续F9,发现断在了我们下断的地方CreateToolhelp32Snapshot处(堆栈窗口)。

此函数将快照的句柄的返回值给eax(大部分函数的返回值都给了eax).

即返回值为00000038(十六进制),也可在句柄窗口中进行查看。

我们继续F8单步运行,程序断在了Process32First处,将快照的句柄(38)作为参数,指向快照列表中的第一项,如图:

我们把此函数执行完,看看有什么变化:

可以清晰的看到,它就是获取快照列表中的第一项。
④我们继续F8单步执行,程序断在了FindWindowA处。

我们发现它两个参数,在类名和标题名中任选一个设置就行,这里这个程序设置了类名,所以是基于类名的反调试,同理,如果设置的是标题名,就是基于标题名的反调试,希望能明白这一点。也有人会问这个类名和标题名是什么,这里我也给大家看一下,更能理解其内部原理。如图:(工具:WinDowse)

我们把鼠标指向我画箭头的那一栏,然后就会显示标题名(画圆圈的地方)

同样我们也可以得到我们的类名(画圆圈的地方)。
⑤我们把FindWindowA执行完,它会把类名的句柄返回eax(如图),此时也意味着我们的OD危险了。也有人会问,获得句柄干什么,我在最前面也介绍了句柄的含义,通俗的说就是为了控制该程序(后面的讲解会体现的很清楚,往下看)。

⑥我们在单步执行,执行到此处:

我们发现,这里将我们的OD的句柄与0进行比较,显然不相等,如图,程序则会跳转,顺序执行到ExitProcess,程序就会退出,并没有显示“没有调试的窗口”。如果我们的返回值等于0,也就是说没有发现正在调试该软件的程序,即快照列表中并没有此进程。我们修改Z标志位来使它不跳转。

这是我们修改标志位后,就会跳过退出进程,继续运行后断在了此处,这个函数我们也并不陌生,是获得快照列表中的下一个,在进行比较。因为刚才我们通过改变Z标志位,使得eax与0相等。我们此时也可以直接把程序跑起来,我们已经跳过了退出进程,则会正常运行。

⑦显然到了现在,我们已经很清楚了。做一个小结,此程序就是先给当前进程做一个快照,先获取快照列表中的第一个进程,然后与在设计软件之初在FindwindosA设置的类名进行比较,如果相等,则表明有进程在调试此软件,立刻退出。如果不相等,则获取快照列表中的下一个,在做比较,直至找出。如果没有此进程,程序正常运行。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-10-8 15:45 被kanxue编辑 ,原因:
上传的附件:
收藏
免费 5
支持
分享
最新回复 (10)
雪    币: 6270
活跃值: (3335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
技术贴,多谢分享
2019-1-25 22:48
0
雪    币: 596
活跃值: (335)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
共同学习,共同进步
2019-1-25 22:52
0
雪    币: 8930
活跃值: (5152)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs
4
技术贴,收藏备用,谢谢楼主
2019-1-25 22:55
0
雪    币: 1036
活跃值: (1311)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
5
有些东西 论坛有的,就不要重复在发了,这些基础的反调试知识,前辈们不知道总结了多少遍。
2019-1-25 22:55
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
干货分享,赞一个
2019-1-26 09:37
0
雪    币: 26185
活跃值: (63307)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
7
感谢分享!
2019-1-26 11:01
0
雪    币: 26
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
发现调试器立即格盘不更爽
2019-1-26 11:02
0
雪    币: 47147
活跃值: (20465)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
9
StriveXjun 有些东西 论坛有的,就不要重复在发了,这些基础的反调试知识,前辈们不知道总结了多少遍。
这个没关系。可以微创新。
2019-1-26 11:03
0
雪    币: 596
活跃值: (335)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
格盘确实行,但对象是操作系统,跟获得的某个程序的句柄一点关系也没有。在这个程序里是获得句柄,只是为了操纵控制OD的执行,简单的方法很多,在这里就是让大家懂得一些原理性的东西,知其根源。谢谢留言
2019-1-26 11:45
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢,大牛,学习了
2019-5-28 21:03
0
游客
登录 | 注册 方可回帖
返回
//