[2022]从微软代码中学习C/C++项目代码规范 huoji C++,微软代码 2022-01-12 977 次浏览 1 次点赞 ### 1.变量用abcd: ```cpp PCONSOLE_READCONSOLE_MSG a = (PCONSOLE_READCONSOLE_MSG)&Message->u.ApiMessageData; ``` 一个项目里面用abc来命名是大忌,因为这会完全让其他人不知道这个变量的意思,一般情况下一个项目的规范命名有两种: > 驼峰 下划线 而不是微软这种 abcd ### 2.声明了变量但是不用 https://github.com/oturan-boga/Windows2000/blob/8b449d6659840b6ba19465100d21ca07a0e07236/private/ntos/w32/ntcon/server/stream.c#L1830 可以看到,这个a变量被声明后不再做任何操作,这在项目里面也会是致命的,在屎山里面肯定不能删掉,因为删掉不确定会不会造成什么后果,但是如果在项目开发的时候就有这种情况了,请马上删掉不用的变量.避免变成谁也不知道的屎山 3."不要使用这个字段,但是我也不想删掉" ![](https://key08.com/usr/uploads/2022/01/689272685.png) 这跟2类似,一般出现在版本更新后不会不敢删除字段造成的,因此在版本迭代后如果出现需要删除、更新的字段请立刻删除、更新 否则日积月累,项目代码就会成微软这种不敢动,但是又不能用的地步. 4.函数大写小写+驼峰+下划线 ![](https://key08.com/usr/uploads/2022/01/2819533035.png) 对于项目中的函数名,个人建议要么下划线,要么驼峰,并且需要指明含义,而不是跟图中混乱的命名与不知道是啥组件用的函数一样. 如: DnsResolverGetConfig 或者 dns_resolver_get_config 5."删除我" -20年前不知道是谁写的一句话 ![](https://key08.com/usr/uploads/2022/01/1557580365.png) 不必多说,自然跟之前一样,屎山了就千万别动 如果是项目开发阶段,千万别这样玩.如果你的同事正在产生这种代码,请立刻跑路. ![](https://key08.com/usr/uploads/2022/01/1694560774.png) 6."ETW完美封装" ![](https://key08.com/usr/uploads/2022/01/2709470897.png) 7.微软教你不用AST解析代码以及WMI语句 ![](https://key08.com/usr/uploads/2022/01/1618074531.png) 这一点必须夸奖微软,因为微软此处代码的设计符合一个原则: > 当你的领导给你一个看起来非常复杂的任务但是实现的功能非常简单的时候,比如AI智能推荐等,你进退两难的时候,请使用最简单的方法去完成他,不要想太复杂,比如AI智能推荐,写个随机数生成器随机推荐文章即可. 8.人肉混淆结构 ![](https://key08.com/usr/uploads/2022/01/911665396.png) 9.一个函数封装48层 ->每层实现都一样:调用下一层函数 ![](https://key08.com/usr/uploads/2022/01/3221924182.png) 比如: ![](https://key08.com/usr/uploads/2022/01/3736566078.png) 没什么好说的,如果你接手的项目需要是这样的,并且领导告知你需要封装新的,请遵循这种设计,新加一层.俗称: 屎上加屎 10.C++强行转C: ![](https://key08.com/usr/uploads/2022/01/873257524.png) 可能是某个强迫症转的?不好评价 11.一个高级调用者签名验证解决方案: ![](https://key08.com/usr/uploads/2022/01/3661592006.png) ![](https://key08.com/usr/uploads/2022/01/1232831021.png) PS:在WRK中,他们故意改了签名名字使得签名"看起来专业",实际上WIN11现在的都是图里的hres: WRK的长这样: ![](https://key08.com/usr/uploads/2022/01/2856782594.png) 在实际项目中,千万不要这样做无意义的签名验证,因为如果是攻击者可以控制的字段,此类签名验证毫无意义(因为攻击者知道你的签名是啥,相当于你给了一张纸条写着"我不会告诉你密码是XXXX").当然此类方案可能是微软为了验证内存有没有问题,但是这样会增加debug难度,而且治标不治本!所以,不要跟微软学坏! 12.给客户端一个假的handle,这个handle在客户端看来是句柄,服务端看是一个内存地址: ![](https://key08.com/usr/uploads/2022/01/1227458815.png) 同时把这个handle交给了内核处理: ![](https://key08.com/usr/uploads/2022/01/3551523858.png) 13.自己都不知道这是啥玩意: ![](https://key08.com/usr/uploads/2022/01/3554041308.png) "没什么好说的,这是一个巨大的安全隐患" 14.微软的唯一的研究资料是04年的冲击波病毒 ![](https://key08.com/usr/uploads/2022/01/1909884464.png) 可能开发人员自己都忘了还有这个api.请认真写文档,开发完毕后写文档很重要! 本文由 huoji 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。 点赞 1
还不快抢沙发