本文内容分为两部分:

1、介绍涉及到的API

2、实践

涉及到的API函数的学习:

1、GetProcAddress

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

功能描述:

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

函数原型:

FARPROC GetProcAddress(
HMODULE hModule, // DLL模块句柄
LPCSTR lpProcName // 函数名
);

参数:

hModule

[in] 包含此函数的DLL模块的句柄。LoadLibrary、AfxLoadLibrary或者GetModuleHandle函数可以返回此句柄。

lpProcName

[in] 包含函数名的以NULL结尾的字符串,或者指定函数的序数值。如果此参数是一个序数值,它必须在一个字的低字节,高字节必须为0。

返回值:

如果函数调用成功,返回值是DLL中的输出函数地址。

如果函数调用失败,返回值是NULL。得到进一步的错误信息,调用函数GetLastError。

句柄(handle):

一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节) 长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不在I/O文件中,它是毫无用处的。句柄是Windows用来标志应用程序中建立的或是使用的唯一整数Windows大量使用了句柄来标识对象。

2、CreateToolhelp32Snapshot

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

函数原型:

HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取当前进程快照时可以设为0
);

返回值:

调用成功,返回快照的句柄,调用失败,返回INVALID_HANDLE_VALUE

3、OpenProcess

位置:Kernel32.dll

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

函数原型:

HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);

4、Process32First

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

5、Process32Next

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

6、TerminateProcess

功能:结束一个程序

7、FindWindowA(关键函数)

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

函数原型:

HWNDFindWindow
(
LPCSTRlpClassName,//指向类名
LPCSTRlpWindowName//指向窗口名
);
如果有指定的类名和窗口的名字则表示成功返回一个窗口的句柄。否则返回零。

参数:

lpClassName:

指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。

如果该参数为null时,将会寻找任何与lpWindowName参数匹配的窗口。

lpWindowName:

指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。

返回值:

如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。

如果函数执行失败,则返回值为NULL。可以通过调用GetLastError函数获得更加详细的错误信息。

实践部分:

测试文件:bugger.exe(已上传至附件)

使用工具:OllyDbg v1.10

运行环境:windows xp(虚拟机)

1.学会使用软件

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

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

猜想:此软件内部设有反调试机制,当我们运行此软件时,它会检测此时是否有调试软件(这里是ollydbg)正在运行,若有,则不运行,若无,则正常运行此软件。(当我们每次分析一个软件的时候,都应该学会首先使用这个软件,并做一定的测试,再做出一定的猜想)

2.分析原因

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

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

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

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

(2)F9运行OD(如图)。

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

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

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

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

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

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

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

可以清晰的看到,它就是获取快照列表中的第一项。

(4)我们继续F8单步执行,程序断在了FindWindowA处。

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

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

同样我们也可以得到我们的类名(画圆圈的地方)。

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

(6)我们在单步执行,执行到此处:

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

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

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

也许大家觉得这个没有必要知道,但是这是原理性的东西,能缕清我们的思路,在我们设计软件时也能给我们提供很多的思路,提高软件的安全。当然,我们现在大多用的插件,即可解决类似很多这样反调试的问题,但我们作为学习逆向的初学者,我们应该说是必须懂这些原理,同时也能带领我们学习熟悉更多的API.

我想这个原理大家看到这应该是有所明白了,如果有不明白的地方或者我表述不清的地方希望大家留言,我们一起探讨研究,共同进步,谢谢。

原文作者:小黑蛋

原文链接:https://bbs.pediy.com/thread-249136.htm

转载请注明:转自看雪学院

更多阅读:

[原创]ollvm字符混淆修复

[原创]二进制加壳原理与实现

[原创]Linux CVE-2017-16995整数扩展问题导致提权漏洞分析

[原创]没有对应驱动文件的系统线程

动态改变类名_反调试之检测类名与标题名相关推荐

  1. 动态改变标题_插入控件-gt;引用变量-gt;实现动态图表纵横筛选

    欢迎关注我的微信公众号:HR爱玩儿Excel和PPT,分享有趣又有逼格的Excel和PPT创意和技巧,emmm...不关注也没有关系...哼 昨晚没睡好,因为睡前老友跟我说了句话: 我们总部做的表没有 ...

  2. xcode动态改变窗口大小_详细的理论要点+3个经典案例,帮助你深入理解动态面板...

    什么是动态面板 动态面板是Axure的高级交互元件,由不同的状态面板组成,是我们制作交互过程中运用频率最高的元件,很多交互效果需要依赖动态面板实现.动态面板的状态面板就像是一个容器,我们可以在里面放置 ...

  3. tablayout 动态改变标题_描点法画函数图像的动态演示——动态数学软件GeoGebra制作教程...

    描点法画函数图像的步骤有: 列表 描点 连线 本文以制作一次函数 y=kx+b (k≠0)为例,先看效果: 觉得还不错的话,一起动手制作吧! 制作前 由于多个滑动条需设置为"递增(一次)&q ...

  4. 动态改变标题_小米相册更新,新增动态换天/赛博朋克/MIUI12界面等等!

    嗨咯,各位小伙伴们大家晚上好呀,今天为大家介绍一款灰度测试应用"MIUI相册"也就是大家小米手机里面的相册app,为方便解说,以下统称为"相册"更新后打开相册第 ...

  5. jq动态改变路径_在react中使用jQuery动态更改图片路径遇到的问题

    您好.如题.我在代码中是这样写的. step:1 为了将默认的小图片列表从上方移到左边,我设置了template Viewer.TEMPLATE = ( ' ' + ' ' ' + ' ' ' + ' ...

  6. 霜哥反调试及检测绕过

    现在一些小众的app都搞一波检测 frida, root , 面具 ,Xposed , Lposed等: 一用 frida 是不是闪退或者直接杀死程序呢: 现在有霜哥的课就不用怕了 ,所有东西成品魔改 ...

  7. 反调试方法---0xCC检测--检验API断点实现反调试

    反调试 0xCC检测 软件断点的原理:调试器在对应设置断点的位置上修改该地址的字节为0xCC.若是关键位置检测到该指令,可以判断进程处于调试状态. 0xCC既可以是INT 3指令,也可以是其他指令的操 ...

  8. APP加固各种反调试

    原文地址:http://drops.wooyun.org/mobile/16969 原文地址:https://blog.csdn.net/xinyu_pan/article/details/62888 ...

  9. 反调试技巧总结-原理和实现(1)(2)(3)(4)(5)(6)......

    反调试技巧总结-原理和实现 -------------------------------------------------------------------------------------- ...

最新文章

  1. 软件工程第二次作业完整版
  2. php删除文见,php如何删除文件夹
  3. stackedit:浏览器内的Markdowm编辑器(资源篇)
  4. 虚拟机VMware下安装Linux系统,Python3.7之TensorFlow安装
  5. Bridge模式——对象结构型模式
  6. 梦断代码阅读笔记 03
  7. foreman容器化部署
  8. 动态修改EasyUI accordion选中面板的标题(title)
  9. ExtJs学习笔记——Ext.grid.EditorGridPanel的使用
  10. html自动跳转页面,HTML实现页面自动跳转的五种方法
  11. RFID中的天线技术-应用及设计现状
  12. 报价管理解决方案丨汇信
  13. Linux下载GEO数据,教你3种方法下载NCBI GEO数据
  14. SpringBoot解决跨域请求的OPTIONS问题
  15. OpenCV裁剪图像任意区域
  16. 投影仪对焦应用镜头马达驱动芯片
  17. java反序列化与Apache CC链、fastjson反序列化的理解与研究
  18. win10设置默认中英文符号
  19. shell脚本回车换行_终于搞懂了回车与换行的区别
  20. 笔试题:计算机网络 (1)

热门文章

  1. Python实战从入门到精通第二十讲——调用父类方法
  2. 浙大 PAT b1052
  3. 【问答集锦】减少专家依赖,自动化机器学习如何实现AI普惠?
  4. 独立站现在好不好做?个人适合做跨境电商独立站吗?
  5. 吴恩达|机器学习作业4.0神经网络反向传播(BP算法)
  6. cookie知识总结
  7. 数据库知识点一共涉及这几方面知识
  8. 反向传播算法的详细解释(上)
  9. python和perl的区别_Perl和Python之间有什么区别?Perl与Python的简单比较
  10. python面试自我介绍_如何拿到半数面试公司Offer——我的Python求职之路