如何达到非标准按钮触发的功能?

逆向工程 视窗 x64dbg 快手
2021-07-04 15:48:04

我已经阅读了相关的帖子,例如:

不幸的是,他们都没有帮助我解决我的疑虑。我的目标是学习最可能的通用方法来跳转到由非标准按钮(由任何类型的 UI 框架创建)触发的例程。

为了说明我的担忧,我创建了一个虚拟的裂纹- (在 0-10 的范围内,我会说 -1 级 :))

为了让这个练习真正有用,让我们假设:

  • “crackme”不包含您可以使用的任何硬编码序列
  • “crackme”不包含任何可用于检查周围代码的激活消息
  • WM_PARAM/WM_LBUTTONUP、BT_CLICK等BMSG不会做

我创建了这个小 mcve 来更好地说明我真正关心的问题,在我正在处理的真实案例中,我想从头到尾阅读由按钮触发的例程,以便解码所使用的算法。

所以是的,问题是,处理这个特定问题的方法是什么?

2个回答

在windbg中打开crackme在GetWindowTextW上设置一个bp并运行输入一些假数据和中断时的热注册按钮转到调用该函数的下一帧

:\>cdb crackme1.exe

Microsoft (R) Windows Debugger Version 10.0.16299.15 X86
0:000> bp USER32!GetWindowTextW
0:000> g


Breakpoint 0 hit
*** WARNING: Unable to verify timestamp for D:\crackme1.exe
*** ERROR: Module load completed but symbols could not be loaded for D:\crackme1.exe

USER32!GetWindowTextW:
772db8c5 6a08            push    8
0:000> dd esp l4
015ef760  005312bf 000603a8 000bb324 0000000c
0:000> dc bb324 l8
000bb324  00650052 00690067 00740073 00720065  R.e.g.i.s.t.e.r.
000bb334  00690000 00000074 00000000 abababab  ..i.t...........

0:000> gu
eax=0000000b ebx=00118988 ecx=772db928 edx=00000030 esi=015efa4c edi=015efa5c
eip=005312bf esp=015ef770 ebp=015ef7b0 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
crackme1+0x1312bf: <<<<<<<<<<<<<<<<<<
005312bf 8945f4          mov     dword ptr [ebp-0Ch],eax ss:0023:015ef7a4=0000000b
0:000> dc bb324 l8
000bb324  00610079 006b006b 00200075 00610062  y.a.k.k.u. .b.a.
000bb334  006b006b 00000075 00000000 abababab  k.k.u...........

这里的问题不是要解决crackme,而是要找到“注册”按钮的处理程序。我描述了可以做什么来找到按钮处理程序。可能没有适用于所有类似情况的“通用”标准程序。

然而,虽然这是一个特例,但我假设正常的“通用”Windows 消息行为。在这种情况下,我可以期待某处有一条WM_LBUTTONX消息,X 是UPor DOWN,带有值0x201or 0x202因此,我静态搜索200hIda 中的值,这是 WindowsWM_消息集中“鼠标组”的开始。

发现了许多与 进行比较的位置0x200在这些上我设置了一个断点。其中两个是在鼠标点击时命中的,其中一个是明确调查的,0x201 (WM_LBUTTONDOWN)并且0x202 (WM_LBUTTONUP)

在此处输入图片说明

如果您沿着WM_LBUTTONUP路径更进一步,您将直接到达以下位置,并调用f_someMsgHandler(正如我所说的那样):

在此处输入图片说明

这个函数会被多次调用,但是很容易找到与鼠标事件对应的函数,例如通过设置一个选择性断点。在此函数中,以下位置直接指向WM_LBUTTONUP“注册”按钮的处理程序,位于地址0x4fead0(不幸的是,该地址隐藏在工具提示中):

在此处输入图片说明

为了解决这个问题,寻找“GetWindowText”之类的东西可能会更容易。

这表明,与 OP 的评论相反,很可能跟踪标准 Windows 鼠标消息的踪迹以找到合适的处理程序。