前两天在看一个别人搞的程序,手上只有Hex,所以就直接用IDA来反汇编看了。有些心得给大家随便说说
这个程序很明显是有ST官方提供的标准库开发的,运行在STM32F072上面
库函数开发确实容易,但是给逆向 一定程度上也带来了极大的容易
几个原因
1:如果查看过keil生成的map文件,就可以知道ARMCC的链接器(link)在生成可执行文件的时候,函数的排列是按照字母顺序来的。
比如说,这个程序的开发者用到了USB的HID功能,所以我强行用官方的hid库函数历程编译了一个程序,查看编译完MAP文件
很明显的按字母顺序排列
2:ST的库函数(不管标准库,hal库等等),他的函数命名方式都是为 外设名字_xxx功能
比如GPIO_DeInit GPIO_Init GPIO_ReadInputData等等,用过的都知道
那么结合第一条 这一个外设的库函数内容 必定会被安排在一起
3:熟悉库函数的,经常用的,对函数的功能基本上都比较了解。
对比C写的内容,用十几秒,一分钟就能确定这个函数的名字,直接重命名函数为库里面的名字
这样节约了大量的时间去自己分析这个函数是干嘛的(如果不是库函数,一个函数的内容,往往要花少则几分钟,多则小半天的时间去研究他的运行机理)
虽然汇编用熟了不难,但是确实不友好。
这里随便贴一贴这个被完全逆向完的程序。所以函数都被完全的读懂在干嘛(即被重命名)
这个程序只花了不到48小时,就被完全捅穿了。所有明锁,暗锁,加密都像被衣服脱干净了一丝不挂的曝光在大摄像机镜头下
打码的函数是作者自己写的私有内容,为了保护,就打码了,没打码的都是库函数
说这么多,抛出个问题,让大家自己想,我不说,怎么样写程序,才是不容易被逆向破解的?欢迎大家畅所欲言
最近编辑记录 posystorage (2018-08-18 21:42:17)
离线
顺便吐槽一句 这个论坛啥都好,就是图片上传真的太蛋疼了
最近编辑记录 posystorage (2018-08-18 21:43:46)
离线
逆向最怕的就是那种要某种条件达到才能被爆发的问题,
比如开机1000次后,要输入一个验证码,
这种很隐蔽的问题破解的时候未必能预测到。
这个程序本身不算大,全部把他弄懂要的时间不长。当然程序大了那不一样了
离线