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】欢迎添加关注!文章转载请注明出处。

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

    关注

    114

    文章

    3630

    浏览量

    79535
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72899
  • 汇编
    +关注

    关注

    2

    文章

    214

    浏览量

    25734

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

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

收藏 人收藏

    评论

    相关推荐

    C/C++代码动态测试工具VectorCAST插桩功能演示#代码动态测试 #C++

    C++代码
    北汇信息POLELINK
    发布于 :2024年04月18日 11:57:45

    OpenHarmony C++公共基础类库应用案例:Thread

    程在第5秒时,关闭子线程运行。 创建1子线程,每隔1秒打印当前运行次数。 2、基础知识 C++公共基础类库为标准系统提供了些常用的C++开发工具类,包括: 文件、路径、字符串相关操
    发表于 11-22 11:50

    使用c语言给单片机编写的程序在运行的时候if语句运行的快还是switch语句执行的速度快?

    请问使用c语言给单片机编写的程序在运行的时候if语句运行的快,还是switch语句执行的速度快?在优化之前的人写的程序,有人看到
    发表于 11-08 06:55

    C++程序设计精简版

    章 指针第 7 章 自定义数据类型 第 3 篇 基于对象的程序设计第 8 章 类和对象第 9 章 关于类和对象的进步讨论第 10 章 运算符重载 第 4 篇 面向对象的程序设计第 11 章 继承与派生第 12 章 多态性与虚
    发表于 10-09 07:26

    嵌入式C/C++语言精华文章集锦

    面对一个人的大型 C/C++程序时,只看其对 struct 的使用情况我们就可以对其编写者的编程经验进行评估。因为
    发表于 09-25 08:00

    C++写STM32程序,编译后会有执行效率慢的问题吗?

    C++写STM32程序,编译后,会有执行效率慢的问题吗
    发表于 09-20 07:56

    如何为原生C++开发设置Android Studio

    。 为了进步提高性能,您需要程序集使用程序集代码。 但是,使用ARM Neon内部函数可以避免编写汇编函数的复杂性。 相反,您只需要用C/
    发表于 08-17 08:28

    如何为Arm编译Cc++代码

    C++源代码翻译成机器代码的编译器。 •将汇编语言源代码翻译成机器代码的汇编程序。 •链接器,用于将多个机器代码模块组合成
    发表于 08-02 17:28

    起探索C++的世界!

    C++
    YS YYDS
    发布于 :2023年07月07日 19:10:25

    H8S、H8/300系列 C/C++编译程序汇编程序、优化连接编辑程序(RCJ10J0001-0100)

    H8S、H8/300系列 C/C++编译程序汇编程序、优化连接编辑程序 (RCJ10J0001-0100)
    发表于 06-28 18:51 0次下载
    H8S、H8/300系列 C/<b class='flag-5'>C++</b>编译<b class='flag-5'>程序</b>、<b class='flag-5'>汇编程序</b>、优化连接编辑<b class='flag-5'>程序</b>(RCJ10J0001-0100)

    可以从一利用c++标准库的项目的某处工作示例吗?

    irom0_0_seg中,然后按需加载并缓存到ram中。有没有办法将 libstdc++ 对象放在 irom0_0_seg 中? 我可以从一利用 c++ 标准库的项目的某处工作示例吗? 为了完整性,我附上了我的 Makefil
    发表于 06-12 08:25

    浅谈C语言与C++的前世今生

    C++开发人员将有这些问题归咎于C,而C开发人员则认为C++过于疯狂。我觉得站在C的角度C++,这种说法也很正确。作为C的超集,
    发表于 05-26 09:27 255次阅读
    浅谈C语言与<b class='flag-5'>C++</b>的前世今生

    如何从Linux C++ User App运行此类应用程序

    和 CS42888 编解码器。我想使用 CS42888。什么是正确的方法来做到这点?如何从 Linux C++ User App 运行此类应用程序?也许应该使用 GStreamer 或 ALSA 库?
    发表于 05-18 10:17

    是否有可用的ESP AT命令的C/C++库?

    我想知道是否有可用的 ESP AT 命令的 C/C++ 库?!就像简单的 AT 命令解析器,我可以将其集成到我的 MCU 固件中,因为我
    发表于 05-15 06:47

    H8S、H8/300系列 C/C++编译程序汇编程序、优化连接编辑程序(RCJ10J0001-0100)

    H8S、H8/300系列 C/C++编译程序汇编程序、优化连接编辑程序 (RCJ10J0001-0100)
    发表于 05-09 20:00 0次下载
    H8S、H8/300系列 C/<b class='flag-5'>C++</b>编译<b class='flag-5'>程序</b>、<b class='flag-5'>汇编程序</b>、优化连接编辑<b class='flag-5'>程序</b>(RCJ10J0001-0100)