原程序在点击获取相对路径的时候,会将带空格的路径转换如下:
F:\1 1\Rolan\Rolan.exe 转换为 ..\..\1 1\Rolan\Rolan.exe
而我们需要的也是正确的相对路径应该为 ..\..\Rolan\Rolan.exe
所以我构建了一个函数 rtcmidcharvar(返回:F:\1 1\),然后调用 rtcreplace 直接替换 F:\1 1\ 为 ..\..\
问题来了,构建的函数运行正常,代码如下:
00403C80 > /6A 01 push 0x1 ; 子程序
00403C82 . |3E:8B45 E0 mov eax,dword ptr ds:[ebp-0x20] ; UNICODE "F:\Rolan\破解工具集\设置路径3.exe"
00403C86 . |50 push eax
00403C87 . |68 F43C4000 push Rolan.00403CF4 ; UNICODE "\Rolan"
00403C8C . |6A 01 push 0x1
00403C8E . |FF15 D4114000 call dword ptr ds:[<&MSVBVM60.__vbaInStr>; msvbvm60.__vbaInStr
00403C94 . |3E:8B55 E0 mov edx,dword ptr ds:[ebp-0x20]
00403C98 . |8955 94 mov dword ptr ss:[ebp-0x6C],edx
00403C9B . |8D55 8C lea edx,dword ptr ss:[ebp-0x74]
00403C9E . |8D4D CC lea ecx,dword ptr ss:[ebp-0x34]
00403CA1 . |8945 C4 mov dword ptr ss:[ebp-0x3C],eax
00403CA4 . |C745 BC 02000>mov dword ptr ss:[ebp-0x44],0x2
00403CAB . |C745 8C 08000>mov dword ptr ss:[ebp-0x74],0x8
00403CB2 . |FF15 3C124000 call dword ptr ds:[<&MSVBVM60.__vbaVarDu>; msvbvm60.__vbaVarDup
00403CB8 . |8D55 BC lea edx,dword ptr ss:[ebp-0x44]
00403CBB . |8D45 CC lea eax,dword ptr ss:[ebp-0x34]
00403CBE . |52 push edx ; /Length8
00403CBF . |6A 01 push 0x1 ; |Start = 0x1
00403CC1 . |8D4D AC lea ecx,dword ptr ss:[ebp-0x54] ; |
00403CC4 . |50 push eax ; |dString8
00403CC5 . |51 push ecx ; |RetBUFFER
00403CC6 . |FF15 F8104000 call dword ptr ds:[<&MSVBVM60.#632>] ; \rtcMidCharVar
00403CCC . |8BD0 mov edx,eax
00403CCE . |E9 06340300 jmp Rolan.004370D9
比如 mid("F:\1 1\Rolan",1,7),按理说返回的应该是字符串"F:\1 1\"才对,而且CALL rtcmidcharvar应该数值返回到eax,但是在寄存器和数据窗口中能看到返回的却分别如下图:

而我们期望获取的"F:\1 1\"却在数据窗口的0018F47C,请问这个返回是对的吗?为什么eax=0018F474的数据不是"F:\1 1\"呢?如何修改才能定位到字符串"F:\1 1\"呢?
希望各位大牛帮忙解答下,万分感谢!
[培训]科锐逆向工程师培训第53期2025年7月8日开班!