调试学习【2】

TraceMe序号验证程序流程图
调试学习【2】_第1张图片
加载目标文件调试

  • 设置OD中断在程序的入口点。
  • 名词注释:
    (1)System breakpoint:系统断点,OD用CreateProcessA加载DEBUG_ONLY_THIS_PROCESS参数执行,程序运行之后会触发一个INT13,在系统空间里。
    (2)Entry point of main module:主模块的入口点,即文件的入口点。
    (3)WinMain:程序的WinMain()函数入口点

·-------------------------------------------------------------
调试学习【2】_第2张图片

  • 1.虚拟地址:一般情况下,同一程序的同一条指令在不同系统环境下此值相同。
  • 2.机器码:这就是CPU执行的机器代码。
  • 3.汇编指令:和机器码对应的程序代码。
    容易犯错的调试方法
  • 用上次的方法来摸索一下
    调试学习【2】_第3张图片
    调试学习【2】_第4张图片

打开程序一路F8,在这里停了,设置一个断点
调试学习【2】_第5张图片
调试学习【2】_第6张图片
Ctrl+F2再次打开,F9跑到断点位置,F7步入CALL(Ctrl+F9返回到被调用之前的位置),一路F8到程序运行:
调试学习【2】_第7张图片
再下一个断点:
调试学习【2】_第8张图片
Alt+B然后取消掉第一个断点
在这里插入图片描述
F7步入,继续F8:
调试学习【2】_第9张图片
再一次弹出来了,所以设置一个断点:
在这里插入图片描述
取消上次断点,F7步入,继续F8

调试学习【2】_第10张图片
又停了,所以设置断点,取消上次断点,继续F7步入F8跟进
调试学习【2】_第11张图片
又停了,重复操作
这次F7步入之后,一直F8步过,
调试学习【2】_第12张图片发现程序陷入了死循环!
陷入死循环的原因:
调试学习【2】_第13张图片
正确的方式

  • 猜测使用GetDlgItemTextA(A,W," ")来获取输入
    调试学习【2】_第14张图片
    设置断点:
    调试学习【2】_第15张图片
    运行程序,输入
    调试学习【2】_第16张图片
    在断点处停下来
    调试学习【2】_第17张图片
    F8步过
    调试学习【2】_第18张图片
    调用CALL,发现没什么,所以Ctrl+F9回到调用位置,继续F8
    调试学习【2】_第19张图片
    在这里看到我们输入的值
    调试学习【2】_第20张图片
    这一段操作相当于:
    a(“123456”,“wdnmd”,5);
    三个参数,不知道返回值
    继续F8
    在这里插入图片描述
    这个很可能为验证程序的函数,但是我们现在只管返回值,继续F8
    在这里插入图片描述
    测试返回值是否为0
    调试学习【2】_第21张图片
    然而返回值就为0,显然“wdnmd,123456”密码必然错误,因此ZF零标志位为1
    在这里插入图片描述
    je指令不跳转了
    那么,改为0让他跳转
    在这里插入图片描述

(任何语言返回值都会放在eax里面)
未完待续

你可能感兴趣的:(re)