作为新手,学了一段时间逆向,尝试破解FSCapture9.7遇到不少困难,也得到了高手的指点,其中一个方法就是堆栈暂停回溯法,引起很多思考。对于这个软件来说,系统暂停后,用户区调用了很多的call才到核心代码。后来又看论坛了解了,精准型消息断点,x64dbg表达式 打印日志等文章。针对用户名和密码文本输入的思考有一个想法,对于无法搜索字符串,无法通过文本框下api断点,是不是可以找第一次文本在寄存器中出现的语句下断点?运气好的话可以直接到达关键代码段,就算不能,那也已经非常接近关键代码段,单步跟踪应该也能到达关键代码段。于是做如下尝试:系统:win7 64未注册版软件如下链接:https://pan.baidu.com/s/1_wrHWu9Z7lQc6wlIDQEQ1w?pwd=3oo7提取码:3oo7
过程如下
1.给注册按钮下精准消息断点
参考文章偷换windows窗口过程 https://blog.csdn.net/lixiangminghate/article/details/71598164消息万能断点_win7万能断点 http://bbs.pediy.com/showthread.php?t=98274精准型消息断点 https://zhuanlan.zhihu.com/p/636555027
首先载入程序,在程序入口自动暂停
点击运行,弹出过期窗口,点击输入注册码按钮,开始注册
输入用户名,密码,此处不要点击注册,进入句柄窗口,获取句柄
进入句柄窗口,点击刷新
显示了当前程序的所有控件句柄信息,选择注册按钮,此处我们需要复制注册按钮的父窗体句柄,注册按钮的句柄,后面会用到
现在开始下精准消息断点,前提要载入user32.dll的符号信息搜索internalcallwinproc,F2下断点
进入断点窗口,精准消息断点参数如下:模块=user32.dll.__InternalCallWinProc@20暂停条件 arg.get(1)==0x父句柄 && arg.get(2)==0x111 && arg.get(4)==0x按钮句柄举例arg.get(1)==0x191008 && arg.get(2)==0x111 && arg.get(4)==0xB0DCA
2.通过内存断点返回用户领空
F9运行程序,程序跑起来了,点击注册按钮,程序断在internalcallwinproc处,检查堆栈参数是否正确
返回内存布局页面给code下内存断点
点击F9运行程序,断在用户领空
3.利用步进直到满足条件功能,打印所有的寄存器日志信息
参考菜鸟的福音-x64dbg完美追踪方案https://www.52pojie.cn/forum.php?mod=viewthread&tid=1855029&highlight=x64dbg https://bbs.kanxue.com/thread-279502.htmX64Dbg 介绍->表达式- iBinary https://www.cnblogs.com/iBinary/p/16359195.html
此时把断点禁止,以免跟踪时被暂停 点击菜单栏的跟踪,选择步进直到满足条件功能
步进直到满足条件的参数设置如下:日志文本:###{modname@cip}{a:cip}#{i:cip}--->eax{a:eax}--ebx{a:ebx}--ecx{a:ecx}--edx{a:edx}--esp{a:esp}--ebp{a:ebp}--esi{a:esi}--edi_{a:edi}日志条件:mod.party(cip)!=1 意思是仅当用户领空时打印日志
此处的输出有2种,1.如果选择了日志保存位置,会以log文件的形式,输出到指定目录;2,如果不选择目录,会默认输出到日志选项卡因为输出内容非常多,此处我们选择保存log文件
点击确定后开始跟踪,指定步数后暂停
4.找到用户名或者密码的语句
找到保存的log目录
利用搜索功能,查找用户名或者密码.找到第一次出现的用户名或者密码,记下地址
5.用转到表达式功能ctrl+G,定位到代码,下断点。或者,在到达位置往上找到段的起始位置下断点后跟踪程序
重新运行程序,断在关键代码区域,开始单步跟踪分析程序
跟踪不久发现相关注册信息
继续跟踪,发现了关键跳转语句,跳向不同的注册类型。选择某一个类型即可注册成功。 本文结束
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
轻装前行 所以最后搞定了吗
Mxixihaha 0070C24C 55 PUSH EBP //注册按钮的事件断点. 暂停法 或者 delphi 事件特征都很容易找到 74 0E ...
ieusr 谢谢,好好学习一下你说的这个按钮事件。