本帖最后由 TwilightZ 于 2024-01-15 21:58 编辑
这个是个2010年的游戏(程序日期),官网早就倒闭了,尽管如此,还是希望尊重版权。请管理高抬贵手,有违规的地方通知我。打这么多字不容易 欢迎来到“某高青蛙”XXX教程,吾是一个小白,一只菜鸟级的青蛙。如果吾在教程中犯了错误,欢迎纠正。 首先,吾们来试玩一下这款古老的游戏。哎呀,有时间限制,真是让人头疼。 不过没关系,吾们有PEID工具,可以查看一下壳。看,ASProtect 1.22 - 1.23 Beta 21 -> Alexey Solodovnikov 运行程序,到程序基址,试试搜索字符串register。搜到了,也能断下,但是似乎没啥用(吾太菜了,不会分析,那就不走这条路)。
(从时间方面考虑,似乎可以成功,记不清楚了,但是目前不太好复现,不给吾试用的机会了。大概思路就是用游戏加速减速工具(论坛有),然后呢,这个工具确实是有效果;xuetr应用层钩子 进程钩子扫一下这个变速器 挂钩的时间相关的API;然后再断下这个几个API 慢慢回溯,找到调用的地方 然后再猜一下,这个就不说了,可以试一下,目前麻烦复现,懒得折腾)
那么从启动时的弹窗入手,会不会注册了就不弹出这个窗口了?先回溯一下创建这个窗口的位置。断CreatewindowExA回溯比较麻烦,忘记能不能回溯过去了。偷懒的做法是 F9运行程序,弹出窗口, 下DestroyWindow断点(对某些窗口可能不管用,先试试)。
然后关闭这个窗口(也就是点击quit) 慢慢F8回溯到程序领空(似乎也不是程序领空?壳申请的一部分内存,我不清楚怎么描述,求大佬解惑)。 00AA142D 53 push ebx ; Froggy.00400000 00AA142E E8 D53CFFFF call 00A95108 ; jmp 到 kernel32.FindResourceA 00AA1433 50 push eax 00AA1434 53 push ebx ; Froggy.00400000 00AA1435 E8 4E3DFFFF call 00A95188 ; jmp 到 kernel32.LoadResource 00AA143A 50 push eax 00AA143B E8 503DFFFF call 00A95190 ; jmp 到 kernel32.SetHandleCount 00AA1440 50 push eax 00AA1441 53 push ebx ; Froggy.00400000 00AA1442 E8 693DFFFF call 00A951B0 ; jmp 到 user32.DialogBoxIndirectParamA 00AA1447 5B pop ebx ; 0012FB88 00AA1448 5D pop ebp ; 0012FB88 00AA1449 C2 1400 retn 0x14
看到 FindResourceA LoadResource DialogBoxIndirectParamA 这让吾想到了,难道是从资源加载的这个窗口?
看一下资源里有没有窗口资源。加壳了原版程序看不了资源?不管三七二十一,运行程序,直接dump(直接od 或者scylla或者loardpe,个人喜欢用scylla)。
ResourceHacker看一下dump出来的这个exe 就能看到资源了(可能对某些壳无效)。 刚好可以看到两个dialogbox资源 一个103 一个137。103就是那个未注册窗口,137就是注册给xxx。
额 断一下FindResourceA(不确定能不能断下可以断 FindResourceW 和 FindResourceExW 以及FindResourceExA)。 断在了FindResourceA,资源id刚好是0x67,也就是103。
改一下参数137 刚好弹出已注册的窗口,当然这里显示没有用,进游戏还是未注册。 思路有了,找一下哪里给它赋值0x67,但是太菜,找不到合适的API(Getversion不行),使得壳已经解码同时还未运行到这里。那就往上回溯 。
所以破解方法是: od载入exe,记得删除所有断点。下FindResourceA断点,F8 回溯到这里。 00AA142E E8 D53CFFFF call 00A95108 ; jmp 到 kernel32.FindResourceA 00AA1433 50 push eax 00AA1434 53 push ebx 00AA1435 E8 4E3DFFFF call 00A95188 ; jmp 到 kernel32.LoadResource 00AA143A 50 push eax 00AA143B E8 503DFFFF call 00A95190 ; jmp 到 kernel32.SetHandleCount 00AA1440 50 push eax 00AA1441 53 push ebx 00AA1442 E8 693DFFFF call 00A951B0 ; jmp 到 user32.DialogBoxIndirectParamA 00AA1447 5B pop ebx 00AA1448 5D pop ebp 00AA1449 C2 1400 retn 0x14
删除FindResourceA断点,然后 在00AA1449 下断点。
F9运行程序,弹出的窗口点击play ,断在00AA1449。
再回溯。 00402EE7 |. E8 24250000 call Froggy.00405410 00402EEC |. 84C0 test al,al 00402EEE |. 55 push ebp 00402EEF |. 74 58 je short Froggy.00402F49 00402EF1 |. 8B15 1CEA4A00 mov edx,dword ptr ds:[0x4AEA1C] 00402EF7 |. 8BB424 AC0300>mov esi,dword ptr ss:[esp+0x3AC] 00402EFE |. 68 60494000 push Froggy.00404960 00402F03 |. 52 push edx ; ntdll.KiFastSystemCallRet 00402F04 |. 68 89000000 push 0x89 00402F09 |. 56 push esi ; Froggy.00400000 00402F0A |. FF15 ACB14900 call dword ptr ds:[0x49B1AC] 00402F10 |. 3D ED030000 cmp eax,0x3ED 00402F15 |. 74 07 je short Froggy.00402F1E 00402F17 |. 3D EE030000 cmp eax,0x3EE 00402F1C |. 75 5C jnz short Froggy.00402F7A 00402F1E |> 55 push ebp 00402F1F |. 8D8C24 940000>lea ecx,dword ptr ss:[esp+0x94] 00402F26 |. E8 35230000 call Froggy.00405260 00402F2B |. 84C0 test al,al 00402F2D |. 0F84 3D060000 je Froggy.00403570 00402F33 |> 55 /push ebp 00402F34 |. 8D8C24 940000>|lea ecx,dword ptr ss:[esp+0x94] 00402F3B |. E8 20230000 |call Froggy.00405260 00402F40 |. 84C0 |test al,al 00402F42 |.^ 75 EF \jnz short Froggy.00402F33 00402F44 |. E9 27060000 jmp Froggy.00403570 00402F49 |> A1 1CEA4A00 mov eax,dword ptr ds:[0x4AEA1C] 00402F4E |. 8BB424 AC0300>mov esi,dword ptr ss:[esp+0x3AC] 00402F55 |. 68 304B4000 push Froggy.00404B30 00402F5A |. 50 push eax 00402F5B |. 6A 67 push 0x67 00402F5D |. 56 push esi ; Froggy.00400000 00402F5E |. FF15 ACB14900 call dword ptr ds:[0x49B1AC] 00402F64 |. 3D ED030000 cmp eax,0x3ED
程序目前运行到的是00402F64,观察一下,00402F5E |. FF15 ACB14900 call dword ptr ds:[0x49B1AC]这里就是弹出未注册弹窗的地方。往上看看有没有跳转,刚好可以看到有一个跳转00402EEF |. /74 58 je short Froggy.00402F49,而且00402F49上面是一个jmp跳转。
所有猜测关键跳转在00402EEF,决定跳转的是00402EE7 |. E8 24250000 call Froggy.00405410和00402EEC |. 84C0 test al,al。直接进这个call ,00405410,改成mov al,1和retn,也就是返回值改成1。
额,确实猜对了,虽然吾并不太明白。
好了,晚安。
至于有没有暗装,吾不会玩这个游戏,自己试试,出问题也不要找我哟。
这玩意儿加壳,自己手动打补丁
延时1000 地址00405410 原始A1ACF04A0085C0 补丁B801000000C390
就这样,成品放出来也没有意义, 自己玩吧,都告诉你答案了,你不试试?
吾的口号:瞎蒙,瞎猜
注:若转载请注明大神论坛来源(本贴地址)与作者信息。
|