吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11386|回复: 22
收起左侧

[原创] 钢琴英雄Synthesia逆向思路分享

  [复制链接]
zyjsuper 发表于 2020-1-18 21:40
本帖最后由 zyjsuper 于 2020-2-29 23:07 编辑

本文旨在分享思路,行文简单,大神飘过。

0x00:运行软件

如图:打开软件后,需要解锁才可以自由使用全部功能。此处联想到关键字“lock”,“unlock”,“unlocked”。

1.png


0x01:动态跟踪
使用x64dbg加载目标程序Synthesia.exe,点击运行按钮,一直来到Synthesia.exe程序模块,如图所示。
2.png

0x02:搜索关键字
在反汇编窗口,右击依次选择"搜索"-->"当前模块"-->"字符串",自动跳转到"引用"选项卡,在下方的"搜索"处填写"unlock".
如图所示:找到"Congratulations!  Synthesia is unlocked!"。


3.png


0x03:分析汇编代码
在上一步中直接双击字符串,会来到反汇编中字符串出现的位置,按"CTRL+K"跳转到上一级调用,按"CTRL+L"跳转到下一级调用。
如图所示:

4.png

汇编代码如下:
[Asm] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
0080952A | E8 D1FB0600              | call synthesia.879100                   |
0080952F | 8B5D 08                  | mov ebx,dword ptr ss:[ebp+8]            |
[url=tel:00809532]00809532[/url] | 8BF0                     | mov esi,eax                             | esi:EntryPoint
[url=tel:00809534]00809534[/url] | 8B3D 90F3B500            | mov edi,dword ptr ds:[<&GetDlgItem>]    | edi:EntryPoint
0080953A | B8 E4F0B600              | mov eax,synthesia.B6F0E4                | B6F0E4:L"Synthesia is NOT unlocked"
0080953F | 83FE 01                  | cmp esi,1                               | esi:EntryPoint
[url=tel:00809542]00809542[/url] | 8975 FC                  | mov dword ptr ss:[ebp-4],esi            | esi:EntryPoint
[url=tel:00809545]00809545[/url] | B9 90F0B600              | mov ecx,synthesia.B6F090                | ecx:EntryPoint, B6F090:L"Congratulations!  Synthesia is unlocked!"



关注cmp esi,1这一段,向上撸代码,esi的值来自mov esi,eax即eax,而eax的值来自synthesia.879100这个函数的返回值,由此我们可以得出结论,
如果当synthesia.879100的返回值为1时,程序就会出现"Congratulations!  Synthesia is unlocked!"的提示。


0x04:修改汇编代码
按上一步的分析结果,将synthesia.879100这个函数的返回值修改为1,就会解锁程序。
在call synthesia.879100这个位置按回车键即可来到这个函数的主体,如图所示:


5.png

设计到返回值部分的汇编代码如下:
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
0087914B | 803D 3A7DC400 00         | cmp byte ptr ds:[C47D3A],0              |
[url=tel:00879152]00879152[/url] | 74 0D                    | je synthesia.879161                     |
[url=tel:00879154]00879154[/url] | 837E 08 01               | cmp dword ptr ds:[esi+8],1              |
[url=tel:00879158]00879158[/url] | 75 07                    | jne synthesia.879161                    |
0087915A | B8 [url=tel:01000000]01000000[/url]              | mov eax,1                               |
0087915F | 5E                       | pop esi                                 | esi:EntryPoint
[url=tel:00879160]00879160[/url] | C3                       | ret                                     |
[url=tel:00879161]00879161[/url] | 33C0                     | xor eax,eax                             |
[url=tel:00879163]00879163[/url] | 5E                       | pop esi                                 | esi:EntryPoint
[url=tel:00879164]00879164[/url] | C3                       | ret                                     |



这段函数主体有两个返回值,mov eax,1和xor eax,eax 两个,即1或者0.
我修改返回值的方法是将xor eax,eax修改为mov eax,1,即两个返回值都为1.
如图所示:

6.png


0x05:编写patch脚本
python的十六进制patch方法最为直接暴力,脚本如下:
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env python3
# coding=GBK
# Created at 2019/11/9 19:52
 
from __future__ import print_function
import ctypes, sys
import os,time
 
binpath= r"C:\Program Files (x86)\Synthesia"
filename = "Synthesia.exe"
backup_path = r"c:\backup"
 
if(os.path.isdir(backup_path)):
    print("Backup path already exsit!")
else:
    os.mkdir(backup_path)
 
 
def backfiles():
    os.system("copy " + filename + " " + backup_path)
    print("File has been backuped to " + backup_path)
 
 
#patch文件的偏移位置。
def patch_exe():
    with open (backup_path+"\\" + filename,"rb") as fr:
        data = fr.read()
        data = data.replace(b'\x64\xA1\x2C\x00\x00\x00\x56\x8B\xF1', b'\xB8\x01\x00\x00\x00\xC3\x56\x8B\xF1')
        with open(binpath + '\\' + filename, "wb") as fw:
            fw.write(data)
            print(filename + " has been patached successfully!")
 
#获取administrator权限
def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False
 
if is_admin():
    os.chdir(binpath)
    try:
        print("-------------First Step--------------\n")
        backfiles()
        time.sleep(3)
    except:
        print("Error occurred in backup procedure!")
    try:
        print("-------------Second Step--------------\n")
        patch_exe()
        time.sleep(3)
    except:
        print("Error occurred in patch procedure!\n")
else:
    if sys.version_info[0] == 3:
        ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)   #python3使用的函数及参数
    else:
        ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(__file__), None, 1)   #python2使用的函数及参数





免费评分

参与人数 12威望 +1 吾爱币 +17 热心值 +11 收起 理由
cxyelu + 1 + 1 自行尝试一番,正好需要
Rapides + 1 + 1 谢谢@Thanks!
有名字的过客 + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!
yanqin + 1 + 1 我很赞同!
resu + 1 + 1 用心讨论,共获提升!
sunnylds7 + 1 + 1 热心回复!
Hmily + 1 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
-LX + 1 + 1 谢谢@Thanks!
jamesmeng + 1 + 1 用心讨论,共获提升!
ma4907758 + 1 谢谢@Thanks!
vethenc + 1 + 1 谢谢@Thanks!
FleTime + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

cxyelu 发表于 2020-12-29 11:10
再简单点,把

0087914B | 803D 3A7DC400 00         | cmp byte ptr ds:[C47D3A],0              |
00879152 | 74 0D                    | je synthesia.879161                     |
00879154 | 837E 08 01               | cmp dword ptr ds:[esi+8],1              |
00879158 | 75 07                    | jne synthesia.879161                    |
0087915A | B8 01000000              | mov eax,1                               |
0087915F | 5E                       | pop esi                                 | esi:EntryPoint
00879160 | C3                       | ret                                     |
00879161 | 33C0                     | xor eax,eax                             |
00879163 | 5E                       | pop esi                                 | esi:EntryPoint
00879164 | C3                       | ret                                     |

里面的je synthesia.879161和 jne synthesia.879161都nop掉,解锁的时候输入任意字符就行了
yean 发表于 2021-4-19 04:19
终于完成了一次操作。原来只完成4个步骤是不行的,到处看看,终于把第5步弄出来了。
第5步不知道是不是x64dbg这个软件版本不一样的原因,右键补丁后,选择修补文件,这时我把文件名多加了一个数字,这样方便再次修改。
再次打开那个被我修改过的exe运行,结果没有弹出那个试用的窗口了。
泥泥的泥泥 发表于 2020-1-19 00:00
qqvcd010 发表于 2020-1-19 00:34
感谢分享
ironmaneva 发表于 2020-1-19 09:15
钢琴英雄 是要连专用 钢琴键盘?
 楼主| zyjsuper 发表于 2020-1-19 09:28
ironmaneva 发表于 2020-1-19 09:15
钢琴英雄 是要连专用 钢琴键盘?

我也没有专业的设备,应该可以连midi的吧。
hmlhao 发表于 2020-1-19 09:33
感谢楼主分享。。。。。。。。。
wapjltb 发表于 2020-1-19 21:18
感恩分享思路
aassdd2003 发表于 2020-1-20 13:25
感谢分享
yanqin 发表于 2020-3-1 07:45
感恩分享思路!
resu 发表于 2020-4-13 10:48
依葫芦画了个瓢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-5-29 19:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表