【CSDN 编者按】安全漏洞的源头是开发,只有当开发人员写出了包含安全漏洞的代码,黑客才有机可乘。因此,如何保障开发写出更“安全”的代码,是安全防护工作中最重要的一环。

作者 | 小道安全       责编 | 欧阳姝黎

技术背景

作为程序开发人员,我们害怕,听到开发的代码,被测试出bug;我们更害怕,听到我们所开发出来的产品上线了,被新手安全研究员给反汇编逆向破解,代码功能直接被人给盗取了。下面根据我自己的一些项目经验,跟大家分享两点如何能开发出相对安全的代码。以下方案不局限于任何语言代码开发,是一个相对通用的安全编码方案。

字符串的安全方案

直接使用字符串

不建议使用理由:直接定义使用字符串,因为字符串是一个常量,所以我们直接能在静态反汇编中直接看到字符串的数据信息。

下图可以很清晰的看懂字符串信息”ntdll.dll”,这样就把代码的字符串信息直接暴露给大家,这样大家就可以通过字符串信息做一些对代码不安全的事情了。

字符串赋值到数组使用

建议使用理由:将字符串写到数组里面并进行赋值,使得字符串存放在堆里面,这样在程序的字符串常量信息就无法直接看到字符串信息,这样进行静态分析(IDA)的时候字符串信息就没有展示了,这个需要进行动态分析(ollydbg)才能分析到字符串信息。

下图展示的是通过将字符串信息存储在数组中的汇编代码,在实际的汇编代码中展示的是一串数据,而不是直接的字符串,这就无法直接看到字符串信息去理解代码,要想理解这串字符串信息,那么就需要去做动态调试分析。从而加强代码的安全性。

调用系统函数安全方案

直接调用系统的函数

不建议使用理由:我们在编码过程中,有很多功能系统都已经有提供的函数接口,一般情况下我们都是直接调用系统函数直接进行实现功能。但你知道吗?你这样直接调用系统函数在一些场景下是不安全的,当你的程序在被安全逆向研究的时候,直接可以通过程序的导入表,以及反汇编看到调用的系统函数,这样我们只要一查下系统函数的功能,那么就可以知道大概的功能点,还有只要一挂钩(HOOK技术)上系统的函数,那么你所调用的系统函数的功能就失效了。

下图展示上面函数通过调用系统函数实现的汇编代码。大家可以直接通过展示的系统函数去分析功能。

自定义实现函数再调用函数

建议使用理由:我们对于关键功能函数建议还是采用自己去实现函数功能,再去调用,这样可以加强程序被直接分析的难度,从而加强程序的安全性。

下图是自定义实现函数调用的汇编代码,可以从下面汇编代码看到关键函数是自己实现的,那么要了解该函数功能就需要进入到函数内部去做分析。这从而加强了关键函数功能的相对安全

总结

最后说明,以上是经过项目实践总结出来的安全开发方案。我们在项目开发中需要写高内聚,低耦合的代码,同样也需要写一些没有bug的代码,更需要写一些更加相对安全的代码,更需要写一些能增加逆向破解者分析程序的难度(注:这里会有专业人士会说代码直接加VMP保护,不啥问题都没有了吗?不过这这里只进行说明代码开发的一点安全思路),这个才是我们程序员的终极目标,希望本文所阐述的思想能够让大家有所启发。

☞自由软件之父回归 FSF,遭 1933 人、21 家组织联名抵制!☞乔布斯18岁求职信拍卖价22.24万美元,值吗?
☞进退两难的硅谷程序员们
☞6000万条GitHub帖子告诉你:工作状态与表情符号强相关

两大方案,只为写出更安全的代码!相关推荐

  1. [翻译Joel On Software]Joel测试:12步写出更高质量代码/The Joel Test: 12 Steps to Better Code

    Joel on Software The Joel Test: 12 Steps to Better Code Joel测试:12步写出更高质量代码 byJoel Spolsky Wednesday, ...

  2. jvm大局观之内存管理篇: 理解jvm安全点,写出更高效的代码

    jvm大局观之内存管理篇: 理解jvm安全点,写出更高效的代码 - 知乎 前言 本篇是java内存区域管理系列教程之一 - 在得知GC Root的组成之后,如何在垃圾回收发生的时刻,找到GC Root ...

  3. 【整洁之道】如何写出更整洁的代码(上)

    如何写出更整洁的代码 代码整洁之道不是银弹,不会立竿见影的带来收益. 没有任何犀利的武功招式,只有一些我个人异常推崇的代码整洁之道的内功心法.它不会直接有效的提高你写代码的能力与速度,但是对于程序员的 ...

  4. 如何写出更好的代码(文末有福利)

    女主宣言 我们在过去的几期推送里已经给大家介绍了笔者根据多年研发经验总结出来的编码规范和 git 等实用工具的运用场景,今天咱们就来继续聊聊项目开发过程的诸多方法论.本文最先发布于 7rule,转载已 ...

  5. 如何写出更优雅的代码——编程范式简述

    <如何写出更优雅的代码--编程范式简述>源站链接,阅读体检更佳! 什么是程序? 1976年,瑞士计算机科学家,Algol W,Modula,Oberon 和 Pascal 语言的设计师 N ...

  6. 程序员如何写出更好的代码

    Martin Thompson是Java Champion称号获得者,同时也是一名高性能计算科学家.他说,为了写出更好的代码,程序员需要运用基本设计原则,阅读已有代码.在QCon London 201 ...

  7. 写出更易懂的代码(一)

    今天周日,外面天气不好,舍友出去跟MM约会了,我一个人独自在家,逛逛园子. 发现一篇好文<javascript 杂谈之哪种写法你更喜欢?>,其中有一个代码,是模仿jQuery写法的: 虽然 ...

  8. python优雅代码大全_10个Python技巧帮你写出更优雅的代码

    阅读本文需要 2 分钟,公众号 somenzz ,欢迎学习 Python 的朋友订阅. 现在写代码的门槛非常低了,少儿都开始编程了,但从代码的风格一眼看出编码水平.是的,写代码是容易的,写出易读的代码 ...

  9. 使用这45个小技巧,帮助你写出更优雅的代码

    前言 不知道大家有没有经历过维护一个已经离职的人的代码的痛苦,一个方法写老长,还有很多的if else ,根本无法阅读,更不知道代码背后的含义,最重要的是没有人可以问,此时只能心里默默地问候这个留坑的 ...

最新文章

  1. html目录怎么搞出来,webpack怎么把html搬到输出目录里?
  2. Linux network source code
  3. sql-server基础知识四(视图和索引)
  4. Java Web Start入门基础教程
  5. Golang与C#之switch区别
  6. MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法
  7. Promise学习笔记
  8. 结构体数组(C++)
  9. Spark算子:RDD行动Action操作(2)–take、top、takeOrdered
  10. 2018 为自己加油!
  11. 基于c语言的成绩管理系统,基于C语言实现学生成绩管理系统.docx
  12. 宝塔Inode信息使用率100%满了怎么清理?
  13. c++如何关闭进程,比如网吧收银系统
  14. PDF转CAD格式软件下载及使用教程
  15. Google高级搜索命令
  16. a级纳税人数据问题记录
  17. AGI:走向通用人工智能的【生命学哲学科学】第一篇——生命、意识、五行、易经、量子
  18. 用scribefire写blog
  19. 求岛屿的最大面积java
  20. pdf合并软件下载的旗舰版

热门文章

  1. AcWing 1015. 摘花生 (DP)
  2. 完整的Flex多文件上传实例
  3. Struts2学习笔记(八) 拦截器(Interceptor)(上)
  4. 题解 P3367 【【模板】并查集】
  5. 设计模式二:结构型模式
  6. Python实现查询12306火车票信息
  7. [01] 四大组件之Activity
  8. 回车键提交与不提交表单的解决方法
  9. 数据库远程导入导出步骤
  10. Numpy np.where()的简单用法