剑侠精灵破解全过程(1)
在网上找了N久的剑侠精灵的免费版,一直没看见一个正主,看来金山对大家还是有一定作用的,今天开始对金山剑侠游戏自己的外挂开始破解,希望在这个过程中能提高自己的能力.
先来看看剑侠精灵的是用什么做壳,首先重要查壳软件出场了
PEiD_095_20060510_WestKing_HA.exe (呵呵,我一般都用他了)
软件介绍
PEiD 可以探测大多数的 PE 文件封包器、加密器和编译器。当前可以探测 600 多个不同签名。
PEiD 是最强大的一个查壳工具。
运行PEiD把要脱壳的 jxjl.1.53\jl_f.exe (免费区的启动程序) 托入PEiD中
ASProtect 2.1x SKE -> Alexey Solodovnikov 显示为此壳 点->插件 让peid找到ASProtect 2.1x 壳的具体版本
Version: ASProtect 2.11 SKE build 03.13 Release [1] 查到了
----------------------------------------------------------------------------------------------------------------------
用OD载入程序,忽略除内存访问异常 与 同样忽略异常范围,其余全打钩,运行VolX提供强大的脚本,几步到达OEP
004256A7 6A 60 PUSH 60 OEP
004256A9 68 B8C94400 PUSH OnlyMe.0044C9B8
004256AE E8 61040000 CALL OnlyMe.00425B14
004256B3 BF 94000000 MOV EDI,94
004256B8 8BC7 MOV EAX,EDI
004256BA E8 A1040000 CALL OnlyMe.00425B60
在这里脱壳后,用IRCOMPAT进行修复,修复完毕(RVA:256A7)
在这里看一下内存镜像
Memory map, 项目 23
地址=00401000
大小=00033000 (208896.)
属主=OnlyMe 00400000
区段=
包含=代码
类型=映像 01001002
访问=R
初始访问=RWE
OD忽略除内存访问异常 与 同样忽略异常范围,其余全打钩!!SHIFT+F9
好像是三十二次 下断 异常你们慢慢看.机子不同次数可能不一样的.
OD载入:
00401000 > 68 01004A00 PUSH OnlyMe.004A0001
00401005 E8 01000000 CALL OnlyMe.0040100B
0040100A C3 RETN
0040100B C3 RETN
第一次异常停在这里:
00AE0781 C601 BE MOV BYTE PTR DS:[ECX],0BE
00AE0784 64:97 XCHG EAX,EDI ; 多余前缀
00AE0786 41 INC ECX
00AE0787 F3: PREFIX REP: ; 多余前缀
00AE0788 96 XCHG EAX,ESI
00AE0789 629D 8467648F BOUND EBX,QWORD PTR SS:[EBP+8F646784]
00AE078F 06 PUSH ES
00AE0790 0000 ADD BYTE PTR DS:[EAX],AL
00AE0792 83C4 04 ADD ESP,4
00AE0795 83E9 BF SUB ECX,-41
00AE0798 B9 B6BC4800 MOV ECX,48BCB6
00AE079D 59 POP ECX
00AE079E 68 E4DDAB00 PUSH 0ABDDE4
00AE07A3 68 0808AE00 PUSH 0AE0808
00AE07A8 68 5CE9AD00 PUSH 0ADE95C
00AE07AD 68 58F5AD00 PUSH 0ADF558
00AE07B2 68 68E2AD00 PUSH 0ADE268
00AE07B7 68 98D3AD00 PUSH 0ADD398
00AE07BC 68 10FCAD00 PUSH 0ADFC10
00AE07C1 C3 RETN
第二次:
00ADFDEF C601 DE MOV BYTE PTR DS:[ECX],0DE
00ADFDF2 17 POP SS ; 段寄存器修饰
00ADFDF3 40 INC EAX
00ADFDF4 ^ 74 A3 JE SHORT 00ADFD99
00AE0023 0156 00 ADD DWORD PTR DS:[ESI],EDX 第三次
00AE0183 891F MOV DWORD PTR DS:[EDI],EBX 第四次
00ADDAF4 893B MOV DWORD PTR DS:[EBX],EDI 第五次
00ADDB8A C700 B74F36E6 MOV DWORD PTR DS:[EAX],E6364FB7 第六次
00ADDCB4 C601 7E MOV BYTE PTR DS:[ECX],7E 第七次
00ADDF3F 0156 00 ADD DWORD PTR DS:[ESI],EDX 第八次
=======================================================================
最后一次:
00ADFAA5 C700 EFCA5C85 MOV DWORD PTR DS:[EAX],855CCAEF
00ADFAAB 67:64:8F06 0000 POP DWORD PTR FS:[0]
00ADFAB1 83C4 04 ADD ESP,4
00ADFAB4 83E8 AF SUB EAX,-51
00ADFAB7 83C8 4B OR EAX,4B
00ADFABA 58 POP EAX
00ADFABB A1 0C38AE00 MOV EAX,DWORD PTR DS:[AE380C]
00ADFAC0 8B00 MOV EAX,DWORD PTR DS:[EAX]
00ADFAC2 8B68 1C MOV EBP,DWORD PTR DS:[EAX+1C]
00ADFAC5 A1 0C38AE00 MOV EAX,DWORD PTR DS:[AE380C]
00ADFACA 8B00 MOV EAX,DWORD PTR DS:[EAX]
00ADFACC 8B00 MOV EAX,DWORD PTR DS:[EAX]
00ADFACE 894424 04 MOV DWORD PTR SS:[ESP+4],EAX
00ADFAD2 A1 0C38AE00 MOV EAX,DWORD PTR DS:[AE380C]
00ADFAD7 8B00 MOV EAX,DWORD PTR DS:[EAX]
00ADFAD9 8D78 18 LEA EDI,DWORD PTR DS:[EAX+18]
00ADFADC A1 8C37AE00 MOV EAX,DWORD PTR DS:[AE378C]
00ADFAE1 8858 08 MOV BYTE PTR DS:[EAX+8],BL
00ADFAE4 833F 00 CMP DWORD PTR DS:[EDI],0
00ADFAE7 75 1D JNZ SHORT 00ADFB06
00ADFAE9 83C5 20 ADD EBP,20
00ADFAEC A1 8436AE00 MOV EAX,DWORD PTR DS:[AE3684]
00ADFAF1 8078 0A 00 CMP BYTE PTR DS:[EAX+A],0
00ADFAF5 75 0F JNZ SHORT 00ADFB06
00ADFAF7 B8 1F000000 MOV EAX,1F
00ADFAFC E8 C32DFDFF CALL 00AB28C4
堆栈:
0012FF34 0012FF80 指向下一个 SEH 记录的指针
0012FF38 00ADFA6E SE 处理器 跟随反汇编窗口
0012FF3C E850D8BF
0012FF40 BE409BC0
0012FF44 D34C9C60
0012FF48 0012FF64
0012FF4C 00ABBA61 返回到 00ABBA61 来自 00ABB988
来到这里:
00ADFA6E 56 PUSH ESI 在这下断 下断后Shift+f9运行到这里,消除断点.打开内存镜像
00ADFA6F F2: PREFIX REPNE: ; 多余前缀
00ADFA70 EB 01 JMP SHORT 00ADFA73
00ADFA72 F0:037424 38 LOCK ADD ESI,DWORD PTR SS:[ESP+38] ; 不允许锁定前缀
00ADFA77 C1DE 83 RCR ESI,83 ; 位移常数超出 1..31 的范围
00ADFA6E 56 PUSH ESI
00ADFA6F F2: PREFIX REPNE: ; 多余前缀
00ADFA70 EB 01 JMP SHORT 00ADFA73
00ADFA72 F0:037424 38 LOCK ADD ESI,DWORD PTR SS:[ESP+38] ; 不允许锁定前缀
00ADFA77 C1DE 83 RCR ESI,83 ; 位移常数超出 1..31 的范围
Memory map, 项目 23
地址=00401000
大小=00033000 (208896.)
属主=OnlyMe 00400000
区段=
包含=代码
类型=映像 01001002
访问=R
初始访问=RWE
Shift+f9到达光明之巅!!!
OEP:
004256A7 6A 60 PUSH 60 OEP
004256A9 68 B8C94400 PUSH OnlyMe.0044C9B8
004256AE E8 61040000 CALL OnlyMe.00425B14
004256B3 BF 94000000 MOV EDI,94
004256B8 8BC7 MOV EAX,EDI
004256BA E8 A1040000 CALL OnlyMe.00425B60
----------------------------------------------------------------------------------------------------------------------
以上代码是一段对其他程序的破解过程,用来借鉴一下
开始正式使用od分析了,第二个软件上场 ODbyDYK v1.10 12 动态脱壳的BB
打开ODbyDYK 加入 jxjl.1.53\jl_f.exe 询问压缩选否
00401000 > 68 01A04600 PUSH jl_f.0046A001 F8
00401005 E8 01000000 CALL jl_f.0040100B 上来就是个CALL,很猛呀F8过他,呵呵不怕
0040100A C3 RETN
0040100B C3 RETN
0040100C 4E DEC ESI
0040100D 2F DAS
0040100E CD F0 INT 0F0
00401010 C147 D2 B1 ROL DWORD PTR DS:[EDI-2E],0B1 ; 移动常数超出 1..31 的范围
00401014 CB RETF ; 远返回
00401015 8134B5 C83FFD9F >XOR DWORD PTR DS:[ESI*4+9FFD3FC8],5243FB>
00401020 60 PUSHAD
00401021 3BDB CMP EBX,EBX
00401023 6E OUTS DX,BYTE PTR ES:[EDI] ; I/O 命令
00401024 83BC6F 89E4FAFB >CMP DWORD PTR DS:[EDI+EBP*2+FBFAE489],0B
0040102C D83440 FDIV DWORD PTR DS:[EAX+EAX*2]
0040102F B1 E9 MOV CL,0E9
00401031 0807 OR BYTE PTR DS:[EDI],AL
00401033 E4 F3 IN AL,0F3 ; I/O 命令
00401035 3D 5B78BBC9 CMP EAX,C9BB785B
0040103A 06 PUSH ES
0040103B F2: PREFIX REPNE: ; 多余的前缀
0040103C 44 INC ESP
0040103D ^77 F1 JA SHORT jl_f.00401030
0040103F 2211 AND DL,BYTE PTR DS:[ECX]
00401041 8AC9 MOV CL,CL
00401043 4F DEC EDI
00401044 04 47 ADD AL,47
00401046 5F POP EDI
00401047 6A BB PUSH -45
00401049 ED IN EAX,DX ; I/O 命令
0040104A F0:42 LOCK INC EDX ; 不允许锁定前缀