0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从一个简单的C++小程序入手 站在汇编角度C++程序的条件判断语句

strongerHuang 来源:strongerHuang 作者: Mr Six 2021-01-18 11:24 次阅读

在当下,如果还能熟练地用汇编写程序的人怕是会被当成怪人来对待(我之前公司就有一个用汇编程序的),即使是研究逆向的人大部分也只能说看得懂汇编,很少有人敢说他精通汇编的。

如果是做开发的话,我也觉得汇编确实也没什么用。 “简单”既是汇编的优点,同时也是它的缺点。就是因为它的确太“简单”了,所以,要实现一个很简单的功能也需要很多的代码。 有时候我看到一大段的汇编代码也感觉很头疼,但是由于业务需要,让我不得不研究一波高级语言在底层的实现过程,所以就写了这么一篇文章。 我们先从一个简单的C++小程序入手:

380d29e4-58f8-11eb-8b86-12bb97331649.png

这个程序功能很简单,就是输入一个整数,然后判断它是不是和123456相等,如果相等就输出you are right,如果错误就输出you are wrong。

然后把生成的exe文件利用反汇编工具再还原成汇编语言。

385505e8-58f8-11eb-8b86-12bb97331649.png

上面这张图是程序的开头部分。

38c1fb94-58f8-11eb-8b86-12bb97331649.png

而这张图是结尾部分。

可以看到,这个程序的起始地址是00FA1000而结束地址是00FA2FF。也就是说,要实现这么一个小小的功能,要用到几千行汇编代码。如果大家都这么开发,怕是累死也写不出个啥。

不过这里面的大部分代码都是编译器帮我们生成的,真正执行判断操作的代码大概就只有下面这几行。

39011662-58f8-11eb-8b86-12bb97331649.png

我先是在命令行里面输入了123,在00FA1082处下了一个断点,然后回车,程序就断下来了。

399b61d6-58f8-11eb-8b86-12bb97331649.png

关键的判断操作就是cmp dword ptr ss:[ebp-0x8],0x1E240

这个操作的意思是,把0x1E240这个数和内存里面地址为[ebp-0x8]的数据进行比较。

0x1E240转换为10进制可以看到就是123456,也就是触发you are right的整数。

39d479e4-58f8-11eb-8b86-12bb97331649.png

从右边的寄存器窗口可以看到寄存器ebp的值为00CFFB48,则[ebp-0x8]=00CFFB40

从数据窗口可以看到00CFFB40处的值为7B。

3a25b728-58f8-11eb-8b86-12bb97331649.png

转换成10进制刚好为123,也就是我刚才输入的数。

3a68b6b8-58f8-11eb-8b86-12bb97331649.png

如果两者相等的话,则会把zf标志位置为1,若不相等,zf位为0。

现在可以从右边的寄存器窗口看到,zf位为0,则jnz跳转就成立,从而跳过you are right而去执行you are wrong。

到了最后,在00FA10AE处的指令是jmp short Project1.00FA1060。jmp是无条件跳转指令。这条指令执行会跳回到刚开始要求用户输入整数的操作,相当于实现了while的功能。

现在假设这个程序是个付费软件,要求用户来输入一个密钥来解锁软件。如果我让这个if条件恒成立,那么我就能实现在不知道密钥的情况下来使用这个软件。

在反汇编窗口里面,只需要把jnz short Project1.00FA10A1全部用nop代替就完全,就可以直接忽略掉cmp dword ptr ss:[ebp-0x8],0x1E240对zf位的影响,从而直接执行you are right。

3a9e1a88-58f8-11eb-8b86-12bb97331649.png

也就是说,我随便输入一个值,程序都会给我返回you are right。

3af09d9e-58f8-11eb-8b86-12bb97331649.png

事实上,不光是C++,绝大部分高级语言在底层都是这么实现判断的。所以,为了防止写个软件出来老是被人白嫖,研究一下在底层判断语句是怎么实现的还是很重要的。

最简单的防白嫖手段就是加壳。尤其在是这种关键跳转的地方一定要使用加壳工具进行保护,防止被别人轻而易举地就定位到关键跳的位置。

其次就是加花指令,这个方法的本质就是构造恒成立跳转,增加一些没用的跳转,既不对程序本身造成影响,也可以干扰别人对关键跳转的判断。

最最无敌的一种办法就是用网络验证。尽管这也不能保证百分之百不会被白嫖,但确实是非常有效的而且相对容易的办法了。不过它的缺点就是,如果服务器崩了,软件就不能运行了,这对于用户来说是无法接受的。

在技术上的对抗永远是在底层,并且是没有尽头的。现实往往又是道高一尺魔高一丈,而正是在这种矛与盾的攻防较量中,技术才不断地向前发展,才能为客户提供更为安全,可靠,便捷的服务。

责任编辑:xj

原文标题:站在汇编角度C++程序的条件判断语句

文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 程序
    +关注

    关注

    116

    文章

    3775

    浏览量

    80843
  • C++
    C++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73487
  • 汇编
    +关注

    关注

    2

    文章

    214

    浏览量

    25900

原文标题:站在汇编角度C++程序的条件判断语句

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    技术干货驿站 ▏深入理解C语言:掌握C语言条件判断,从if到switch的应用

    在编程中,条件判断语句是控制程序流程的核心元素之。它们使得程序能够根据不同的输入和状态,做出相应的决策。特别是在
    的头像 发表于 11-09 01:10 173次阅读
    技术干货驿站 ▏深入理解<b class='flag-5'>C</b>语言:掌握<b class='flag-5'>C</b>语言<b class='flag-5'>条件</b><b class='flag-5'>判断</b>,从if到switch的应用

    C7000优化C/C++编译器

    电子发烧友网站提供《C7000优化C/C++编译器.pdf》资料免费下载
    发表于 10-30 09:45 0次下载
    <b class='flag-5'>C</b>7000优化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>编译器

    使用OpenVINO GenAI API在C++中构建AI应用程序

    许多桌面应用程序是使用 C++ 开发的,而将生成式AI(GenAI)功能集成到这些应用程序中可能会很具有挑战性,尤其是因为使用像 Hugging Face 这样的 Python 库的复杂性。C
    的头像 发表于 10-12 09:36 304次阅读
    使用OpenVINO GenAI API在<b class='flag-5'>C++</b>中构建AI应用<b class='flag-5'>程序</b>

    基于OpenHarmony标准系统的C++公共基础类库案例:SafeBlockQueue

    1、程序简介该程序是基于OpenHarmony的C++公共基础类库的读写锁:SafeBlockQueue。线程安全阻塞队列SafeBlockQueue类,提供阻塞和非阻塞版的入队入队和出队接口,并提
    的头像 发表于 08-30 12:41 265次阅读
    基于OpenHarmony标准系统的<b class='flag-5'>C++</b>公共基础类库案例:SafeBlockQueue

    OpenHarmony标准系统C++公共基础类库案例:HelloWorld

    1、程序简介该程序是基于凌蒙派OpenHarmony-v3.2.1标准系统C++公共基础类库的简单案例:HelloWorld。主要讲解C++
    的头像 发表于 08-13 08:23 462次阅读
    OpenHarmony标准系统<b class='flag-5'>C++</b>公共基础类库案例:HelloWorld

    C++语言基础知识

    电子发烧友网站提供《C++语言基础知识.pdf》资料免费下载
    发表于 07-19 10:58 7次下载

    C++中实现类似instanceof的方法

    C++有多态与继承,但是很多人开始学习C++,有时候会面临常见问题,就是如何向下转型,特别是不知道具体类型的时候,这个时候就希望C++
    的头像 发表于 07-18 10:16 534次阅读
    <b class='flag-5'>C++</b>中实现类似instanceof的方法

    keil用c++编译含有rtos模块时的错误问题怎么解决?

    近期看到哥们用c++写嵌入式,感觉蛮有趣,如果当初我的程序要是能用类就轻松多了,所以也想尝试下。虽然不会
    发表于 05-09 08:29

    鸿蒙OS开发实例:【Native C++

    使用DevEco Studio创建Native C++应用。应用采用Native C++模板,实现使用NAPI调用C标准库的功能。使用
    的头像 发表于 04-14 11:43 2503次阅读
    鸿蒙OS开发实例:【Native <b class='flag-5'>C++</b>】

    c语言,c++,java,python区别

    操作系统、嵌入式系统等对性能要求较高的场景。C语言的语法相对简单,学习曲线较平缓,也是学习其他高级语言的入门语言。 C++C++是在C
    的头像 发表于 02-05 14:11 2231次阅读

    vb语言和c++语言的区别

    Microsoft开发的种面向对象的事件驱动编程语言。它的设计目标是简化编程过程,让初学者也能快速上手。与之相比,C++语言是种通用的、面向对象的编程语言,其设计目标是提供高性能的系统级编程。 语法: VB语言的语法较为
    的头像 发表于 02-01 10:20 2054次阅读

    C++简史:C++是如何开始的

    MISRA C++:2023,MISRA® C++ 标准的下一个版本,来了!为了帮助您做好准备,我们介绍了 Perforce 首席技术支持工程师 Frank van den Beuken 博士撰写
    的头像 发表于 01-11 09:00 535次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的

    C语言和C++中那些不同的地方

    C语言虽说经常和C++起被大家提起,但可千万不要以为它们是东西。现在我们常用的C语言是
    的头像 发表于 12-07 14:29 907次阅读
    <b class='flag-5'>C</b>语言和<b class='flag-5'>C++</b>中那些不同的地方

    开箱即用!教你如何正确使用华为云CodeArts IDE for C/C++

    C/C++编码体验、方便的访问华为云资源、简单的引用华为云服务于身,实现C/C++开发者在个
    的头像 发表于 11-29 17:40 755次阅读
    开箱即用!教你如何正确使用华为云CodeArts IDE for <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>!

    c++怎么开始编程

    应用程序、嵌入式系统和网络应用程序等各种领域。 在开始编程之前,你需要安装C++的编程环境。首先,你需要下载并安装编译器,比如微软的Vi
    的头像 发表于 11-27 15:56 893次阅读