Pespin 1.32全保护手工分析之三Code Redirection
【详细过程】嘿嘿,我又来了。按照惯例在分析前先要闲话几句,直接进入主题太没意思了。 当然我不会太过于罗嗦的。
上篇文章用了很长的篇幅才将API Redirection 的过程以及修复方法分析完成。其实原本我也不想长篇大论的
可是要将API Redirection 原理讲透,不把每个细节都考虑到的话,会让人看的不明不白还不如不分析了。所以嘛
分析分析着就出来那么长的篇幅了,对不住看的人了,说实话写这分析文章真的很累,不光我看懂还要让看的人懂。
嘿嘿,API Redirection 的过程分析还是小菜呢,如果最后Nanomite的过程,以及修复比这还要复杂,分7种方式
来替换原始程序的代码。每种方式的代码也是很长的一段,所以大家要做有耐心,玩破解学脱壳,耐心是非常重要的
好了,闲话就话到这了。我们进入主题吧!
大家有没有疑问,我为什么要把Code Redirection的分析放到了Antidump/Remove OEP 前面来讲了呢。嗯 ,是的
因为按壳的流程就是这样子走的,既然都说是F7+F8+F9 走下来的,那么就得按照此壳的流程一步一步的来了.如果明白
了,那么我们继续今天的旅程吧!接着上回后面来讲吧
0041AAB9 /EB 07 jmp short 0041AAC2 ;上回patch完代码后在这下硬断,F9(有写好的脚本跑到这吧)
0041AAC2^\EB F8 jmp short 0041AABC ;F7一直走
0041ABB5 B8 12E5ED24 mov eax, 24EDE512 ;F7一直走到这,继续F7 eax=0x24EDE512
0041ABBA E8 03000000 call 0041ABC2 ;F7
0041ABCB BB 8F319700 mov ebx, 97318F ;ebx=0x97318F
0041ABD0 2BC3 sub eax, ebx ;eax=0x24EDE512-0x97318F=0x2456B383
0041ABD2 3D A1168525 cmp eax, 258516A1 ;比较,如果相等表示没有代码搬到PE头(即Code Redirection)
0041ABD7 EB 04 jmp short 0041ABDD
0041ABDD^\EB FB jmp short 0041ABDA
0041ABDA /EB 04 jmp short 0041ABE0
0041ABE0 /74 79 je short 0041AC5B ;上面如果相等这里就跳去0041AC5B 最终会到达伪OEP
0041ABE2 BE 62DF4100 mov esi, 0041DF62 ;
0041ABE7 B9 3F020000 mov ecx, 23F ;下面开始解密41DF62--41DF62+23F-1=41E1A0之间的数据
0041ABEC 51 push ecx ;解密后的数据就是即将要搬到PE头的代码(即原始程序被Code Redirection的代码)
0041ABED B0 9E mov al, 9E ;第一步解密key
0041ABEF 304431 FF xor byte ptr , al;开始第一步解密
0041ABF3 EB 07 jmp short 0041ABFC
0041ABFF 004C31 FF add byte ptr , cl;开始第二步解密(cl是第二步解密key)
0041AC03 49 dec ecx ;ecx-1
0041AC04 9C pushfd ;这里是根据经过上个指令后ecx是否为0来计算出41AC31处指令跳转的地址
0041AC05 C12C24 06 shr dword ptr , 6
0041AC09 F71424 not dword ptr
0041AC0C 832424 01 and dword ptr , 1
0041AC10 50 push eax
0041AC11 52 push edx
0041AC12 B8 72B2DC12 mov eax, 12DCB272
0041AC17 05 444D23ED add eax, ED234D44
0041AC1C F76424 08 mul dword ptr
0041AC20 8D8428 8B4F4000 lea eax, dword ptr
0041AC27 894424 08 mov dword ptr , eax
0041AC2B 5A pop edx
0041AC2C 58 pop eax
0041AC2D 8D6424 04 lea esp, dword ptr
0041AC31 FF6424 FC jmp dword ptr ;0x41ABEF(ecx>0) 0x41AC39(ecx=0) 这个设条件断点 ecx==0 F9
0041AC39 59 pop ecx ;F7走
0041AC3A E8 03000000 call 0041AC42
0041AC42^\EB FB jmp short 0041AC3F
0041AC3F /EB 04 jmp short 0041AC45
0041AC45 830424 0C add dword ptr , 0C
0041AC49 C3 retn ;返回0x41AC4B
0041AC4B BF E0014000 mov edi, 004001E0 ;edi=0x4001E0 一会搬代码到PE头开始的地址(记下这值,写脚本修复有用)
0041AC50 EB 04 jmp short 0041AC56
0041AC56^\EB FB jmp short 0041AC53
0041AC53 /EB 04 jmp short 0041AC59
0041AC59 F3:A4 rep movs byte ptr es:, byte ptr ;开始从41DF62(size=23F)搬数据到4001E0(size=23F)
0041AC5B 2BC9 sub ecx, ecx ;F7走
0041ACB4 61 popad ;F7一路跑到,这就是伪OEP
0041ACB5 F7D2 not edx
0041ACB7 39C2 cmp edx, eax
0041ACB9 F7C0 74E7F921 test eax, 21F9E774
复制代码通过上面的分析,可以知道的是壳将原始程序的某些代码搬到了PE头中4001E0的位置,大小为0x23F字节
那下面让我们去看一下原始程序代码中是哪些地方的代码给搬走了?壳是如何找到搬动的代码?
跑到伪OEP后,我们ctrl+G 输入4018F7 (这个地址是我先前搜索好的,大家要搜的话可以CTRL+B输入 E8??????FF 即可)
搜到的指令如下:
//大家看到CALL后的地址没,对了。这就是上面分析将代码搬到PE头中4001E0的位置。我们在指令上回车看看。
004018F7 E8 E4E8FFFF call 004001E0 ;在这,回车
004001E0- E9 2D220000 jmp 00402412 ;进入这里,看这条指令后面的地址,指向原始代码所在的内存段,再回车看看
00402412 33C0 xor eax, eax ;没发现异常
00402414 6A 00 push 0
看到这里,大家是不是已经明白了?咦!不明白是吗?暴汗,其实就是0x4018F7 处原始的代码就是call 00402412 ,只不过壳将这条
指令搬到PE头去了,并变形成jmp 00402412然后在0x4018F7 处的代码替换成了call 004001E0指令。这只是第一种形式(call)
还有第二种形(jmp)
继续ctrl+G 输入 401993 (当然可以CTRL+B输入 E9??????FF 来搜索)
搜到的指令如下:
//看到没有,jmp后面的地址也是在4001E0-40041F(401E0+0x23F)之间的
00401993- E9 90E8FFFF jmp 00400228 ;也是这回车跳进去看看
00400228 833D 74854000 0>cmp dword ptr , 1;看到这条指令,这种形式是将原始代码处的指令全部照搬到PE头中
分析到这里,Code Redirection的过程就分析完毕吧。想必原理也明白了,这是不是比起前面加密的过程是不是简单多了。
嘿嘿。 本篇分析文章就此收工~~~~~~~~ sf自己做了。。。。。。不要抢哦 好东西 看看哈 Pespin
ximo不是有做视频教程嘛。。。
这壳难度很大,目前还没搞定
页:
[1]