zoukankan      html  css  js  c++  java
  • Brainfuck反汇编-高级版(Python)

    import re
    
    def sym2cal(s):
        if '>' in s:
            return len(s)
        else:
            return -len(s)
    
    def cal(s):
        if '+' in s:
            return '+= %d'%len(s)
        else:
            return '-= %d'%len(s)
    
    def bf2asm(s,ptr,tab):
        p = 0
        l = len(s)
        while(p<l):
            pattern = re.compile(r'([><]*)[-([><]*)[-]([><]+)[-]([><]+)[-([><]+)+([><]+)+([><]+)]([><]+)[-([><]+)+([><]+)]([><]*)[-([><]+)+([><]+)]([><]*)]')
            match = pattern.match(s[p:])
            if match:        
                p += len(match.group())
    
                groups = match.groups()
                ptr1 = ptr + sym2cal(groups[0])
                ptr2 = ptr1
                for i in xrange(1,4):
                    ptr2 += sym2cal(groups[i])
                ptr3 = ptr2
                for i in xrange(4,12):
                    ptr3 += sym2cal(groups[i])
                print tab+'mem[%d] += mem[%d]*mem[%d]'%(ptr3,ptr2,ptr1)
    
                for v in groups:
                    ptr += sym2cal(v)
                continue
            
            pattern = re.compile(r'([><]*)[-]([><]+)[-]([><]+)[-([><]+)+([><]+)+([><]+)]([><]+)[-([><]+)+([><]+)]([><]*)[-([><]+)+([><]+)]')
            match = pattern.match(s[p:])
            if match:
                p += len(match.group())
    
                groups = match.groups()
                ptr1 = ptr
                for i in xrange(3):
                    ptr1 += sym2cal(groups[i])
                ptr2 = ptr1
                for i in xrange(3,11):
                    ptr2 += sym2cal(groups[i])
                print tab+'mem[%d] += mem[%d]'%(ptr2,ptr1)
    
                for v in groups:
                    ptr += sym2cal(v)
                continue
    
            pattern = re.compile(r'([><]*)[-]([><]+)[-]([><]+)[-([><]+)+([><]+)+([><]+)]([><]+)[-([><]+)+([><]+)]([><]+)')
            match = pattern.match(s[p:])
            if match:
                p += len(match.group())
    
                groups = match.groups()
                ptr1 = ptr + sym2cal(groups[0])
                ptr2 = ptr1 + sym2cal(groups[1])
                ptr3 = ptr2 + sym2cal(groups[2])
                print tab+'mem[%d] = mem[%d]'%(ptr1,ptr3)
    
                for v in groups:
                    ptr += sym2cal(v)
                continue
                
            pattern = re.compile(r'[-]')
            match = pattern.match(s[p:])
            if match:
                p += len(match.group())
                print tab+'mem[%d] = 0'%(ptr)
                continue
    
            pattern = re.compile(r'>+')
            match = pattern.match(s[p:])
            if match:
                p += len(match.group())
                ptr += len(match.group())
                continue
    
            pattern = re.compile(r'<+')
            match = pattern.match(s[p:])
            if match:
                p += len(match.group())
                ptr -= len(match.group())
                continue
    
            pattern = re.compile(r'++')
            match = pattern.match(s[p:])
            if match:
                p += len(match.group())
                print tab+'mem[%d] %s'%(ptr,cal(match.group()))
                continue
    
            pattern = re.compile(r'-+')
            match = pattern.match(s[p:])
            if match:
                p += len(match.group())
                print tab+'mem[%d] %s'%(ptr,cal(match.group()))
                continue
    
            c = s[p]
            if c == '[':
                stk = 1
                for i,v in enumerate(s[p+1:]):
                    if v == '[':
                        stk += 1
                    elif v == ']':
                        stk -= 1
                    else:
                        continue
                    if stk == 0:
                        print tab+'while mem[%d]:'%ptr
                        ptr = bf2asm(s[p+1:p+1+i],ptr,tab+'	')
                        p += i+1
                        break
                continue
    
            elif c == ',':
                if input_ptr < 96:
                    print tab+'mov mem[%d] input[input_ptr]'%ptr
                else:
                    if bit_add >= 3600:
                        print tab+'mov mem[%d] 0x30'%ptr
                    else:
                        print tab+'mov mem[%d] 1'%ptr
            elif c == '.':
                print tab+'cmp mem[%d] data[data_ptr]'%ptr
            p += 1
        return ptr
    
    s = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>[->+<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>,>>>>>>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>[->>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>]"
    input_ptr = 0
    bit_add = 0
    bf2asm(s,0,'')

     会简化一些代码流程,比如

    while mem[144]:
        mem[144] -= 1
    while mem[29]:
        mem[29] -= 1
    while mem[51]:
        mem[51] -= 1
        mem[144] += 1
        mem[29] += 1
    while mem[29]:
        mem[29] -= 1
        mem[51] += 1

    上面这段代码,分析后其实就是

    mem[144] = mem[51]
  • 相关阅读:
    leetcode16 3-Sum
    leetcode679:24Game
    leetcode621 贪心:任务安排
    SpringMVC中的Controller默认单例
    O(n)复杂度求没有出现的数字(leetcode448)
    SpringBoot获取ApplicationContext
    Largest Number(leetcode 179)
    使用免费ip代理进行投票
    Oracle分页
    Oracle JDBC配置
  • 原文地址:https://www.cnblogs.com/qintangtao/p/7117433.html
Copyright © 2011-2022 走看看