宝峰科技

 找回密码
 注册

QQ登录

只需一步,快速开始

智能终端设备维修查询系统注册会员邮箱认证须知!
查看: 2538|回复: 0

[原创] 某游戏资源解密

[复制链接]

该用户从未签到

保护伞 发表于 2010-10-30 17:24:19 | 显示全部楼层 |阅读模式

欢迎您注册加入!这里有您将更精采!

您需要 登录 才可以下载或查看,没有账号?注册

x
第一次写文章,写的不好,见谅
因为我是做**的,接触的东西教多,杂七杂八,都是半通水,
来这里也那么久了,没发过什么实质性的文章,
在这里先介绍下,如何解密游戏资源,
因为很多游戏,都是用一些工具吧资源加密了,我们看不到文件里面的内容,但是,解密以后,就如同脱了衣服的娘们站在你面前,想怎么看就怎么看,
废话不多说了,下面进入正题,
需要工具:OllyDebug
               game.exe(游戏的主程序,我在这里就统称为game)
              optiot.ini(要解密的文件)
————————————————————————————————————————————————————————————
用od加载game.exe  
到文件头:
05E69B33 >  E8 00000000     call game.05E69B38
05E69B38    60              pushad
05E69B39    E8 4F000000     call game.05E69B8D
05E69B3E    F9              stc
05E69B3F    16              push ss
05E69B40    FB              sti
05E69B41    B8 C122F8EF     mov eax,EFF822C1
05E69B46    37              aaa

因为主程式是加了壳的,不需要脱也能解密,所以无视壳
下CreateFileA断点 F9运行程序后断下,
右下脚:
0012F8BC   05E6F67D  /CALL 到 CreateFileA 来自 game.05E6F677
0012F8C0   003B2528  |FileName = "E:\P\GAME.EXE"
0012F8C4   80000000  |Access = GENERIC_READ
0012F8C8   00000001  |ShareMode = FILE_SHARE_READ
0012F8CC   00000000  |pSecurity = NULL
0012F8D0   00000003  |Mode = OPEN_EXISTING
0012F8D4   00000000  |Attributes = 0
0012F8D8   00000000  \hTemplateFile = NULL

因为他这次是加载game的,所以无视,
在次按F9后断下
0012FC6C   05E74623  /CALL 到 CreateFileA 来自 game.05E7461D
0012FC70   063B4210  |FileName = "E:\P\game.exe-up.txt"
0012FC74   40000000  |Access = GENERIC_WRITE
0012FC78   00000001  |ShareMode = FILE_SHARE_READ
0012FC7C   00000000  |pSecurity = NULL
0012FC80   00000002  |Mode = CREATE_ALWAYS
0012FC84   00000080  |Attributes = NORMAL
0012FC88   00000000  \hTemplateFile = NULL

现在已经开始读文件了,但是,不是我们需要解密的文件
在次F9,断下

0012F5DC   05E772F4   /CALL 到 CreateFileA 来自 game.05E772EE
0012F5E0   066E6F98   |FileName = "E:\P\optiot.ini"
0012F5E4   80000000   |Access = GENERIC_READ
0012F5E8   00000003   |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0012F5EC   0012F630   |pSecurity = 0012F630
0012F5F0   00000003   |Mode = OPEN_EXISTING
0012F5F4   00000080   |Attributes = NORMAL
0012F5F8   00000000   \hTemplateFile = NULL

看到fileName=optiot.ini
取消断点,CTRL+F9
返回上层,
05E772D9    FF75 20         push dword ptr ss:[ebp+20]
05E772DC    FF75 1C         push dword ptr ss:[ebp+1C]
05E772DF    FF75 18         push dword ptr ss:[ebp+18]
05E772E2    FF75 14         push dword ptr ss:[ebp+14]
05E772E5    FF75 10         push dword ptr ss:[ebp+10]
05E772E8    FF75 0C         push dword ptr ss:[ebp+C]
05E772EB    FF75 08         push dword ptr ss:[ebp+8]
05E772EE    FF15 A8D6E705   call dword ptr ds:[5E7D6A8]              ; kernel32.CreateFileA
这个是调用的代码,不是我们需要的
在次CTRL+F9
0040BB0F    33F6            xor esi,esi
0040BB11    0FB64424 24     movzx eax,byte ptr ss:[esp+24]
0040BB16    8B4C24 1C       mov ecx,dword ptr ss:[esp+1C]
0040BB1A    50              push eax
0040BB1B    51              push ecx
0040BB1C    8BCE            mov ecx,esi
0040BB1E    C74424 14 FFFFF>mov dword ptr ss:[esp+14],-1
0040BB26    E8 559F0100     call game.00425A80
0040BB2B    85C0            test eax,eax

F8往下跟N次………………………………

004ADED3    52              push edx      
004ADED4    50              push eax
004ADED5    8BCD            mov ecx,ebp
004ADED7    E8 84F8FFFF     call game.004AD760  这里就是解密的CALL

你问我为什么呢?我也是根据经验,然后看寄存器的地址,
内存数据     只要觉得可以的地址,就看内存数据的16进制,是否和文件的十六进制相同,如果一样的话,恭喜你,解密CALL里你不远啦!

004ADED7    E8 84F8FFFF     call game.004AD760  这里就是解密的CALL
F7跟进,
004AD760    64:A1 00000000  mov eax,dword ptr fs:[0]
004AD766    6A FF           push -1
004AD768    68 69ED7100     push game.0071ED69
004AD76D    50              push eax
004AD76E    64:8925 0000000>mov dword ptr fs:[0],esp
004AD775    83EC 58         sub esp,58
004AD778    55              push ebp
004AD779    8BE9            mov ebp,ecx
004AD77B    8A45 04         mov al,byte ptr ss:[ebp+4]
004AD77E    84C0            test al,al
004AD780    75 31           jnz short game.004AD7B3
004AD782    A1 7CD68100     mov eax,dword ptr ds:[81D67C]
004AD787    50              push eax
004AD788    8D4C24 1C       lea ecx,dword ptr ss:[esp+1C]
004AD78C    FF15 98A67800   call dword ptr ds:[78A698]               ; msvcp71.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >
004AD792    50              push eax
004AD793    8D4C24 38       lea ecx,dword ptr ss:[esp+38]
004AD797    C74424 68 00000>mov dword ptr ss:[esp+68],0
004AD79F    E8 0CF4FFFF     call game.004ACBB0
004AD7A4    68 A4B67D00     push game.007DB6A4
004AD7A9    8D4C24 38       lea ecx,dword ptr ss:[esp+38]
004AD7AD    51              push ecx
004AD7AE    E8 53212300     call game.006DF906                       ; jmp 到 msvcr71._CxxThrowException
004AD7B3    8B4424 6C       mov eax,dword ptr ss:[esp+6C]
004AD7B7    0FB608          movzx ecx,byte ptr ds:[eax]
004AD7BA    0FB650 01       movzx edx,byte ptr ds:[eax+1]
004AD7BE    C1E2 10         shl edx,10
004AD7C1    C1E1 18         shl ecx,18
004AD7C4    0BCA            or ecx,edx
004AD7C6    33D2            xor edx,edx
004AD7C8    40              inc eax
004AD7C9    8A70 01         mov dh,byte ptr ds:[eax+1]
004AD7CC    40              inc eax
004AD7CD    53              push ebx
004AD7CE    8B9D F8010000   mov ebx,dword ptr ss:[ebp+1F8]
004AD7D4    56              push esi
004AD7D5    57              push edi
004AD7D6    0BCA            or ecx,edx
004AD7D8    0FB650 01       movzx edx,byte ptr ds:[eax+1]
004AD7DC    0BCA            or ecx,edx
004AD7DE    40              inc eax
004AD7DF    0FB670 01       movzx esi,byte ptr ds:[eax+1]
004AD7E3    C1E6 18         shl esi,18
004AD7E6    33CB            xor ecx,ebx
004AD7E8    40              inc eax
004AD7E9    0FB650 01       movzx edx,byte ptr ds:[eax+1]
004AD7ED    C1E2 10         shl edx,10
004AD7F0    0BF2            or esi,edx
004AD7F2    40              inc eax
004AD7F3    33D2            xor edx,edx
004AD7F5    8A70 01         mov dh,byte ptr ds:[eax+1]
004AD7F8    8B9D FC010000   mov ebx,dword ptr ss:[ebp+1FC]
004AD7FE    40              inc eax
004AD7FF    894C24 18       mov dword ptr ss:[esp+18],ecx
004AD803    0BF2            or esi,edx
004AD805    0FB650 01       movzx edx,byte ptr ds:[eax+1]
004AD809    0BF2            or esi,edx
004AD80B    33F3            xor esi,ebx
004AD80D    40              inc eax
004AD80E    0FB650 01       movzx edx,byte ptr ds:[eax+1]
004AD812    40              inc eax
004AD813    C1E2 18         shl edx,18
004AD816    897424 78       mov dword ptr ss:[esp+78],esi
004AD81A    0FB670 01       movzx esi,byte ptr ds:[eax+1]
004AD81E    C1E6 10         shl esi,10
004AD821    0BD6            or edx,esi
004AD823    40              inc eax
004AD824    33DB            xor ebx,ebx
004AD826    8A78 01         mov bh,byte ptr ds:[eax+1]
004AD829    40              inc eax
004AD82A    0FB670 01       movzx esi,byte ptr ds:[eax+1]
004AD82E    0BD3            or edx,ebx
004AD830    40              inc eax
004AD831    0BD6            or edx,esi
004AD833    3395 00020000   xor edx,dword ptr ss:[ebp+200]
004AD839    0FB670 01       movzx esi,byte ptr ds:[eax+1]
004AD83D    40              inc eax
004AD83E    0FB678 01       movzx edi,byte ptr ds:[eax+1]
004AD842    C1E6 18         shl esi,18
004AD845    40              inc eax
004AD846    C1E7 10         shl edi,10
004AD849    0BF7            or esi,edi
004AD84B    33DB            xor ebx,ebx
004AD84D    8A78 01         mov bh,byte ptr ds:[eax+1]
004AD850    40              inc eax
004AD851    895424 14       mov dword ptr ss:[esp+14],edx
004AD855    8A58 01         mov bl,byte ptr ds:[eax+1]
004AD858    0BDE            or ebx,esi
004AD85A    339D 04020000   xor ebx,dword ptr ss:[ebp+204]
004AD860    8BB5 D8030000   mov esi,dword ptr ss:[ebp+3D8]
004AD866    83FE 01         cmp esi,1
004AD869    895C24 10       mov dword ptr ss:[esp+10],ebx
004AD86D    897424 20       mov dword ptr ss:[esp+20],esi
004AD871    0F8E 1C010000   jle game.004AD993
004AD877    4E              dec esi
004AD878    8DBD 20020000   lea edi,dword ptr ss:[ebp+220]
004AD87E    897424 1C       mov dword ptr ss:[esp+1C],esi
004AD882    EB 0C           jmp short game.004AD890
004AD884    8DA424 00000000 lea esp,dword ptr ss:[esp]
004AD88B    EB 03           jmp short game.004AD890
004AD88D    8D49 00         lea ecx,dword ptr ds:[ecx]
004AD890    0FB67424 7B     movzx esi,byte ptr ss:[esp+7B]
004AD895    0FB6C7          movzx eax,bh
004AD898    8B0485 08367900 mov eax,dword ptr ds:[eax*4+793608]
004AD89F    3304B5 082E7900 xor eax,dword ptr ds:[esi*4+792E08]
004AD8A6    0FB67424 1A     movzx esi,byte ptr ss:[esp+1A]
004AD8AB    3304B5 08327900 xor eax,dword ptr ds:[esi*4+793208]
004AD8B2    81E2 FF000000   and edx,0FF
004AD8B8    8B3495 083A7900 mov esi,dword ptr ds:[edx*4+793A08]
004AD8BF    8B57 FC         mov edx,dword ptr ds:[edi-4]
004AD8C2    33C6            xor eax,esi
004AD8C4    0FB67424 7A     movzx esi,byte ptr ss:[esp+7A]
004AD8C9    33C2            xor eax,edx
004AD8CB    0FB65424 17     movzx edx,byte ptr ss:[esp+17]
004AD8D0    8B1495 082E7900 mov edx,dword ptr ds:[edx*4+792E08]
004AD8D7    3314B5 08327900 xor edx,dword ptr ds:[esi*4+793208]
004AD8DE    0FB6F5          movzx esi,ch
004AD8E1    3314B5 08367900 xor edx,dword ptr ds:[esi*4+793608]
004AD8E8    81E3 FF000000   and ebx,0FF
004AD8EE    8B349D 083A7900 mov esi,dword ptr ds:[ebx*4+793A08]
004AD8F5    0FB65C24 16     movzx ebx,byte ptr ss:[esp+16]
004AD8FA    33D6            xor edx,esi
004AD8FC    3317            xor edx,dword ptr ds:[edi]
004AD8FE    0FB67424 13     movzx esi,byte ptr ss:[esp+13]
004AD903    8B34B5 082E7900 mov esi,dword ptr ds:[esi*4+792E08]
004AD90A    33349D 08327900 xor esi,dword ptr ds:[ebx*4+793208]
004AD911    0FB65C24 79     movzx ebx,byte ptr ss:[esp+79]
004AD916    33349D 08367900 xor esi,dword ptr ds:[ebx*4+793608]
004AD91D    81E1 FF000000   and ecx,0FF
004AD923    8B1C8D 083A7900 mov ebx,dword ptr ds:[ecx*4+793A08]
004AD92A    8B4F 04         mov ecx,dword ptr ds:[edi+4]
004AD92D    33F3            xor esi,ebx
004AD92F    0FB65C24 15     movzx ebx,byte ptr ss:[esp+15]
004AD934    33F1            xor esi,ecx
004AD936    0FB64C24 12     movzx ecx,byte ptr ss:[esp+12]
004AD93B    8B0C8D 08327900 mov ecx,dword ptr ds:[ecx*4+793208]
004AD942    330C9D 08367900 xor ecx,dword ptr ds:[ebx*4+793608]
004AD949    0FB65C24 1B     movzx ebx,byte ptr ss:[esp+1B]
004AD94E    330C9D 082E7900 xor ecx,dword ptr ds:[ebx*4+792E08]
004AD955    8B5C24 78       mov ebx,dword ptr ss:[esp+78]
004AD959    81E3 FF000000   and ebx,0FF
004AD95F    330C9D 083A7900 xor ecx,dword ptr ds:[ebx*4+793A08]
004AD966    8B5F F8         mov ebx,dword ptr ds:[edi-8]
004AD969    894424 78       mov dword ptr ss:[esp+78],eax
004AD96D    8B4424 1C       mov eax,dword ptr ss:[esp+1C]
004AD971    33CB            xor ecx,ebx
004AD973    83C7 20         add edi,20
004AD976    8BDE            mov ebx,esi
004AD978    48              dec eax
004AD979    894C24 18       mov dword ptr ss:[esp+18],ecx
004AD97D    895424 14       mov dword ptr ss:[esp+14],edx
004AD981    895C24 10       mov dword ptr ss:[esp+10],ebx
004AD985    894424 1C       mov dword ptr ss:[esp+1C],eax
004AD989  ^ 0F85 01FFFFFF   jnz game.004AD890
004AD98F    8B7424 20       mov esi,dword ptr ss:[esp+20]
004AD993    8B4424 18       mov eax,dword ptr ss:[esp+18]
004AD997    C1E6 05         shl esi,5
004AD99A    8BBC2E F8010000 mov edi,dword ptr ds:[esi+ebp+1F8]
004AD9A1    8BDF            mov ebx,edi
004AD9A3    C1FB 18         sar ebx,18
004AD9A6    8DB42E F8010000 lea esi,dword ptr ds:[esi+ebp+1F8]
004AD9AD    897C24 1C       mov dword ptr ss:[esp+1C],edi
004AD9B1    0FB67C24 12     movzx edi,byte ptr ss:[esp+12]
004AD9B6    C1E8 18         shr eax,18
004AD9B9    3298 081D7900   xor bl,byte ptr ds:[eax+791D08]
004AD9BF    8B4424 7C       mov eax,dword ptr ss:[esp+7C]
004AD9C3    8818            mov byte ptr ds:[eax],bl
004AD9C5    8B5C24 1C       mov ebx,dword ptr ss:[esp+1C]
004AD9C9    C1FB 10         sar ebx,10
004AD9CC    329F 081D7900   xor bl,byte ptr ds:[edi+791D08]
004AD9D2    0FB6FE          movzx edi,dh
004AD9D5    8858 01         mov byte ptr ds:[eax+1],bl
004AD9D8    8B5424 1C       mov edx,dword ptr ss:[esp+1C]
004AD9DC    8BDA            mov ebx,edx
004AD9DE    C1FB 08         sar ebx,8
004AD9E1    329F 081D7900   xor bl,byte ptr ds:[edi+791D08]
004AD9E7    8B7C24 78       mov edi,dword ptr ss:[esp+78]
004AD9EB    8858 02         mov byte ptr ds:[eax+2],bl
004AD9EE    81E7 FF000000   and edi,0FF
004AD9F4    8A9F 081D7900   mov bl,byte ptr ds:[edi+791D08]
004AD9FA    32DA            xor bl,dl
004AD9FC    8858 03         mov byte ptr ds:[eax+3],bl
004AD9FF    8B56 04         mov edx,dword ptr ds:[esi+4]
004ADA02    0FB67C24 7B     movzx edi,byte ptr ss:[esp+7B]
004ADA07    8BDA            mov ebx,edx
004ADA09    C1FB 18         sar ebx,18
004ADA0C    329F 081D7900   xor bl,byte ptr ds:[edi+791D08]
004ADA12    0FB67C24 1A     movzx edi,byte ptr ss:[esp+1A]
004ADA17    8858 04         mov byte ptr ds:[eax+4],bl
004ADA1A    8BDA            mov ebx,edx
004ADA1C    C1FB 10         sar ebx,10
004ADA1F    329F 081D7900   xor bl,byte ptr ds:[edi+791D08]
004ADA25    0FB67C24 11     movzx edi,byte ptr ss:[esp+11]
004ADA2A    8858 05         mov byte ptr ds:[eax+5],bl
004ADA2D    8BDA            mov ebx,edx
004ADA2F    C1FB 08         sar ebx,8
004ADA32    329F 081D7900   xor bl,byte ptr ds:[edi+791D08]
004ADA38    8B7C24 14       mov edi,dword ptr ss:[esp+14]
004ADA3C    8858 06         mov byte ptr ds:[eax+6],bl
004ADA3F    81E7 FF000000   and edi,0FF
004ADA45    8A9F 081D7900   mov bl,byte ptr ds:[edi+791D08]
004ADA4B    0FB67C24 17     movzx edi,byte ptr ss:[esp+17]
004ADA50    32DA            xor bl,dl
004ADA52    8858 07         mov byte ptr ds:[eax+7],bl
004ADA55    8B56 08         mov edx,dword ptr ds:[esi+8]
004ADA58    8BDA            mov ebx,edx
004ADA5A    C1FB 18         sar ebx,18
004ADA5D    329F 081D7900   xor bl,byte ptr ds:[edi+791D08]
004ADA63    0FB67C24 7A     movzx edi,byte ptr ss:[esp+7A]
004ADA68    8858 08         mov byte ptr ds:[eax+8],bl
004ADA6B    8BDA            mov ebx,edx
004ADA6D    C1FB 10         sar ebx,10
004ADA70    329F 081D7900   xor bl,byte ptr ds:[edi+791D08]
004ADA76    0FB6FD          movzx edi,ch
004ADA79    8858 09         mov byte ptr ds:[eax+9],bl
004ADA7C    8BDA            mov ebx,edx
004ADA7E    C1FB 08         sar ebx,8
004ADA81    329F 081D7900   xor bl,byte ptr ds:[edi+791D08]
004ADA87    8B7C24 10       mov edi,dword ptr ss:[esp+10]
004ADA8B    8858 0A         mov byte ptr ds:[eax+A],bl
004ADA8E    81E7 FF000000   and edi,0FF
004ADA94    8A9F 081D7900   mov bl,byte ptr ds:[edi+791D08]
004ADA9A    32DA            xor bl,dl
004ADA9C    8858 0B         mov byte ptr ds:[eax+B],bl
004ADA9F    8B56 0C         mov edx,dword ptr ds:[esi+C]
004ADAA2    0FB67424 13     movzx esi,byte ptr ss:[esp+13]
004ADAA7    8BDA            mov ebx,edx
004ADAA9    C1FB 18         sar ebx,18
004ADAAC    329E 081D7900   xor bl,byte ptr ds:[esi+791D08]
004ADAB2    0FB67424 16     movzx esi,byte ptr ss:[esp+16]
004ADAB7    8858 0C         mov byte ptr ds:[eax+C],bl
004ADABA    8BDA            mov ebx,edx
004ADABC    C1FB 10         sar ebx,10
004ADABF    329E 081D7900   xor bl,byte ptr ds:[esi+791D08]
004ADAC5    0FB67424 79     movzx esi,byte ptr ss:[esp+79]
004ADACA    8858 0D         mov byte ptr ds:[eax+D],bl
004ADACD    8BDA            mov ebx,edx
004ADACF    C1FB 08         sar ebx,8
004ADAD2    329E 081D7900   xor bl,byte ptr ds:[esi+791D08]
004ADAD8    81E1 FF000000   and ecx,0FF
004ADADE    8858 0E         mov byte ptr ds:[eax+E],bl
004ADAE1    8A89 081D7900   mov cl,byte ptr ds:[ecx+791D08]
004ADAE7    5F              pop edi
004ADAE8    32CA            xor cl,dl
004ADAEA    5E              pop esi
004ADAEB    8848 0F         mov byte ptr ds:[eax+F],cl
004ADAEE    8B4C24 60       mov ecx,dword ptr ss:[esp+60]
004ADAF2    5B              pop ebx
004ADAF3    5D              pop ebp
004ADAF4    64:890D 0000000>mov dword ptr fs:[0],ecx
004ADAFB    83C4 64         add esp,64
004ADAFE    C2 0800         retn 8

看,是不是很眼熟呢?没错,这个就是解密的汇编码~
F8一直往下走,你就会看到,他是怎么解密的了,
剩下的就是根据汇编码来解密了,
但是,因为新手门都会觉得,mov ecx,dword ptr ds:[ecx*4+793208]
这样的地址不是很奇怪吗?怎么会有*的,
其实也不奇怪,因为游戏在解密的时候,他会用key生成一段内存代码,
而ecx*4+793208这里的793208恰恰指向编码地址,所以他会根据xor的结果取出对应的值
ecx*4+793208 这里只能真对我解密的游戏GAME,每个游戏的解密方式都不一样,很多游戏,都很容易,但是很多很难,

到此结束!!新手建议,尽量把汇编学懂,分析游戏封包什么的,都会很容易

评分

参与人数 1威望 +10 收起 理由
潇潇 + 10 难得你写这样的文章,不错加油

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

免责声明

本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件编程开发或软件的逆向分析文章、逆向分析视频、补丁、注册机和注册信息,仅限用于学习和研究软件安全的目的。全体用户必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习编程开发技术或逆向分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识。所以您如果喜欢某程序,请购买注册正版软件,获得正版优质服务!不得将上述内容私自传播、销售或者用于商业用途!否则,一切后果请用户自负!

QQ|Archiver|手机版|小黑屋|联系我们|宝峰科技 ( 滇公网安备 53050202000040号 | 滇ICP备09007156号-2 )

Copyright © 2001-2023 Discuz! Team. GMT+8, 2024-12-22 15:37 , File On Powered by Discuz! X3.49

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