好友
阅读权限10
听众
最后登录1970-1-1
|
【详细过程】
嘿嘿,我又来了。按照惯例在分析前先要闲话几句,直接进入主题太没意思了。 当然我不会太过于罗嗦的。
上篇文章用了很长的篇幅才将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 [ecx+esi-1], al;开始第一步解密
0041ABF3 EB 07 jmp short 0041ABFC
0041ABFF 004C31 FF add byte ptr [ecx+esi-1], cl;开始第二步解密(cl是第二步解密key)
0041AC03 49 dec ecx ;ecx-1
0041AC04 9C pushfd ;这里是根据经过上个指令后ecx是否为0来计算出41AC31处指令跳转的地址
0041AC05 C12C24 06 shr dword ptr [esp], 6
0041AC09 F71424 not dword ptr [esp]
0041AC0C 832424 01 and dword ptr [esp], 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 [esp+8]
0041AC20 8D8428 8B4F4000 lea eax, dword ptr [eax+ebp+404F8B]
0041AC27 894424 08 mov dword ptr [esp+8], eax
0041AC2B 5A pop edx
0041AC2C 58 pop eax
0041AC2D 8D6424 04 lea esp, dword ptr [esp+4]
0041AC31 FF6424 FC jmp dword ptr [esp-4] ;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 [esp], 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:[edi], byte ptr [esi] ;开始从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 [408574], 1 ;看到这条指令,这种形式是将原始代码处的指令全部照搬到PE头中
分析到这里,Code Redirection的过程就分析完毕吧。想必原理也明白了,这是不是比起前面加密的过程是不是简单多了。
嘿嘿。 本篇分析文章就此收工~~~~~~~~ |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|