滴水逆向-Win32 消息断点_作业4详解--查找ReverseTraining_4.exe的登录方式

消息处理函数没找到,咋办?

在这里插入图片描述
od里运行EXE,
在od的窗口功能中下消息断点。
右键要下的窗口,选择消息断点。
当不知道是LBUTTONDOWN还是LBUTTONUP时候,可以试一下运行程序exe后,鼠标点击要测试的按钮,摁下去不动,过一会再抬起来看哪个有提示。

在这里插入图片描述
在这里插入图片描述
因为他们都是button,系统回调函数都是一样的,所以消息断点会一起下。

进入断点功能,能看到消息断点其实就是条件断点。
在这里插入图片描述
此时点击相应的button会发现断下来。但是断下后会发现停在7开头的地址,也就是dll里提供的系统消息处理函数。

在这里插入图片描述
我们知道这个系统函数总有一天会执行到并调用我们自己写的处理函数,但是一步一步执行太费时间。
所以我们可以点击M,进入内存窗口。

在代码段text节下访问断点。因为系统消息处理函数终究会调用代码段的我们自己写的处理函数,程序一回到代码段就会被中断。
在这里插入图片描述
注意:这个系统处理函数并不是我们点击按钮时才会发送消息,不点的时候也会发。也就是说我们此时点击F9运行,确实会断到4开头的地址。但是该位置并不一定是我们要找的自己写的处理函数。

在这里插入图片描述
此时应该观察栈列表的esp+8的消息类型。
在这里插入图片描述
因为所有系统函数最终都会调用父窗口的消息处理函数,所以如果是我们要找的代码段的父窗口消息处理函数,消息类型应该是WM_COMMAND,也就是111。
所以要先右键取消内存访问断点(要不然走一步断一次),然后F9运行。
最后成功的是不取消内存访问断点,一直F8步过到7,F9再到4开头的找到消息类型为111的处理函数。

作业4详解–查找ReverseTraining_4.exe的登录方式

通过上述的原理和步骤走到如下,开始分析当msg==WM_command时的消息处理函数。
在这里插入图片描述
注意图中这个
在这里插入图片描述
按照je指令,如果zf=1,它跳到4010F9,就走error。如果不跳正常执行,就走OK。
发现能改变zf值的应该是前面有个test语句,我们需要让test eax,eax后zf=0,这样上面的je指令就不跳了。
在这里插入图片描述
看了test指令的含义后,明白我们要让eax=1,这样执行test后寄存器为1,这样ZF=0。找给eax赋值的地方,发现上面有个函数:
在这里插入图片描述
进去后看看返回的地方,探寻如下:
在这里插入图片描述
这里写出这些注释的思路是从后向前推。
看到有两个retn参数,第二个retn前面有xor eax,eax;执行后eax必为0,我们想要的是eax=1,所以证明此条路为通向ERROR的返回函数。
第一个retn前面有mov eax,0x1;明显就是我们要找的通向OK的返回函数。

再向前找,发现两个jnz都会导致程序跳到0040108F,也就是一旦两个跳转指令执行,程序必定是ERROR返回。所以猜测这两个判断跳转应该和账号密码有关。
当zf=1,即cmp指令中ecx=3,第二次ecx=5,才能保证两次都不跳。
因为知道401060和401073执行后ecx值必定为FFFFFFFF,猜测ecx值在下面几行语句中生成,开始反推ecx值。
推出401065执行后,ecx=FFFFFFFB满足40106A中ecx=3;401073执行后,ecx=FFFFFFF9满足40107B中ecx=5。

这里我开始挨个F8执行然后看其中的值(我认为应该有更合理更全面的分析方法,但我不会呜呜),发现esp+C和esp+5C两个位置分别存储了账号和密码的ascii码,并通过lea将地址传给edi。
所以猜测问题出在401065和401076中。
这句指令的解释:
重复前缀指令(repeat) REP,REPZ \ REPE,REPNZ \ REPNE
在这里插入图片描述
串扫描指令SCAS
在这里插入图片描述
比如我输入账号=1,密码=2,点登陆。
执行到401065时,因为是byte,我就跟进edi的值,发现其存的作为地址,指向的正好就是00000031,也就是账号=1的ascii值。
摁下第一次F7步入。此时,31与AL的00不相等,所以cx=FF-1=FE,EDI=EDI+1(向后挪了一字节,有点遍历看是否相等的味道)。
摁下第二次F7步入。因为前面是repne,不相等就再执行,且此时DF=0。此时EDI指向的值(byte大小)为00,与AL的00相等,不再执行该语句了。此时仍然进行一次cx-1=FE-1=FD,跳到not ecx去了。

至此,我们发现,我们要获得的FFFFFFFB和FFFFFFFD差2,而能让ecx多减去2的办法就是让上一条语句再多执行两次,也就是让edi的值和al继续多不相等两次,致使cx多减少两次。
该办法翻译成人话就是在账号框中输入三个字符,这样就会生成EDI=00XXXXXX,有三次和al不相等的机会,满足执行后ecx=FFFFFFFB,最终得出ecx=3,实现zf=0,jnz不跳跃。
同理得出,如果执行401076后ecx=FFFFFFF9,就必须在密码框输入5个字符。

进行试验后发现该方法有效。
至此,该程序破解完毕。


以上指令解释部分灵感来源于其他大佬的解释,本人加入了自己的理解。
感谢@光帅帅https://blog.csdn.net/z17805008775?type=blog大佬的滴水逆向笔记有关博客,让我受益良多,也给了我发出本文的动力。
本人小白刚刚入门,本文为第一篇自己写的博客。如有任何错误,请在评论区指正或私信。请大佬们轻喷~o(T-T)ゞ

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值