我使用x64dbg和IDA Pro,进程为32位。我不确定是否执行正确,因为崩溃了,我不确定这是我做错了还是应用程序启动过程由于某种原因而失败,因为它可以找不到窗口。

基本上,我想做的是在启动时更改某些应用程序的窗口标题。我正在尝试通过在user32函数CreateWindowExA上设置一个断点,然后尝试更改lpWindowName参数来实现此目的。


在这里您看到的字符串“ Title may”最初包含的是Windows标题,所以我认为这是我需要更改的位置。当在该地址更改时,虽然我得到了错误。谢谢。

编辑:我做了更多的工作,并制作了一个虚拟程序来帮助我弄清楚正在发生的事情。因此,此应用程序中的CreateWindowExA函数对lpClassNamelpWindowName参数使用相同的指针。因此,对程序进行修补以仅输入一个字符串而不是该指针即可成功实现我的目标。

评论

您是否更改指针或其指向的字节?原始窗口标题的字节大小是多少?

我改变它指向的字节,并保留相同长度的字符串(如果这很重要)。我相信原始标题是由10个字符组成的字符串,包括0 /(如果需要包含它?),除非我猜它是宽字符。不太确定我会如何确认,尽管抱歉

看一下msdn.microsoft.com/zh-cn/library/windows/desktop/…,看看是否更改了正确的参数。在记录文档时,无需猜测哪个参数是窗口名称。

谢谢。我试图这样做,但是我对事情有些困惑。断线在哪里,但是对我来说那看起来并不像一个函数。所有这些指令是否都导致从函数序号开始到调用user32.76F8AA9C的最底层,然后是实际调用的函数?这是我得出的结论,所有双字ptr ss都将调用user32.76F8AA9C称为函数参数?

是的,就像在stdcall中一样,我们在堆栈中有参数,您可以在调试器堆栈视图中检查/更改它们。您在此处看到的是一个以某种方式用作调用主要功能的接口的功能。

#1 楼

提示:安装用于x64dbg的xAnalyzer,这可能会帮助您进行反向操作。

现在,您处于user32.dll函数CreateWindowExA中。我不会在那里更改该参数,而是在用户代码之外更改(熟悉stdcall约定,即WinApi所使用的约定)。您要拍摄的参数是用户代码中call CreateWindowExA上方的三按。更改指针或指针下的内容,不要忘记以null结尾。

评论


内核功能?对于初学者来说,它不是kernel32.dll中的函数,而且仅仅是因为该DLL名称中带有“ kernel”,并不意味着该函数会成为内核函数。

– 0xC0000022L♦
17年12月19日在22:12

@ 0xC0000022L您完全正确。在这里已经很晚了,我只是输入了一个快速答案。当然,CreateWindow不会通过sysenter系统,我只是看到他在dll中,并且出于某种原因将其称为内核函数。 (编辑了aswer)

–barnaby-b
17/12/20在14:57



#2 楼

钩上它,然后将参数lpWindowName设置为"your name here"(不能保证会工作)或mov edx, dword ptr ss:[EBP+C]上的断点,然后从FPU(寄存器盒)获取EBP,进入ReClass之类的程序并将EBP+0xC(窗口名称)设置为您想要的名称(90%的用户肯定会有用)。参考:https://stackoverflow.com/questions/873658/how-can-i-hook-windows-functions-in-c-c https://www.youtube.com/watch?v=K_jj6yF5ac0

#3 楼

谢谢你们的回应。我设法实现了我在OP编辑器中详细介绍的目标:

此应用程序中的CreateWindowExA函数对lpClassNamelpWindowName参数使用相同的指针。因此,修补程序以仅将一个字符串而不是该指针推入lpWindowName便成功实现了我的目标。我相信更改lpClassName会导致我在OP中描述的崩溃。