首页
社区
课程
招聘
[原创]常见反调试手段及其规避方法(二)-检测进程名
发表于: 2018-5-9 11:50 10565

[原创]常见反调试手段及其规避方法(二)-检测进程名

2018-5-9 11:50
10565

所谓检测进程名,指软件会获取所有当前正在运行的进程的名字,初步筛选出可疑进程,接着配合其他手段确认可疑进程是否真的是调试器的进程,如果是就将它关闭。

调试器:OllyDbg

环境:win7 64位真机

首先配置OD:在主界面点击选项-调试选项-异常


忽略所有异常,如图示。

来到“ 安全 ”选项卡-勾上:前三个和允许单步步入到未知命令,点确定。如下图


载入后,ctrl+n打开函数列表,发现很多很多函数,我们找到GetProcAddress,使用MSDN搜索,可知是获取另一个函数的地址。如果函数列表里没有可以的函数,说明他被隐藏,就是通过这个函数获取隐藏函数的地址的。


从MSDN上查阅函数的功能。百度百科上的内容可能不太准确。

翻译为:“从特定的动态链接库文件(DLL)中抽取出输出函数或者变量的地址”

什么意思呢?比如,函数列表里没有MessageBoxA,使用bp MessageBoxA是无法下段的。因为系统找不到。除非你用GetProcAddress获取这个函数的地址才能下断。

我们在GetProcAddress段首下断,观察堆栈窗口,hModule=0400000,ProcNameOr=”_CPPdebugHook


这个是该函数的 基址以及该函数的名字,当ctrl+f9后才能获取真正的地址。地址会返回给eax,注意95%的函数都是返回给eax。(还记得前面讲到的条件记录断点吗?这里留一个小作业给大家:用条件记录断点记录GetProcAddress函数的ProcNameOriginal参数)

知道函数的名字,还知道了他的首地址,就能在我们感兴趣的隐藏函数那下断了 。

一直f9,在堆栈窗口找可疑函数,如果你不知道是啥函数,就用MSDN查找。这是每一个初学者必须经过的过程。

F9,直到EnumProcess获取当前进程列表里边所有的进程的PID(如下图),就是任务管理器里所有进程的PID,ctrl+f9后直接bp eax,因为该地址在eax里面。这时记住要到B窗口里注释一下函数名称,不然以后肯定忘。


PID就是系统分配给当前每一个正在运行的进程的编号或者叫标识符。只要这个进程还存在,不被关闭,那么它的PID就不会变。当他再次打开以后,会获得一个新的编号,新的PID,虽然程序还是那个程序。任务管理器里的PID里是十进制数,2668(抱歉这里图上没有显示出来),那么是十六进制.0xA6C

我们还对EnumPeocessMOdules感兴趣,获得指定进程中所有模块的句柄。也下段,加注释。

我们对GetModuleBaseName感兴趣,通过进程句柄,进而获取进程名字,也下段,也加注释。

然后会执行到EnumProcess这里,断在段首时,ESP指向的一定是返回地址,ESP+4一定是函数的第一参数,这里的ESP+4是一个堆栈地址,我们在数据窗口跟随这个堆栈地址,这里就是存放进程列表的PID的,以这个地址为开头存储,每四字节存储一个PID。我们找到到 6C 0A 00 00,就是A6C,这里是PID为2668的OD调试器的PID。然后就选中这四字节,设置一个内存访问断点,既然我们获取了这个PID,我看看谁在获取这个值,接下来又执行了什么。

稍等一会儿,不要连续按,让子弹飞一会。

来到 OpenProcess ,我们来观察堆栈:

ProcessID=A6C     显然程序动了这块数据,把它提取出来压入堆栈了

Inheritable=FALSE

Access:VM_READ|QUERY_INFORMATION

来看看OpenProecess能干嘛:


翻译:“打开一个已经存在的本地进程”。

如果一个程序获取了另一个程序的句柄,,那他就可以操作另一个程序,比如关闭。比如外挂可以操作游戏。

这个函数的作用是获取当前PID的句柄,会把句柄返回到EAX中,请看MSDN中关于该函数返回值的陈述:



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

最后于 2018-5-9 11:56 被r0Cat编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (8)
雪    币: 2250
活跃值: (180)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
怎么规避呢?
2018-5-10 12:21
0
雪    币: 8715
活跃值: (8619)
能力值: ( LV13,RANK:570 )
在线值:
发帖
回帖
粉丝
3
1修改被比较的类型名名称,若原来是和OllyDbg.exe,将它改为其他名称  2.把关键call  NOP  掉  3.修改关键跳,即使检测到目标,跳向退出的跳转也不会执行。
2018-5-10 19:39
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
4
如果进程名能查到了,那插件名和OD内存特征码也不在话下了
2018-5-13 16:34
0
雪    币: 8715
活跃值: (8619)
能力值: ( LV13,RANK:570 )
在线值:
发帖
回帖
粉丝
5
Lixinist 如果进程名能查到了,那插件名和OD内存特征码也不在话下了
进程名是通过createtoolhelp32snapshot提取出的,来源于Windows的任务管理器。任务管理器里没有插件名和OD内存特征码吧?
最后于 2018-5-13 23:29 被r0Cat编辑 ,原因:
2018-5-13 16:57
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
6
amzilun 进程名是通过createtoolhelp32snapshot提取出的,来源于Windows的任务管理器。任务管理器里没有插件名和OD内存特征码吧?貌似提取插件名称得通过getmenu提取
我的意思是如果OD没有用驱动隐藏进程,进程名可以搜到,OD的插件DLL名也可以搜到(遍历每个进程的module),OD内存特征码也可以搜到(随便从OD内存里面抽一段做特征码)。如果隐藏了,r3下全都搜不到
2018-5-13 22:14
0
雪    币: 8715
活跃值: (8619)
能力值: ( LV13,RANK:570 )
在线值:
发帖
回帖
粉丝
7
Lixinist 我的意思是如果OD没有用驱动隐藏进程,进程名可以搜到,OD的插件DLL名也可以搜到(遍历每个进程的module),OD内存特征码也可以搜到(随便从OD内存里面抽一段做特征码)。如果隐藏了,r3下全都搜 ...
我觉得这个主意很棒。可惜我对写驱动隐藏进程了解不多。 StongOD 这个插件很好用,但我觉得写驱动隐藏OD并且完全不干扰程序及OD的正常使用是比较困难的,如果您有这方面的技术,期待您写一篇文章教教大家。
最后于 2018-5-14 16:48 被r0Cat编辑 ,原因:
2018-5-13 23:29
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
mark,小白学习中
2018-5-14 00:03
0
雪    币: 4215
活跃值: (6203)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢分享
2022-4-9 13:31
0
游客
登录 | 注册 方可回帖
返回
//