原创 阻止反汇编软件汇编演示程序(中难度版)

2007-11-14 13:21 3922 5 5 分类: MCU/ 嵌入式
hotpower 发表于 2007-11-14 13:16 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


;-------------------------------------------------------;
;          阻止反汇编软件汇编演示程序(中难度版)
;菜地公告:
;凡引用本文或重要方法都应该指明出处---雁塔菜地!!!
;谢谢合作  
;以后菜农将会发布菜农的加密理论---让天下无贼论
;雁塔菜农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条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条