打印

为了对付**,我也想了很多方法

[复制链接]
23920|176
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2007-11-15 19:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       菜农的加密理论---天下无贼论


1.版权信息的保存
虽然芯片被解密而能够得到BIN及HEX格式的文件,但产品的版权信息
并未被篡改。

这个信息被明文或密文读出后会通过一定途径发布出去。
那么解密芯片者必须再进行逆向工程来掩盖他们不光彩的事实。
所以保护产品的版权信息可能最为重要。

2.程序入口的保护
在逆向工程,最终要做到真正的代码和数据的分离工作。
其首要解决的就是如何找到正确的程序入口地址,然后在进行二次扫描
等基础工作。
当扫描程序遇到分支后,必然要做出正确的判断。
其一路分支继续往后扫描,另一路分支将记录分支的入口地址的分支状态
以便为二(多)次扫描做出前期的准备工作。

分支状态对于51来讲可简化用扫描次数及位置号来替代。
即 0--从未扫描到过 最后生成为数据。例 DB 55H
   1--操作码
   2--操作数1
   3--操作数2
   4--待定入口(入口进待扫描队列)

每次扫描的选择入口地址的分支状态必须为0。否则本次扫描失败!
直到遇到LJMP/AJMP/SJMP/JMP @DPTR/RET/RETI停止本次扫描

依此类推。直到全部扫描结束。

分析以上的扫描原理及步骤,我们可以造假一些数据或代码使其1次或二次
扫描终止,最后迫使其采用强行(不按以上规则)扫描,从而得不出人能看懂
的汇编代码。

3.程序出口的保护
当全部扫描工作结束后,代码和数据将会自然分离。
由于扫描规则的约束,数据中也会包含一些代码。
例如源程序中从未调用过的子程序的“泄露代码”。

他们一般以RET/RETI结束,以PUSH XXX开始。故很容易将泄露代码逆向出来。
从而找出原作者没调用或没成型的方法。

4.CRC变量位置和CRC运算子程序保护
要想实现以上3种保护,必须防止逆向者篡改版权信息,代码入口地址及相应
的出入口保护的代码不被其强行改写或用NOP,DB 00H等填充,以便达到最终
逆向成功的目的。

由于MCU资源和时间速度等限制,应该采用简洁而枯燥乏味的代码组合。常见
的有累加/异或/移位等算法。

累加和异或是基于单(多)字节操作的,而移位是基于单个位操作的。

故要枯燥乏味肯定要数移位更胜任了,所以常用CRC运算。

CRC运算有正运算和逆运算(菜农没看过相应报道和**)之分,也有左右移位
之别。更有变化无测的“权”(菜农想不了起什么好听的名字)

分析和论述到此,上述4点本人认为比较重要。

现在举2个实际例子说明如何保护代码和数据不被逆向为汇编助记符。

例1 如何保护版本信息
;------------------------------------------------------------------------------;
;   版本信息区
;------------------------------------------------------------------------------;
    DB    02H;伪造LJMP指令
;------------------------------------------------------------------------------;
;大家可以试试修改下面任意数据的结果~~~
;------------------------------------------------------------------------------;
HotPowerMessage:;敌人找看不见HotPowerMessage入口地址但能知道~~~
    DB    "HotPower@126.com 2007.11.13";CRC8结果为0xc5
    DB    0C5H;以上版本信息区字符串的CRC8结果,这样可以保证全局变量CRC永远为0!!!
    DB    0;版本信息区结尾标志
;------------------------------------------------------------------------------;
程序祥见:阻止反汇编软件汇编演示程序(天下无贼版),当然这还只是个入门之类的提高版

假设版本信息区为字符串"HotPower@126.com 2007.11.13",那么其右移CRC8运算后结果为0C5H
如果我们再以0C5H做一次运算后,CRC的结果必为0!!!!!!!!!!!!!!!!!

为什么我们还要不辞劳苦地再进行一次CRC运算呢???为什么很多软件被轻易解码呢???

道理就在这里面!!!

如果逆向者找到相应的条件分支语句中包含比较05CH的信息,那么这个程序不攻自破!!!

举个我1分钟就逆向的一个例子:
有个PC软件和PC并口0x378通信,但俺的并口地址为0x3bc.故它不支持俺。要求对方改成可选地址的。
回复是忘了,即使改也要收费即3天左右。

晕!!不就是将78 03改为bc 03吗???

俺用UE搜索整个EXE文件就只有3个地方有。几次实验通过了。

所以重要信息不要留给逆向者空子!!!

当然所谓“艺高人胆大”,你明码给他版本信息,他“汉化”后程序用不成就知道遇到对手了。
他会坐下来与你较量。

所以CRC运算后千万不敢立即做出处理!!!而要像病毒一样随后爆发,这会使他更难受的。且记!!!

例2 如何保护代码出口(RET/RETI)

;---------------------------------------------------------------------;
;   出口保护代码
;---------------------------------------------------------------------;
COMMAND0_EXIT:
    MOV   A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕
    JZ    $+3;肯定运行NOP;RETI
    DB    12H;CRC校验和,伪装的LCALL指令
    DB    00H;结尾符实际为NOP指令
;用RETI迷惑反汇编,以为是某个中断服务程序
    RETI;返回到MAINLOOP

菜农一生发表和隐藏的一些自已都认为是臭美的方法和独到见解,都包含着运气的成分。
当然这也和辛勤耕作有很大关系,回报也是很自然的事。

拿这个CRC的地址来说吧,我随手将他定义在30H处,根本没多想。应该这是51人最开始想的地方。
他们绝不会想20H~2FH这奢侈的地方,所以30H自然作为首选。

开始编程时是这样写的:
COMMAND0_EXIT:
    MOV   A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕
    JZ    $+3;肯定运行NOP;RETI
    DW    1200H
;用RETI迷惑反汇编,以为是某个中断服务程序
    RETI;返回到MAINLOOP
    DB    00H;待计算CRC校验和,伪装的LCALL指令
    DB    00H;结尾符实际为NOP指令

写完后才发现前面已经有00H结尾符,故改为
COMMAND0_EXIT:
    MOV   A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕
    JZ    $+3;肯定运行NOP;RETI
    DB    00H;待计算CRC校验和,伪装的LCALL指令
    DB    00H;结尾符实际为NOP指令
;用RETI迷惑反汇编,以为是某个中断服务程序
    RETI;返回到MAINLOOP


    MOV   A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕
    JZ    $+3;肯定运行NOP;RETI
两句进行CRC运算后惊奇地发现---苍天呀,是我需要的12H!!!!!!!!!!

故就成了最终的程序:
COMMAND0_EXIT:
    MOV   A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕
    JZ    $+3;肯定运行NOP;RETI
    DB    12H;已计算出上2句的CRC校验和值,伪装的LCALL指令
    DB    00H;结尾符实际为NOP指令
;用RETI迷惑反汇编,以为是某个中断服务程序
    RETI;返回到MAINLOOP

原因:当初CRC这个全局变量位置在30H才导致了这个神仙想要得到的结果之一(还有02H)


至于为什么要有这些保护及它的作用,为了不晕到一大片观众,就到这里吧。

菜农被21IC的程序匠人双规并令俺面壁思过逼交脑浆之作,俺无奈献出本文。

望大家不晕~~~先到这里,以后再提高提高~~~

雁塔山野村夫  菜农HotPower   
                           2007.11.15 思过于西安大雁塔菜地.

相关链接:https://bbs.21ic.com/upfiles/img/200711/20071115193754630.rar

相关帖子

沙发
hotpower|  楼主 | 2007-11-15 19:38 | 只看该作者

沙发~~~

使用特权

评论回复
板凳
5880527| | 2007-11-15 20:00 | 只看该作者

呵呵

整天捉贼啊,下次我也把名字编到开头,然后在程序的某个地方判一下

使用特权

评论回复
地板
lastnew| | 2007-11-15 20:17 | 只看该作者

汗颜

想讨论,不懂啊

不过估计这个有点教育意义

使用特权

评论回复
5
hotpower|  楼主 | 2007-11-15 20:21 | 只看该作者

孤独之中~~~半夜**叫等IceAge老师来偷**...

使用特权

评论回复
6
gooog| | 2007-11-15 21:03 | 只看该作者

大叔被骂了一次,耿耿于怀啊。呵呵

使用特权

评论回复
7
IceAge| | 2007-11-15 21:28 | 只看该作者

不想讨论这个问题了,估计大家也没有多少兴趣了

hotpower ,把你的"加密"的代码随便用一个反汇编程序试一试,看看正确率是多少,被骗过的部分人工花多少时间能够恢复。

使用特权

评论回复
8
hotpower|  楼主 | 2007-11-15 21:34 | 只看该作者

哈哈~~~老师看来心烦了,按规则几乎成功率几乎没有~~~

使用特权

评论回复
9
maychang| | 2007-11-15 21:58 | 只看该作者

向 hotpower 鞠一躬

等待后续。

使用特权

评论回复
10
hotpower|  楼主 | 2007-11-15 22:06 | 只看该作者

到农忙时节了~~~菜农真心地呼吁...

向maychang老师跪拜~~~真心地谢谢指导!!!!(发自内心地!!!)

到农忙时节了,再在此罐这些废水,地里的菜就要全烂光了~~~

感谢大家~~~菜农思过去了~~~
相关链接:https://bbs.21ic.com/club/bbs/ShowAnnounce.asp?v=&ID=2755806

使用特权

评论回复
11
IceAge| | 2007-11-16 01:35 | 只看该作者

这里的 蒙特卡洛法 不是用在随机预测 *分支*

而是随机预测 *外部输入*,以使虚拟机得以模拟运行,以便标示程序路径。运行足够一段时间后,只要将标示过的代码反汇编即可。这与 crc,加密与否 没有关系。

当然,即便为了对付虚拟机程序而特意设置陷阱,别忘了,还有大脑,这是会让任何所谓 天下无贼论 破产的

**************** 终极武器 ********************

使用特权

评论回复
12
hotpower|  楼主 | 2007-11-16 02:08 | 只看该作者

理论上是,但你写不出完整的代码,因为一条语句多意

这对于正常按编译法则是肯定会破译全部代码.
但现在的问题你就是看着源代码都写不出源代码.


"当然,即便为了对付虚拟机程序而特意设置陷阱,别忘了,还有大脑,这是会让任何所谓 天下无贼论 破产的"

因为这样的人很少,而且可能破译的几率也很小,故肯定为代码数据混用的方式来运行.

我重复了好多编.HEX文件本身就是可以运行的,逆向只需想得到的那部分代码.

举个简单的例子.

就拿最简单的串口中断来说吧.

如果协议中无此命令,而中断服务程序有,并设置了非法的入口地址.

那么整个串口中断服务程序对吗???还继续强行编译吗???

不是51合法的程序分支这样做行吗???

我可的例程老师应该研究完再拿法则来说话~~~

假如虚拟机在一条3字节语句上模拟3次
每次都不一样的入口(在一条源程序指令上).

你说该先取哪个???

取第3个字节可能还会来模拟2次.
取第2个字节可能还会来模拟1次.
取第1个字节可能也会来模拟1~2次.

假使他们都模拟通过,那么逆向出来的会和以前的一样吗???

这和程序飞是一个道理.

飞到一个非法但还可以运行且不进入死循环的程序,大体看不是很正常吗???

难道程序飞的道理和蒙特卡洛法有什么区别吗???

使用特权

评论回复
13
john_light| | 2007-11-16 08:16 | 只看该作者

照例占第一页的楼盘

使用特权

评论回复
14
lpcfans| | 2007-11-16 08:51 | 只看该作者

ding

使用特权

评论回复
15
dcp| | 2007-11-16 08:54 | 只看该作者

hot

使用特权

评论回复
16
xwj| | 2007-11-16 08:57 | 只看该作者

呵呵,很精彩的讨论,估计能仔细看的人很少:-)

使用特权

评论回复
17
wolfererer| | 2007-11-16 12:36 | 只看该作者

太精彩了,不过有些话讲得让人晕

看了半天还是迷糊的

使用特权

评论回复
18
xplore| | 2007-11-16 13:02 | 只看该作者

现在的贼

已经没有那么高的技术含量了。

基本上都是暴力复制的。 
等你有功夫抓贼,贼早就跑了。要不然就转偷为抢。

使用特权

评论回复
19
McuPlayer| | 2007-11-16 15:27 | 只看该作者

51是CISC的

1、指令字节错位
2、函数指针

但是对于RISC单片机如何做?比如PIC、HT之类的单片机,请HotPower大叔赐教。

使用特权

评论回复
20
maychang| | 2007-11-16 19:52 | 只看该作者

对于RISC单片机

大同小异,方法是一样的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21619

帖子

506

粉丝