首页
社区
课程
招聘
OllyDbg + ASProtect SKE 2.X +代码变形
发表于: 2005-9-10 05:26 20001

OllyDbg + ASProtect SKE 2.X +代码变形

2005-9-10 05:26
20001
【破解作者】 SYSCOM
【使用工具】 Ollydbg1.10, LordPE,ImportREC1.65,PEid 0.93
【破解平台】 Windows XP SP1
【软件名称】 BetterJPEG 1, 4, 4, 0
【下载地址】 http://www.betterjpeg.com/
【软件简介】 Edit JPEG photos
【加壳方式】 ASProtect SKE 2.X
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
(1) 用ollydbg 载入BetterJPEG.exe ,设置忽略所有异常。
    在命令栏输入
    BP GetVersion ,按 F9,看 STACK 返回 431EE4 ,在按 ALT+F9
    返回,主程式 ,往上看.....不远地方

431EB8-PUSH  EBP          <======= OEP 进入点
431EB9-MOV   EBP,ESP
431EBB-PUSH   -1
.....
.....

(2)修正 Import  Table and .CODE  写入补丁 PATCH(1)
   先修正 9F4387-PUSH 9F43A4==>PUSH PATCH(1)+0x29 Offset Address   

//********************** Start of Code in Object BinaryCode **************
:00000000   mov edx, 00401000               ;主程式 Start address
:00000005   cmp byte ptr [edx], E8          ;判断是否为 call 指令
:00000008   jne 0000001E
:0000000A   mov eax, dword ptr [edx+01]
:0000000D   add eax, edx
:0000000F   add eax, 00000005                                 
:00000014   cmp eax, 00CD0000               ;判断是否为 call API 加密,进入点
:00000019   jne 0000001E
:0000001B   pushad                          ;保存所有暂存器
:0000001C   jmp edx
:0000001E   inc edx
:0000001F   cmp edx, 00461000               ;主程式 end address
:00000025   jbe 00000005
:00000027   jmp 00000027                    ;PATCH END
:00000029   mov ecx, 00461000               ;IAT   start address (解码返回进入点)
:0000002E   mov edx, dword ptr [ebp-0C]
:00000031   cmp dword ptr [ecx], edx
:00000033   jne 00000052
:00000035   mov dword ptr [00460800], ecx    ;暂存 Import Address
:0000003B   add esp, 0000023C
:00000041   popad                            ;取回所有暂存器
:00000042   mov ebx, dword ptr [00460800]    ;取出 Import Address
:00000048   mov dword ptr [edx+02], ebx      ;修正 Import Address
:0000004B   mov word ptr [edx], 15FF         ;修正 CALL
:00000050   jmp 0000001E
:00000052   add ecx, 00000004
:00000055   cmp ecx, 004616AC                ;IAT   End address
:0000005B   jl 00000031
:0000005D   jmp 0000005D

(3)写入补丁 PATCH(2)

//********************** Start of Code in Object BinaryCode **************
:00000000  mov edx, 00401000                ;主程式 Start address
:00000005  cmp byte ptr [edx], E8           ;判断是否为 call 指令
:00000008  jne 00000030
:0000000A  mov eax, dword ptr [edx+01]
:0000000D  add eax, edx
:0000000F  add eax, 00000005
:00000014  cmp eax, 00401000                ;判断是否为 > 401000
:00000019  jb 00000030
:0000001B  cmp eax, 00461000                ;判断是否为 < 461000
:00000020  ja 00000030                                                
:00000022  mov bx, word ptr [eax]
:00000025  cmp bx, 15FF                      ;判断是否为 call 指令
:0000002A  jne 00000030
:0000002C  mov [eax+01], 25                  ;修正 CALL =>JMP
:00000030  inc edx
:00000031  cmp edx, 00461000                 ;主程式 End address
:00000037  jne 00000005
:00000039  jmp 00000039

(4) PATCH 完后,Dump BetterJPEG_dump.exe

(5)run  BetterJPEG.exe 在用 ImportREC 抓出 Import
    并修复 kernel32,中一个无效指针,改为 GetProcAddress
    再修正,RestoreLastError ==>SetLastError  (98/XP/NT4/2003 相容)

(6)使用 lordPE DUMP 变形程式,MEMORY 区块
     并附加在 BetterJPEG_dump.exe,的后面

ADDRESS:        SIZE        SET
-----------------------------------
9D0000           32000       RWE
A64000           10000       RWE
C80000            1000       RWE
D10000            1000       RWE
D30000            2000       RWE
D40000            2000       RWE
D50000            1000       RWE
D60000            1000       RWE
-----------------------------------

(7)修正 Route CHECK

9F70CE-MOV  EAX,[EAX+34]    =>  9F70CE-NOP
9F70D1-CALL EAX             =>  9F70CF-NOP
9FD0D3-SUB  [EBP+C],EAX     =>  9F70D0-MOV   EAX,[ESP+58]  
9FD0D6-MOV  EAX,[ENP+C]     =>  9F70D4-SUB   EAX,5

(9)OK->TEST->RUN  BetterJPEG_dump.exe

  
附件:betterjpeg.part1.rar

附件:betterjpeg.part2.rar

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 7
支持
分享
最新回复 (39)
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
我先来做沙发
2005-9-10 05:51
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
呵呵
我也来顶
强人
2005-9-10 06:04
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
stolen code得处理看来都是用的壳里的东西.
另外,修复iat的那些代码写成脚本的话,会更适合我等菜鸟
2005-9-10 10:53
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
5
syscom兄能否解释一下修正Route CHECK
2005-9-10 11:05
0
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
6
学习!
2005-9-10 14:47
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
7

2005-9-10 15:21
0
雪    币: 308
活跃值: (362)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
8
终于有人搞定了,顶
2005-9-10 19:48
0
雪    币: 245
活跃值: (195)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
9
最初由 fly 发布
syscom兄能否解释一下修正Route CHECK


Route CHECK,算是壳的自我检查

它是由 A,B 两数值,作互减运算

A=GetCurrentThreadID
B=CALL Route Address

运算后 ...
B=B-A

当你脱壳之后,B=会发生错误 ERROR 111
所以我们只要,抓出正确的 CALL Route Address
就可以通过  CHECK SUM ,也就是在 [ESP+58],的 STACK 位址
所以我们使用 MOV   EAX,[ESP+58] ,来还原 B 值
+5 后修正 B 值 Address

9F70CE-MOV  EAX,[EAX+34]  
9F70D1-CALL EAX              =>  GetCurrentThreadID
9FD0D3-SUB  [EBP+C],EAX      =>  B=B-A
9FD0D6-MOV  EAX,[ENP+C]   

2005-9-11 00:45
0
雪    币: 10500
活跃值: (2159)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
BT壳 如此厉害的解法 前所未见啊
2005-9-11 01:37
0
雪    币: 212
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
请问patch1和patch2是用什么工具(od插件?)做?搞不懂这个地方。
2005-9-11 09:30
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
看不懂哦
能写个详细点的么
我是2ksp4系统 为什么我载入后是停留在这里呢

00401000 >  68 01C04800           push 48C001
00401005    E8 01000000           call 0040100B                                  ; 0040100B
0040100A    C3                    retn
2005-9-12 09:55
0
雪    币: 245
活跃值: (195)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
13
最初由 heng9ml 发布
请问patch1和patch2是用什么工具(od插件?)做?搞不懂这个地方。


不用工具,找空白区写入,ASM 或 BIN CODE 例如:460700 (空白区)
  写完后,COPY BIN BLOCK 保存在,文字档
下次,可以在贴上,不用重输入.~OK
2005-9-12 11:21
0
雪    币: 245
活跃值: (195)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
14
最初由 cpshow 发布
看不懂哦
能写个详细点的么
我是2ksp4系统 为什么我载入后是停留在这里呢

00401000 > 68 01C04800 push 48C001
........


OD ?蒌入,是停呃彦,?邋
呃是?的入口,然後在命令行,下??
BP GetVersion ,按 F9,ALT+F9 可找到
OEP 入口 ,看?,你和我一?,?? OD  
2005-9-12 11:28
0
雪    币: 271
活跃值: (226)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
15
学习中……
2005-9-12 13:29
0
雪    币: 212
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
感谢作者回复!学学看
2005-9-12 15:32
0
雪    币: 1126
活跃值: (156)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
17
我很奇怪里面没有VM的代码?不过VM代码不影响运行了。
也奇怪代码居然OEP也没有抽取?

我觉得至少还有两点需要解决:
1,那么多节,能否想办法还原回去呢?如果不巧程序分配跨度达到了2G是否我们的PE文件的ImageSize也改这么大呢?
2,VM是否也该还原呢?VM代码抽取也是一个难点,当然不是没有还原的可能,虽然aspr说随机抽取,但我用过,发现应该不是随机抽取,而是通过某种权衡以后抽取的,往往关键代码都会被抽取,而且,每次都是那几个,如果真随机,不可能每次都那么巧合。

这两个问题不解决,分析还是很为难。
2005-9-14 12:24
0
雪    币: 227
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
弱弱的问下。patch里面直接是代码。如果是直接写入的话怎么运行?
主程序代码中好象没调用这个啊。
是不是在patch头建eip。然后patch结果断?
然后run patch?还是怎么弄?
没弄过patch。希望老大赐教。
2005-9-14 12:51
0
雪    币: 245
活跃值: (195)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
19
最初由 suddymail 发布
弱弱的问下。patch里面直接是代码。如果是直接写入的话怎么运行?
主程序代码中好象没调用这个啊。
是不是在patch头建eip。然后patch结果断?
然后run patch?还是怎么弄?
没弄过patch。希望老大赐教。


?你找到 OEP ?,找空白?,?入 PATCH(1) ,?完後

令 EIP -->指向 PATCH 檫钷位址,下??在 PATCH 劫束位址
按下 F9 ,?剿止在???,就可以,再?入 PATCH(2)
  方法同 PATCH(1)
2005-9-14 16:36
0
雪    币: 207
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
cmp byte ptr [edx], E8
怎么写不进去啊?
2005-10-11 12:33
0
雪    币: 298
活跃值: (445)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
21
OdllyDbg + ASProtect SKE 2.X +代码变形

纠正OllyDbg
2005-10-11 14:03
0
雪    币: 245
活跃值: (195)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
22
最初由 kelven 发布
cmp byte ptr [edx], E8
怎么写不进去啊?


CMP ....要怎??...要?..INTEL...
2005-10-11 15:07
0
雪    币: 245
活跃值: (195)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
23
最初由 Immlep 发布
OdllyDbg + ASProtect SKE 2.X +代码变形

纠正OllyDbg


著著,已修正....
2005-10-11 15:08
0
雪    币: 136
活跃值: (105)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
24
哈哈! 效果不同反响!
2005-10-12 11:15
0
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
25
cmp byte ptr [edx], E8
怎么写不进去啊?

是不是:cmp byte ptr ds:[edx],E8
2005-10-12 15:37
0
游客
登录 | 注册 方可回帖
返回
//