反汇编入门试手 简单程序

  • 刚学汇编,第一次自己写博客,分享一下,人艰不拆哈~

  • 老师为了提高我们的学习兴趣,给了我们这些刚懂寄存器是什么的菜鸟一个简单的exe文件让我们进行反汇编破解出正确的中断输入

  • 也不懂什么反汇编工具,仅在dosbox下用debug.exe文件的u命令进行破解

  • 听说高手都是在dos窗口下进行反汇编的,呵呵,其实是我们老师给的题目一下子就可以反汇编出语句来了,这篇博客只是用来记录一下分析过程

  • 不废话了,上文件SECRET1.exe


基本命令

debug命令 意义
u 查看debug反汇编过来的代码
t 单步执行
d 查看内存内容
p 跳过代码段执行,用来跳过中断

分析

debug后r命令显示寄存器内容,u命令查看当前代码段代码

反汇编入门试手 简单程序_第1张图片
反汇编入门试手 简单程序_第2张图片
反汇编入门试手 简单程序_第3张图片

将查看到底命令手动敲到自己用的编辑器上,配合分析,我在用的是Notepad++
然后用t命令执行一下到ds使用
用一下d命令通过ds寄存器看看数据段上的内容

反汇编入门试手 简单程序_第4张图片

  • 仔细观察,发现里面存了2串字符串,结合之前抄好的代码,会发现ds:[0016]指代you are welcome字符串的首地址
  • 而ds:[0029]则指代error!Please input again!里的内容
    ds:[0000]里面存的则是字符串的最大长度
    输入字符串的首地址则放在ds:[0002]中

然后就只能一步一步的调试,一步一步的改进之前抄在记事本里的反汇编出来的代码了
做标记,搞清楚逻辑关系,寻找突破口
这时候一个好的代码格式会帮很大的忙的


代码块

反汇编出来的汇编语言代码.asm文件:

data segment
db 0Ah,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h, 00h,00h,00h,00h,00h,00h;我不知道有没有其他方法来设置代码段的前几位,只能用这种笨办法了
key db 'you are welcome',0dh,0ah,'$'
warning db 'error!Please input again!',0dh,0ah,'$'
data ends

code segment
assume cs:code
start:
    mov ax,data
    mov ds,ax
    mov es,ax
    mov bx,0000
input_again:
    mov dx,0000
    mov ah,0Ah;输入中断
    int 21h
    lea si,ds:[0002];指向输入的字符首地址,正确密码应该为zpv!bsf!x(前连续任意几位均可)
    lea di,ds:[0016]; you are welcome!
    mov cl,ds:[0001];输入字符个数计数
next:
        mov al,ds:[di]
        inc al
        cmp ds:[si],al;判断密钥是否匹配,若不匹配则跳到error_
        jnz error_
        inc si
        inc di
        dec cl
        jnz next ;一位匹配则跳入下一位的匹配
            lea dx,ds:[0016];破解成功,获得输出结果
            mov ah,09h;输出中断
            int 21h
            jmp quit
        nop
error_:
        lea dx,ds:[0029]
        mov ah,09h;输出error
        int 21h
    inc bx;控制尝试次数,达到3次则自动结束程序
    cmp bx,+03
    jnz input_again
quit:
    mov ah,4ch;windows 结束
    int 21h
code ends
end start

总结

最重要的是静下心来,一步一步地操作,学习代码最快的捷径就是敲程序,然后发现问题并解决它

反汇编入门试手 简单程序_第5张图片
加油!

你可能感兴趣的:(汇编语言)