;-------------------------------------------------------; ; 阻止反汇编软件汇编演示程序(中难度版) ;菜地公告: ;凡引用本文或重要方法都应该指明出处---雁塔菜地!!! ;谢谢合作 ;以后菜农将会发布菜农的加密理论---让天下无贼论 ;雁塔菜农HotPower@126.com HotPower@163.com 2007.11.13 ;-------------------------------------------------------;
$NOMOD51 $include (reg52.inc) CRC DATA 30H;注意这个变量是如何对付敌人,保护信息不修改!!! TEST_55H DATA 40H TEST_AAH DATA 7FH SP_MIN DATA 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 ;------------------------------------------------------------------------------; ; 版本信息区,大家可以试试 ;------------------------------------------------------------------------------; DB 02H;伪造LJMP指令 HotPowerMessage:;敌人找看不见HotPowerMessage入口地址但能知道~~~ DB "HotPower@126.com 2007.11.13";CRC8结果为0xc5 DB 0C5H;以上版本信息区字符串的CRC8结果,这样可以保证全部变量CRC永远为0!!! DB 0;版本信息区标志 ;------------------------------------------------------------------------------; ; 代码数据保护,这里故意不保护入口代码,故意留给敌人看清这是"标准"的散转 ;可是该子程序的入口只有1个ACC=0~~~ ;------------------------------------------------------------------------------; CODEDATAPROTECT: MOV DPL,A;暂存A RL A;A*2 ADD A,DPL;3*A MOV DPTR,#CODEDATABUFF;明着欺骗,告诉反汇编程序,CODEDATABUFF是数据区或跳转区!!! JMP @A+DPTR;? CODEDATABUFF: LJMP MAINLOOP;真的运行代码,告诉反汇编本程序是真的~~~可是下面的全是骗子~~~ ;------------------------------------------------------------------------------; ; 以下全是让敌人白辛苦~~~ ;------------------------------------------------------------------------------; DB 02H;与下列DW 55AAH组成新的“指令”LJMP 55AAH,从而保护数据0x55AA TESTDATA: DW 55AAH;藏入内存掉电保护数据0x55aa LJMP CODEDATA1;欺骗代码1 ;------------------------------------------------------------------------------; ; 如果以下都搞些数据,这些LJMP就是我们实际要数据DW.好好LJMP原来是DW~~~ ;------------------------------------------------------------------------------; LJMP 1234H;实际要数据 DW 1234H LJMP 5678H;实际要数据 DW 5678H LJMP 9ABCH;实际要数据 DW 9ABCH LJMP 0DEF0H;实际要数据 DW DEF0H ;------------------------------------------------------------------------------; 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;第1次RETI MAIN1: ;以下语句制造些难度 JZ MAIN2-1;ACC肯定为0,程序将执行NOP指令!!! CODEDATA1: DW 1200H;欺骗代码(低8位为NOP指令!!!) MAIN2: ;以下语句实际为LJMP MAININIT MOV DPTR,#MAININIT PUSH DPL PUSH DPH RETI;第1次RETI DW 12AAH;藏入数据 ;主循环初始化 MAININIT: ;-------------------------------------------------------------------; ; 在此添加硬件初始化代码 ;-------------------------------------------------------------------; MOV P0,#0FFH MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH
LCALL SYSINIT;系统初始化 ;以下语句实际为LJMP MAINLOOP CLR A;取MAINLOOP入口表值并跳入 LCALL CODEDATAPROTECT;故意内存泄露,让SP+2 ;-------------------------------------------------------------------; ; 上句估计让敌人以为程序回继续执行到SYSINIT ;-------------------------------------------------------------------; SYSINIT: ;-------------------------------------------------------------------; ;注意:下面将对入侵者进行报复!!! ;-------------------------------------------------------------------; ;在此加入系统初始化语句 ;以下三句解读DPTR的指针TESTDATA CLR A JZ $+3;肯定运行NOP;MOV DPTR,#TESTDATA DW 1200H;低8位为NOP指令 ;-------------------------------------------------------------------; ;虚拟机不晕??? ;CODEDATAPROTECT子程序里明确告诉有指令LJMP 55AAH ;怎么现在却变成取数据55AAH了??? ;-------------------------------------------------------------------; MOV DPTR,#TESTDATA;取出被保护的数据,让虚拟机产生矛盾 MOVC A,@A+DPTR ;-------------------------------------------------------------------; ;不立即数0x55比较是为防止篡改重要信息做准备 ;-------------------------------------------------------------------; XRL A,TEST_55H JNZ SYSINITERROR INC DPTR MOVC A,@A+DPTR ;-------------------------------------------------------------------; ;不立即数0xaa比较是为防止篡改重要信息做准备 ;-------------------------------------------------------------------; XRL A,TEST_AAH; JZ SYSINITNEXT;成功 SYSINITERROR: ;-------------------------------------------------------------------; ; 在此添加上电初始化代码 ;-------------------------------------------------------------------; ;在此加入系统初始化语句 ;以下三句反解读DPTR的指针HotPowerMessage CLR A JZ $+3;肯定运行NOP;MOV DPTR,#HotPowerMessage DW 1200H;低8位为NOP指令 MOV DPTR,#HotPowerMessage; MOV CRC,A;CRC初始化为0 SYSCRCLOOP: CLR A MOVC A,@A+DPTR JZ SYSCRCEXIT;信息取完结束 INC DPTR LCALL DO_CRC;CRC校验 SJMP SYSCRCLOOP SYSCRCEXIT: MOV TEST_55H,#055H MOV TEST_AAH,#0AAH SYSINITNEXT: ;-------------------------------------------------------------------; ; 在此添加其他初始化代码 ;-------------------------------------------------------------------; LCALL TIMERINIT; SYSINITEXIT: RET;
TIMERINIT: ;-------------------------------------------------------------------; ; 在此添加定时器初始化代码 ;-------------------------------------------------------------------; 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工作结束 ;----------------------------------------------------------------------------- ; 注意以前程序为SP_MIN+4,欺骗后因为内存泄露故为SP_MIN+6 ;----------------------------------------------------------------------------- MOV R0,#SP_MIN+6;实际是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 MOV A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕 JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND1: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 ; CLR A MOV A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕 JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND2: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 ; CLR A MOV A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕 JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND3: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 ; CLR A MOV A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕 JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND4: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 ; CLR A MOV A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕 JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND5: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 ; CLR A MOV A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕 JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND6: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 ; CLR A MOV A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕 JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP COMMAND7: NOP;在此添加命令 ;返回前对付反汇编!!!让它找不到RETI指令 ; CLR A MOV A,CRC;因为信息没修改CRC就为0,修改程序就就飞~~~哈哈,看你晕不晕 JZ $+3;肯定运行NOP;RETI DW 1200H;低8位为NOP指令 ;用RETI迷惑反汇编,以为是某个中断服务程序 RETI;返回到MAINLOOP ;8位静态字节循环冗余码校验程序 DO_CRC: PUSH ACC PUSH B PUSH ACC MOV B,#8 CRC_LOOP: XRL A,CRC RRC A MOV A,CRC JNC ZERO XRL A,#18H;CRC=X8+X5+X4+1 ZERO: RRC A MOV CRC,A POP ACC RR A PUSH ACC DJNZ B,CRC_LOOP POP ACC POP B POP ACC RET END
下载:阻止反汇编软件汇编演示程序(中难度版)
|
讨论将在: http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?id=2753361
欢迎世界上各色皮肤的高手拍砖~~~谢谢
|
文章评论(0条评论)
登录后参与讨论