十二 发表于 2010-12-1 17:24:49

FXT FXTZ 部分解包过程

本帖最后由 十二 于 2010-12-1 21:10 编辑

FXT FXTZ 部分解包过程

0067D112 > $E8 658C0000   CALL th105.00685D7C------->入口点
F9 运行程序
进入FXT选择music room选项
切换回OD
------->setfilepointer下断
回到FXT选择音乐,程序被断下
0258FF14   0041B5CE/CALL 到 SetFilePointer 来自 th105.0041B5C8
0258FF18   00000544|hFile = 00000544 (window)
0258FF1C   03B96A79|OffsetLo = 3B96A79 (62483065.)
0258FF20   00000000|pOffsetHi = NULL
0258FF24   00000000\Origin = FILE_BEGIN
堆栈结构
清除断点Alt+F9返回程序领空
0041B59D|> \6A 00         PUSH 0                                 ; /hTemplateFile = NULL
0041B59F|.68 80000000   PUSH 80                                  ; |Attributes = NORMAL
0041B5A4|.6A 03         PUSH 3                                 ; |Mode = OPEN_EXISTING
0041B5A6|.6A 00         PUSH 0                                 ; |pSecurity = NULL
0041B5A8|.6A 01         PUSH 1                                 ; |ShareMode = FILE_SHARE_READ
0041B5AA|.68 00000080   PUSH 80000000                            ; |Access = GENERIC_READ
0041B5AF|.50            PUSH EAX                                 ; |FileName
0041B5B0|.FF15 6CC06A00 CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; \CreateFileA
0041B5B6|.8BF0          MOV ESI,EAX
0041B5B8|.83FE FF       CMP ESI,-1
0041B5BB|.74 1C         JE SHORT th105.0041B5D9
0041B5BD|.8B4D 10       MOV ECX,
0041B5C0|.8B11          MOV EDX,DWORD PTR DS:
0041B5C2|.6A 00         PUSH 0                                 ; /Origin = FILE_BEGIN
0041B5C4|.6A 00         PUSH 0                                 ; |pOffsetHi = NULL
0041B5C6|.52            PUSH EDX                                 ; |OffsetLo
0041B5C7|.56            PUSH ESI                                 ; |hFile
0041B5C8|.FF15 58C06A00 CALL DWORD PTR DS:[<&KERNEL32.SetFilePoi>; \SetFilePointer
0041B5CE|.8BC6          MOV EAX,ESI------->停在这里
在0041B59D下断,F9运行,再次选择音乐,程序被断。
0041B59D|> \6A 00         PUSH 0                                 ; /hTemplateFile = NULL------->停在这里
0041B59F|.68 80000000   PUSH 80                                  ; |Attributes = NORMAL
0041B5A4|.6A 03         PUSH 3                                 ; |Mode = OPEN_EXISTING
0041B5A6|.6A 00         PUSH 0                                 ; |pSecurity = NULL
0041B5A8|.6A 01         PUSH 1                                 ; |ShareMode = FILE_SHARE_READ
0041B5AA|.68 00000080   PUSH 80000000                            ; |Access = GENERIC_READ
0041B5AF|.50            PUSH EAX                                 ; |FileName------->文件指针
0041B5B0|.FF15 6CC06A00 CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; \CreateFileA------->打开文件
0041B5B6|.8BF0          MOV ESI,EAX------->返回的文件句柄送ESI
0041B5B8|.83FE FF       CMP ESI,-1------->比较ESI
0041B5BB|.74 1C         JE SHORT th105.0041B5D9------->等于则跳走
0041B5BD|.8B4D 10       MOV ECX,------->EBP+10送ECX
0041B5C0|.8B11          MOV EDX,DWORD PTR DS:------->ECX送EDX,为SetFilePointer偏移量做准备
0041B5C2|.6A 00         PUSH 0                                 ; /Origin = FILE_BEGIN------->文件末尾开始偏移
0041B5C4|.6A 00         PUSH 0                                 ; |pOffsetHi = NULL
0041B5C6|.52            PUSH EDX                                 ; |OffsetLo------->压入偏移量
0041B5C7|.56            PUSH ESI                                 ; |hFile------->压入文件句柄
0041B5C8|.FF15 58C06A00 CALL DWORD PTR DS:[<&KERNEL32.SetFilePoi>; \SetFilePointer
------->readfile下断
F9运行
7C80180E >6A 20         PUSH 20
7C801810    68 D89B807C   PUSH kernel32.7C809BD8
7C801815    E8 B10C0000   CALL kernel32.7C8024CB
7C80181A    33DB            XOR EBX,EBX
7C80181C    8B4D 14         MOV ECX,DWORD PTR SS:
7C80181F    3BCB            CMP ECX,EBX
7C801821    74 02         JE SHORT kernel32.7C801825
7C801823    8919            MOV DWORD PTR DS:,EBX
7C801825    64:A1 18000000MOV EAX,DWORD PTR FS:
7C80182B    8B40 30         MOV EAX,DWORD PTR DS:
7C80182E    8B7D 08         MOV EDI,DWORD PTR SS:
7C801831    83FF F4         CMP EDI,-0C
0258FE1C   0041B629/CALL 到 ReadFile 来自 th105.0041B623
0258FE20   00000544|hFile = 00000544 (window)------->读取文件的句柄
0258FE24   01CDD2D8|Buffer = 01CB2008------->缓冲区指针
0258FE28   00002134|BytesToRead = 2134 (8500.)------->被读取的大小
0258FE2C   01D0CC30|pBytesRead = 01D0CC30------->等同BytesToRead,等于BytesToRead的指针
0258FE30   00000000\pOverlapped = NULL
堆栈结构
内存窗口跟踪|Buffer = 01CB2008
ALt+F9返回
0041B61A   .6A 00         PUSH 0                                 ; /pOverlapped = NULL
0041B61C   .8D6E 08       LEA EBP,DWORD PTR DS:             ; |
0041B61F   .55            PUSH EBP                                 ; |pBytesRead
0041B620   .57            PUSH EDI                                 ; |BytesToRead               
0041B621   .53            PUSH EBX                                 ; |Buffer
0041B622   .50            PUSH EAX                                 ; |hFile
0041B623   .FF15 5CC06A00 CALL DWORD PTR DS:[<&KERNEL32.ReadFile>] ; \ReadFile
0041B629   .8B6D 00       MOV EBP,DWORD PTR SS:------->停在此处,在此下断循环F9即可得到解密的OGG音乐文件
/
01CB200870 58 58 6C 3F 3D 3F 3F 3F 3F 3F 3F 3F 3F C1 4ApXXl?=????????罦
01CB20183F 3F 3F 3F 3F 3F DE BD 0C B2 3E 21 3E 49 50 4D??????藿.?!>IPM
01CB20285D 56 4C 3F 3F 3F 3F 3D 7B 93 3F 3F 3F 3F 3F 3F]VL????={??????
01CB20383C 4E 3D 3F 3F 3F 3F 3F 87 3E 70 58 58 6C 3F 3F<N=??????pXXl??
01CB20483F 3F 3F 3F 3F 3F 3F 3F C1 4A 3F 3F 3E 3F 3F 3F????????罦??>???
01CB205892 5B 82 EE 2E 7D C0 C0 C0 C0 C0 C0 C0 C0 C0 C0抂傤.}览览览览览
01CB2068C0 C0 C0 C0 C0 C0 3C 49 50 4D 5D 56 4C 22 3F 3F览览览<IPM]VL"??
01CB20783F 67 56 4F 57 11 70 4D 58 1F 53 56 5D 69 50 4D?gVOWpMXSV]iPM
01CB20885D 56 4C 1F 76 1F 0D 0F 0F 0D 0F 08 0E 08 3D 3F]VLv..=?
                                                   
|Buffer = 01CB2008 被填充 SetFilePointer 的偏移内容
这里是解密过程看不看都无所谓在0041B629循环F9即可解密文件
0041B629   .8B6D 00       MOV EBP,DWORD PTR SS:------->EBP的堆栈赋值
0041B62C   .85ED          TEST EBP,EBP------->与测试
0041B62E   .75 09         JNZ SHORT th105.0041B639------->不等于则跳转
0041B630   .5F            POP EDI
0041B631   .5E            POP ESI
0041B632   .5D            POP EBP
0041B633   .32C0          XOR AL,AL
0041B635   .5B            POP EBX
0041B636   .C2 0800       RETN 8
0041B639   > \016E 14       ADD DWORD PTR DS:,EBP
0041B63C   .33C0          XOR EAX,EAX
0041B63E   .85FF          TEST EDI,EDI
0041B640   .76 0D         JBE SHORT th105.0041B64F
0041B642   >8A4E 18       MOV CL,BYTE PTR DS:---->\
0041B645   .300C18      XOR BYTE PTR DS:,CL   \
0041B648   .83C0 01       ADD EAX,1                        / 循环 解密01CB2008数据得到OGG音频文件
0041B64B   .3BC7          CMP EAX,EDI                     /
0041B64D   .^ 72 F3         JB SHORT th105.0041B642------->/
0041B64F   >5F            POP EDI
0041B650   .5E            POP ESI
0041B651   .5D            POP EBP
0041B652   .B0 01         MOV AL,1
0041B654   .5B            POP EBX
0041B655   .C2 0800       RETN 8------->返回

眠羽 发表于 2010-12-1 20:33:32

看不懂,感觉很厉害的样子。。。

小安 发表于 2010-12-1 20:56:34

理解不能,话说这个貌似可以修改游戏内容吧?很想自己做套SC出来...我自重...

十二 发表于 2010-12-1 21:01:21

只是部分解包,自己跟踪的。不完全。    不过似乎TAC上有封包程序了。详见二小姐那个补丁

bao_zi 发表于 2010-12-1 21:55:47

本帖最后由 bao_zi 于 2010-12-1 23:58 编辑

好触 能用来干嘛


问了下.....可以改资源神马的.....换歌么= =

lzz3012 发表于 2010-12-1 23:39:13

没有任何的编程知识的咱完全看不懂……泪目

红色不夜城 发表于 2010-12-2 15:56:14

对这类东西完全是一个小白,能写得详细一些么,比如解包常用工具之类的

十二 发表于 2010-12-2 16:10:21

回复 7# 红色不夜城


   网上没有什么FXTZ的解包文章,所以自己跟了一下。至于工具http://bbs.nyasama.com/viewthread.php?tid=342&extra=page%3D1看此贴吧有一个解包程序。封包暂时没找到。解包很简单只是一个与算法。

有能力可以自己写一个。我是不会 - = 只会跟踪一下 - =

香霖堂之王 发表于 2010-12-2 18:38:53

其實我一直在找封包的方法…………

十二 发表于 2010-12-2 18:51:46

可以用XOR BYTE PTR DS:,CL   把需要的文件还原成加密数据段,但不知道索引表怎么加密的- =
页: [1] 2
查看完整版本: FXT FXTZ 部分解包过程