打印

天下无贼--我也来说说怎样打造安全的防**系统

[复制链接]
9422|47
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2007-11-12 13:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;-------------------------------------------------------;
;阻止反汇编软件汇编演示程序
;雁塔菜农HotPower@126.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

MAIN:
    MOV   SP,#SP_MIN
    MOV   B,#0
MAINLOOP:;真的主循环入口
    INC   B
MAINLOOPX:
    MOV   A,B
    ANL   A,#00000111B
    MOV   DPTR,#COMMANDJUMPTAB
    ACALL COMMANDEXEC ;执行命令,哈哈~~~执行完后直接跳回MAINLOOP
    DJNZ  B,MAINLOOPX;假的,永远也不会执行的!!!
;命令跳转表(在此主要是让反汇编软件迷糊)
COMMANDJUMPTAB:
    DW  COMMAND0;命令0
    DW  COMMAND1;命令
    DW  COMMAND2;命令2
    DW  COMMAND3;命令3
    DW  COMMAND4;命令4
    DW  COMMAND5;命令5
    DW  COMMAND6;命令6
    DW  COMMAND7;命令7

;命令命令执行子程序
;入口条件: ACC=命令号
;       DPTR=命令跳转表首指针
;出口条件:
;命令模块
COMMANDEXEC:
    PUSH  ACC;执行命令地址低8位
    PUSH  ACC;执行命令地址搞8位
    MOV   R0,#SP_MIN+4;实际是SP,主要防止反汇编跟踪SP等要害寄存器
    RL    A;
    ANL   A,#00011110B;只取8个命令
    ADD   A,#LOW COMMANDJUMPTAB
    MOV   DPL,A;存跳转表PROC;注意不要为0即可!!!
;注意下列的COMMANDEXEC1-1,跳如MOV A,#00H指令的第2个字节(00H)!!!
    JZ    COMMANDEXEC1-1;????哈哈,这个是假的~~~阻止火星人反汇编~~~
    MOV   A,#00H;应该这里的ACC必须为0
COMMANDEXEC1:    
    MOVC  A,@A+DPTR;PROCH
    XCH   A,@R0;PSW
    DEC   R0;#SP_MINACC
    MOV   A,#01H
    MOVC  A,@A+DPTR;PROCL
    XCH   A,@R0;ACC
    DEC   R0
    MOV   @R0,#HIGH MAINLOOP
    DEC   R0
    MOV   @R0,#LOW MAINLOOP
    RET;散转入@A+A+DPTR处PROC0~PROCF
COMMAND0:
    NOP
    RETI;返回到MAINLOOP
COMMAND1:
    NOP
    RETI
COMMAND2:
    NOP
    RETI
COMMAND3:
    NOP
    RETI
COMMAND4:
    NOP
    RETI
COMMAND5:
    NOP
    RETI
COMMAND6:
    NOP
    RETI
COMMAND7:
    NOP
    RETI
    END
相关链接:https://bbs.21ic.com/upfiles/img/200711/20071112132219146.rar

相关帖子

来自 2楼
hotpower|  楼主 | 2007-11-12 17:50 | 只看该作者

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

;-------------------------------------------------------;
;          阻止反汇编软件汇编演示程序(小难度版)
;菜地公告:
;凡引用本文或重要方法都应该指明出处---雁塔菜地!!!
;谢谢合作
;雁塔菜农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

使用特权

评论回复
板凳
hotpower|  楼主 | 2007-11-12 13:23 | 只看该作者

沙发~~~

先上班~~~

使用特权

评论回复
地板
HWM| | 2007-11-12 13:25 | 只看该作者

道高一尺,魔高一丈,呵呵

使用特权

评论回复
5
hotpower|  楼主 | 2007-11-12 13:25 | 只看该作者

浅入深出,保护自己~~~

使用特权

评论回复
6
hotpower|  楼主 | 2007-11-12 13:26 | 只看该作者

这句话好好看JZ COMMANDEXEC1-1

使用特权

评论回复
7
fsaok| | 2007-11-12 13:34 | 只看该作者

呵呵

暂时没有时间玩,感觉和函数指针差不多

如果这个题目和C无缝连接才是最好

使用特权

评论回复
8
McuPlayer| | 2007-11-12 15:00 | 只看该作者

对,就是函数指针

这是反汇编的一堵大墙
一般的反汇编无法搞定了,但是专门做个针对函数指针的反汇编也不是只有火星人可以搞定,土星人也有可能

使用特权

评论回复
9
john_light| | 2007-11-12 17:54 | 只看该作者

9楼无敌海景黄金广告位招租

这样去“做”程序的人不太多。

使用特权

评论回复
10
hotpower|  楼主 | 2007-11-12 18:09 | 只看该作者

再高难度就打不成补丁了(局部改汇编代码)

使用特权

评论回复
11
hotpower|  楼主 | 2007-11-12 19:23 | 只看该作者

fsaok:把《Keil C51红杏出墙记》节选升级即可"和C无缝连接"

现在有好久没搞51了,所以HotIns.H一直没升级~~~
相关链接:http://www.google.cn/search?q=hotins.h&complete=1&hl=zh-CN&newwindow=1&start=0&sa=N

使用特权

评论回复
12
hotpower|  楼主 | 2007-11-12 20:42 | 只看该作者

火星撞地球图示

使用特权

评论回复
13
zhabin| | 2007-11-12 22:58 | 只看该作者

对51这种CPU而言阻止反汇编的意义不大,反而增加程序维护的

51的代码最多几十K, 用IDA这类交互式反汇编软件,采用人工干预的方法对付这种技巧,一天之内即可搞定。反汇编最大的难点是读懂代码后,能分析出算法。真正要保护程序只能从芯片加密上做**。

使用特权

评论回复
14
洪七公| | 2007-11-12 23:05 | 只看该作者

楼上要看清楚了,这些语句根本不能反汇编!!!

使用特权

评论回复
15
chunyang| | 2007-11-12 23:17 | 只看该作者

确实不错

正好可以用来保护俺的“标志**”,双保险。

使用特权

评论回复
16
zhabin| | 2007-11-12 23:17 | 只看该作者

没有不能反汇编的指令,关键是找到指令的起始地址

用IDA软件,可以很便当地找出任何地址,你可以将程序中出现的数据指定成地址。只要程序量不是太大,人工干预的工作量并不大。

使用特权

评论回复
17
IceAge| | 2007-11-12 23:35 | 只看该作者

作用不大。 zhabin 说的极其好

难倒的只是极弱手。用数据混杂程序,间接调用,会造成短暂的反汇编混乱,几条语句过后很快会恢复正常。不正常之处,人工反汇编即可。毕竟既然反汇编了,肯定要人来读的。这种刻意为之的做法,给自己造成的困扰比给别人造成的困扰要大。

另外,多次扫描外,我以前曾用了一个回溯方法,用以实现最大可能的代码,原理就是基于不正常代码后十若干行后会恢复正常,然后回溯。

使用特权

评论回复
18
洪七公| | 2007-11-12 23:45 | 只看该作者

这次老师错了~~~百次扫描也不行~~~上男下女它像谁???

不信等俺加入CRC后您老玩玩???

哈哈~~~这才到"小难度"~~~

哈哈~~~还有"中,上,特"~~~

哈哈~~~上身是男性,下身是女性,你说他(她)是谁???

使用特权

评论回复
19
xwj| | 2007-11-13 00:06 | 只看该作者

哈哈~~~上身是男性,下身是女性,你说他(她)是谁???

呵呵,拉不就是LZ老Hot嘛?

使用特权

评论回复
20
洪七公| | 2007-11-13 00:10 | 只看该作者

chunyang要缴纳费用的~~~俺替HotPower代收!!!记住

哈哈~~~等俺玩完了,让你们好好玩玩~~~

然后俺在嵌入到C51上~~~

使用特权

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

本版积分规则

1460

主题

21619

帖子

506

粉丝