;-------------------------------------------------------; ; 阻止反汇编软件汇编演示程序(小难度版) ;菜地公告: ;凡引用本文或重要方法都应该指明出处---雁塔菜地!!! ;谢谢合作 ;雁塔菜农HotPower@126.com HotPower@163.com 2007.11.12 ;-------------------------------------------------------;
$NOMOD51 ; disable predefined 8051 registers #include <reg52.inc> // include CPU definition file (for example, 8052)
TEST_55H EQU 40H TEST_AAH EQU 7FH SP_MIN EQU 7FH;TEST_AAH
ORG 0000H LJMP MAIN ORG 0003H ;外部中断0服务程序 RETI DW 12AAH;藏入数据 ORG 000BH ;定时器中断0服务程序 RETI DW 80AAH;藏入数据 ORG 0013H ;外部中断1服务程序 RETI DW 6061H;藏入数据 ORG 001BH ;定时器中断1服务程序 RETI DW 12AAH;藏入数据 ORG 0023H ;串口中断服务程序 RETI DW 12AAH;藏入数据 ORG 002BH ;定时器中断1服务程序 RETI DW 12AAH;藏入数据 MAIN: MOV SP,#SP_MIN MOV B,#0FFH;从0开始循环 CLR A MOV IE,A;EA=0,ES=ET1=EX1=ET0=EX0=0 ;以下语句实际为LJMP MAIN1 MOV DPTR,#MAIN1 PUSH DPL PUSH DPH RETI DW 10AAH;藏入数据 MAIN1: ;以下语句制造些难度 JZ MAIN2-1;ACC肯定为0,程序将执行NOP指令!!! DW 1200H;藏入数据(低8位为NOP指令!!!) MAIN2: ;以下语句实际为LJMP MAININIT MOV DPTR,#MAININIT PUSH DPL PUSH DPH RETI DW 12AAH;藏入数据 ;主循环初始化 MAININIT: LCALL SYSINIT;系统初始化 ;以下语句实际为LJMP MAINLOOP MOV DPTR,#MAINLOOP PUSH DPL PUSH DPH RET DW 1234H;藏入数据 SYSINIT: ;在此加入系统初始化语句 NOP RET; ;-------------------------------------------------------------------; ;COMMANDEXEC子程序要求高8位非0 ORG 0100H ;-------------------------------------------------------------------; ;;;;主循环;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAINLOOP:;真的主循环入口 INC B MAINLOOPX: MOV A,B ANL A,#00000111B;得到命令执行号 MOV DPTR,#COMMANDJUMPTAB;命令跳转表,让反汇编以为是MOVC数据~~~ ;-------------------------------------------------------------------; ;注意以下如何阻止反汇编"看"ACALL COMMANDEXEC指令!!! ;方法:用一个已知不变的条件来跳入到看来非法的隐含指令NOP ;-------------------------------------------------------------------; JNB ACC.7,$+4;;ACC.7恒为0,肯定运行NOP;ACALL COMMANDEXEC; DW 1200H;把它拉下水~~~ ;低8位为NOP指令 ACALL COMMANDEXEC;执行命令,哈哈~~~执行完后直接跳回MAINLOOP ;-------------------------------------------------------; ;以下程序永远也不会执行 ;-------------------------------------------------------; DJNZ B,MAINLOOPX;假的,永远也不会执行的!!! DB 88H;藏入数据 ;命令跳转表(在此主要是让反汇编软件迷糊) COMMANDJUMPTAB: DW COMMAND0;命令0 DB 0D5H;作假为3个字节(随意造假1个数据,以下类同) DW COMMAND1;命令1 DB 034H;作假为3个字节 DW COMMAND2;命令2 DB 056H;作假为3个字节 DW COMMAND3;命令3 DB 078H;作假为3个字节 DW COMMAND4;命令4 DB 09AH;作假为3个字节 DW COMMAND5;命令5 DB 0BCH;作假为3个字节 DW COMMAND6;命令6 DB 0CDH;作假为3个字节 DW COMMAND7;命令7 DB 0EFH;藏入数据 ;命令执行子程序 ;入口条件: ACC=命令号 ; DPTR=命令跳转表首指针 ;出口条件: ;命令模块 COMMANDEXEC: PUSH DPH;执行命令跳转表高8位 PUSH DPL;执行命令跳转表低8位 ANL A,#00001111B;只取8个命令 MOV R0,A ADD A,R0;每表2个字节(DW双字节表) ADD A,R0;作假为3个字节,乘3工作结束 MOV R0,#SP_MIN+4;实际是SP,此时为DPL的值,主要防止反汇编跟踪SP等要害寄存器 ADDC A,@R0;执行命令跳转表低8位(ADD A,DPL容易暴露) DEC R0;调整指针,准备去DPH MOV DPL,A;找到具体的命令跳转地址低8位 CLR A;可用CRC8结果0代替 ADDC A,@R0;执行命令跳转表高8位(ADD A,DPH容易暴露) MOV DPH,A;DPH=1,找到具体的命令跳转地址高8位 ;注意下列的COMMANDEXEC1-1,跳入MOV A,#00H指令的第2个字节(00H)!!! ;把下句改为JNZ COMMANDEXEC1-1;程序出错将跳入0x5252!!! JZ COMMANDEXEC1-1;????哈哈,这个是假的~~~阻止火星人反汇编~~~ ; JNZ COMMANDEXEC1-1;????哈哈,这个是假的~~~程序飞到火星上了~~~ MOV A,#00H;应该这里的ACC必须为0 COMMANDEXEC1: INC R0;调整指针,准备改存执行命令地址高8位 MOVC A,@A+DPTR;取出执行命令地址高8位 XCH A,@R0;改存执行命令地址高8位 DEC R0;调整指针,准备改存执行命令地址低8位 MOV A,DPH;本例DPH=1 MOVC A,@A+DPTR;取出执行命令地址低8位 XCH A,@R0;改存执行命令地址低8位 DEC R0;调整指针,准备强行修改真的主循环入口地址高8位 MOV @R0,#HIGH MAINLOOP;修改真的主循环入口地址高8位 DEC R0;调整指针,准备强行修改真的主循环入口地址低8位 MOV @R0,#LOW MAINLOOP;修改真的主循环入口地址低8位 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;散转入@A+A+DPTR处COMMAND0~COMMAND7
;------------------注意-----------------------------------------------; ;保护子程序的返回指令最为重要!!! ;否则反汇编可以根据MOV DPTR,#COMMANDJUMPTAB;来判定可能是张散转命令表 ;当它发现散转命令子程序都是用RET/RETI返回的,那么就可以强行反汇编!!! ;即使它强行反汇编,JZ $+3;指令将是它的坟墓!!! ;因为JZ $+2;DJNZ B,$+3;之类的才是正常的指令!!! ;---------------------------------------------------------------------; COMMAND0: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 CLR A JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND1: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 CLR A JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND2: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 CLR A JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND3: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 CLR A JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND4: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 CLR A JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND5: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 CLR A JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND6: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 CLR A JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND7: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 CLR A JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP END 相关链接:https://bbs.21ic.com/upfiles/img/200711/2007111217506606.rar |