汇编和反汇编中和源码保护和数据代码分离之矛与盾的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 于西安大雁塔菜地. |