打印

汇编和反汇编中和源码保护和数据代码分离之矛与盾的PK

[复制链接]
2374|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2007-11-13 13:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
汇编和反汇编中和源码保护和数据代码分离之矛与盾的PK

大千世界无奇不有--苍天大地,打雷闪电,刮风下雨.
                  正义邪恶,刀客剑侠,猛男超女.
不知哪个属于你自己~~~

晕~~~这头起的下面的白话文就不好写了~~~还是随意为好~~~

本文将以51代码来讲述汇编和反汇编的攻守关系及具体对策.
实际上在C语言上也会得到启发的,菜农就暂且放过.

同时由于篇幅所限,二次(多次)扫描,数据代码分离,虚拟机等
反汇编的"黑话"也将越过~~~

当然被人反汇编是很荣幸的事,别学菜农的领导被骗上当拿菜农
所有的源代码(连人带机)让母校"反汇编",你说可气不可气???

现在开讲(最后自然是请听下次分解这种卖嘴的话了~~~):

在正常的汇编中,一般不可能想着要被人反汇编,故其暴露的
部分太多.
由于受指令助记符约束太多,数据的存取一般要通过特殊指令.
一般是通过专用寄存器DPTR,R0/R1,PC等来指出具体的存取地址.


故反汇编程序就可通过多次扫描后并通过虚拟机来模拟运行
来将代码和数据分离。

这些专用寄存器如果采用立即数寻址方式,就会很明显地把自己
的意图暴露.

例如常用的ACC/DPTR和MOVC指令的组合.
应该尽量地少用MOV DPTR,#XXXXH.

即使不能避免或为了高速寻址,也应该让它远离MOVC A,@A+DPTR;
最好在函数(子程序)外来调用。即参数DPTR在函数外部先设置好.

只要你用下列简单子程序就能把反汇编气晕~~~
除非他亲自赤身上阵来PK~~~

MOV   DPTR,#1234H
;最好隔几行或其他调用
LCALL MOVCex
MOV   DPTR,#5678H
LCALL MOVCex
MOV   DPTR,#XXXXH
LCALL MOVCex
......................  
MOVCex:
;最好加些气晕虚拟机的玩意~~~
      MOVC A,@A+DPTR;
      RET

再一个也是最为重要的就是对代码的入口地址的保护,这是双方PK的焦点所在!!!

例如:
    MOV   DPTR,#LXXXX
    JMP   @A+DPTR;?
............................
LXXXX:    
    LJMP  L1234
    LJMP  L5678
    LJMP  LYYYY
......................

看见DPTR后面那个'?'了吗???那是菜农的特别提示,告诉注意敌人可能有多种逃生手段.
LJMP,AJMP,SJMP,JZ/JNZ,CJNE,DJNZ,JB/JBC/JNB,JC/JNC
LCALL,ACALL,RET/RETI
它们都有按一定固定规律的固定间隔(长度).
有些像上例中是有序的.

哈哈~~~这些都是本分的读书人----脾气太好,肯定不会练摊买**蛋~~~
这种程序如被反汇编,将会被100%的还原为源程序,若知道变量的具体名称,反出来的
要比原作者的更为整齐~~~这是没加注解~~~
不过这是菜农的强项~~~没图纸不知用途俺照注解~~~

所以对代码地址和数据语句的保护(反解读)将是我们对付这些恶人的---急所~~~
晕!!!怎么出来了围棋的术语???看来我们编程也不要走“愚型”~~~

在51代码中,每条指令都有操作码和操作数之分,但每条指令必须有1个操作码---指令名.
在我们关心的几条指令如:
LJMP,AJMP,SJMP,JZ/JNZ,CJNE,DJNZ,JB/JBC/JNB,JC/JNC
LCALL,ACALL,RET/RETI
PUSH/POP

实际上防解读和防程序飞是一个道理.
程序飞是PC没按编程者的意愿掉入了不是编程者的代码集合!!!

这是因为任意一组(1~3个字节)代码序列都会组成一条新的指令!!!
其第1个字节必为指令操作码!!!根据操作码的不同得到不同的长度。
这些重新组合的指令序列集合就组成了新的程序!!!
这个随机产生的“程序”所具备的功能只有鬼才知道!!!

这就是程序飞的“道理”~~~

反汇编碰壁后,也会用虚拟机模拟程序飞来扫描程序的“合理性”.
如果我们不用代码保护的手段来对付虚拟机的骚扰,那么带来的结果只能让对手扒光~~~

菜农“研制的农药”就是为对付HotPower这种“小人”!!!

有人说俺左右互搏~~~说实话以前没事关灯自己下盲棋~~~不杀自己没别人呀~~~

哈哈~~~走题了~~~

如果我们利用条件跳转指令,在不影响程序正常运行的情况下,并在不影响速度时,
采用一些手段也并非“卑鄙”,虽然很“下流”,只要让反汇编的人眼晕即可~~~

看官请看下列几句:
.........................................................................
    JNB   ACC.7,$+4;;ACC.7恒为0,肯定运行NOP;ACALL COMMANDEXEC;
    DW    1200H;把它拉下水~~~ ;低8位为NOP指令
    ACALL COMMANDEXEC;执行命令,哈哈~~~执行完后直接跳回MAINLOOP
.........................................................................
    CLR   A
    JZ    $+3;肯定运行NOP;MOV   DPTR,#TESTDATA
    DW    1200H;低8位为NOP指令
    MOV   DPTR,#TESTDATA
.........................................................................
;返回前对付反汇编!!!让它找不到RETI指令
    CLR   A
    JZ    $+3;肯定运行NOP;RETI
    DW    1200H;低8位为NOP指令
;用RETI迷惑反汇编,以为是某个中断服务程序
    RETI;返回到MAINLOOP

前2个是保护代码或数据地址的,最后1个是保护程序出口的.

菜农所说的“保护”2字并非不让盗窃者运行程序,而是不让他"看".

他即使有菜农的倒塌脑浆,也让他扒层皮~~~
哈哈~~~

但是的但是!!!这还不足以打退阶级敌人的邪念,因为他们可以强行汇编,分段
反汇编后再组合到一起。

故我们还有CRC代码数据保护及改写问题~~~就先到这里,拍砖吧,俺接着...

有些网友期待“天下无贼”,俺会努力的,但不敢祈望,但"治安"应该会好些点的~~~

由于时间的精力的关系,听下次分解~~~
本故事纯属虚构,若有雷同,纯属偶然...

雁塔山野村夫  菜农HotPower   
                           2007.11.13 于西安大雁塔菜地.

相关帖子

沙发
hotpower|  楼主 | 2007-11-13 13:16 | 只看该作者

沙发~~~

使用特权

评论回复
板凳
wolfererer| | 2007-11-13 13:23 | 只看该作者

还真有自己抢自己沙发的啊?

使用特权

评论回复
地板
huangqi412| | 2007-11-13 14:17 | 只看该作者

第4楼

使用特权

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

本版积分规则

1460

主题

21619

帖子

506

粉丝