![]() |
来源:安全中国 |
【前 言】:我现在找到一个更加方便的方法.而且也破解了一个限制.所以重新写下了这篇.由于这个壳有很多特别的地方,所以写笔记的时候主要是用自己的思想去写的.希望读者可以看明白和学会! 【软件名称】:ACProtect_122b_pro 【下载页面】:不记得了 【软件大小】:828,282 字节 -----> 3,567,616 字节 【应用平台】:WINXP 【软件简介】:一个加密器 【软件限制】:超级BT的OEP抽走代码.SDK保护.数据转移 【文章作者】:辉仔Yock 【作者声明】:本人读书少,比较笨,表达也不好,有什么地方写的不好,还请大侠多多指出,我好及时改正! 【破解工具】:Yock-OD LordPE ImportREC ————————————————————————————————— 【过 程】: //首先载入.忽略所有异常( 除内存异常之外 ) 还有就是隐藏OD了 006D5000 > 60 PUSHAD //壳的OEP //重要 006D5001 87EA XCHG EDX, EBP 006D5003 66:23EF AND BP, DI 006D5006 66:8BD3 MOV DX, BX 006D5009 FC CLD ********************************************* //这个壳有一个很有意思的地方,就是边走边解码,让我联想起一首歌的名字------边走边爱 006D5BB3 81CA 4FF34B51 OR EDX, 514BF34F 006D5BB9 81C3 4B8BAC86 ADD EBX, 86AC8B4B 006D5BBF BE 4F460000 MOV ESI, 464F 006D5BC4 8B0F MOV ECX, [EDI] 006D5BC6 03CB ADD ECX, EBX 006D5BC8 C1C9 07 ROR ECX, 7 006D5BCB 83EF FC SUB EDI, -4 006D5BCE 2B0F SUB ECX, [EDI] 006D5BD0 83C7 FC ADD EDI, -4 006D5BD3 890F MOV [EDI], ECX 006D5BD5 81F3 A4F8B360 XOR EBX, 60B3F8A4 006D5BDB 81EF FCFFFFFF SUB EDI, -4 006D5BE1 83EE 01 SUB ESI, 1 006D5BE4 ^ 0F85 DAFFFFFF JNZ 006D5BC4 006D5BEA E9 A9180100 JMP 006E7498 //来到这里就要开始了.注意了. 006D5BEF 0000 ADD [EAX], AL 006D5BF1 0000 ADD [EAX], AL 006D5BF3 0000 ADD [EAX], AL 006D5BF5 0000 ADD [EAX], AL 006D5BF7 0000 ADD [EAX], AL --------------------------------------------- //上面跳到这里: //来到这里马上豁然开朗. //这里有很多CALL,里面的用处都有不同的.我会在下面分别对重要的CALL进行简单分析. 006E7498 E8 4ABBFFFF CALL 006E2FE7 //这个CALL主要是取得一个固定的值放进去EBP里面作为一个固定量. 006E749D E8 00000000 CALL 006E74A2 006E74A2 5B POP EBX 006E74A3 2B9D F6234000 SUB EBX, [EBP+4023F6] 006E74A9 81EB A2240100 SUB EBX, 124A2 006E74AF 899D 31DE4000 MOV [EBP+40DE31], EBX //上面这四个指令是计算出400000这个值.保存起来 006E74B5 E8 CCFDFFFF CALL 006E7286 //用OEP的值计算某某数值作为一个Key,用处没有多大留意了! 006E74BA E8 28BBFFFF CALL 006E2FE7 006E74BF E8 C1B8FFFF CALL 006E2D85 //根据之前的Key再次计算. 006E74C4 8985 8CED4000 MOV [EBP+40ED8C], EAX //最终的Key保存起来.其实是一个效验.对于密码学菜的我就没有花什么时间跟这里了. 006E74CA E8 18BBFFFF CALL 006E2FE7 006E74CF C685 57DD4000 0>MOV BYTE PTR [EBP+40DD57], 0 006E74D6 E8 46DDFFFF CALL 006E5221 //这里是我问了一下jeff才知道是ACP这个系统的AIP来的.有意思...(jeff说和跨平台有很大关系.所以在这里提提) 006E74DB E8 DEDAFFFF CALL 006E4FBE //这里是代码解码处.解码完毕之后会把006E4FBE这个地址改成一个C3(够心思,不过没有什么用) 006E74E0 E8 5BFDFFFF CALL 006E7240 //这里就是转移数据到低位.(需要进去做做手脚,注意!!现在最新版1.22d版的对于这里有一下效验.这个版的没有) //再往下走就是 反跟踪 反调试 IAT解码 006E74E5 E8 FDBAFFFF CALL 006E2FE7 006E74EA 6A 00 PUSH 0 006E74EC E8 0A000000 CALL 006E74FB 006E74F1 41 INC ECX 006E74F2 43 INC EBX 006E74F3 50 PUSH EAX 006E74F4 72 6F JB SHORT 006E7565 006E74F6 74 65 JE SHORT 006E755D 006E74F8 637400 E8 ARPL [EAX+EAX-18], SI 006E74FC 25 00000050 AND EAX, 50000000 006E7501 72 6F JB SHORT 006E7572 .............. ..........省略N多的小花... ............. //由于花指令太多.所以列出一些关键的CALL //这里CALL都藏在小花里面的,跟踪时需要细心留神 006E7795 E8 9DC3FFFF CALL 006E3B37 //里面是一段小花,然后到达小黑(黑名单) //然后返回 .............. ..........省略N多的小花... ............. 006E79C7 E8 53D1FFFF CALL 006E4B1F //进入之后是一段小花后到达下面检查调试器 //kernel32.IsDebuggerPresent //如果发现调试器的话,不是杀掉,而是把程序代码改一下,比如E9改成01.呵呵,后果可想而知(够阴险) //然后返回 .............. ..........省略N多的小花... ............. 006E7B91 E8 10C3FFFF CALL 006E3EA6 //里面的东西由于自己水平低下而看不懂.就下面这三个AIP //kernel32.GetCurrentThread //kernel32.GetThreadContext //kernel32.SetThreadContext //返回 .............. ..........省略N多的小花... ............. 006E7BAC E8 6ECFFFFF CALL 006E4B1F //我靠,进去再次检查调试器!!! //如果发现调试器的话,不是杀掉,而是把程序代码改一下,比如E9改成01.呵呵,后果可想而知(够阴险) .............. ..........省略N多的小花... ............. 006E7C57 E8 C3CEFFFF CALL 006E4B1F ; ACProtec.006E4B1F //我靠,再次检查调试器!!!发神经! //如果发现调试器的话,不是杀掉,而是把程序代码改一下,比如E9改成01.呵呵,后果可想而知(够阴险) //其实来到这里进入之后是一个C3 .............. ..........省略N多的小花... ............. //来到下面这个CALL的时候就需要注意了.经过了上面的抢林弹雨,是时候进入这个XX的私密之处咯. 006E7CA7 E8 40DDFFFF CALL 006E59EC ; ACProtec.006E59EC //进入之后来到下面关键一 ******************************************** ---> //006E7CA7 处的CALL来到这里! 006E5B97 E8 4BD4FFFF CALL 006E2FE7 ; ACProtec.006E2FE7 006E5B9C 80BD 472D4100 C>CMP BYTE PTR [EBP+412D47], 0C3 //这里是比较下面006E5BA9的CALL进入后的第一条指令是否C3.是的话就跳过(多余) 006E5BA3 74 09 JE SHORT 006E5BAE ; ACProtec.006E5BAE 006E5BA5 90 NOP 006E5BA6 90 NOP 006E5BA7 90 NOP 006E5BA8 90 NOP 006E5BA9 E8 99110000 CALL 006E6D47 ; ACProtec.006E6D47 //IAT解码处.这里留在最后.因为这个壳的IAT没有难度.因此不详细说了! 006E5BAE 66:C785 17DB400>MOV WORD PTR [EBP+40DB17], 0 006E5BB7 83BD E8AC4100 0>CMP DWORD PTR [EBP+41ACE8], 0 006E5BBE 0F84 BF000000 JE 006E5C83 ; ACProtec.006E5C83 006E5BC4 8DB5 93D94000 LEA ESI, [EBP+40D993] 006E5BCA 56 PUSH ESI 006E5BCB 68 FF000000 PUSH 0FF 006E5BD0 FF95 46E34000 CALL [EBP+40E346] //取得系统临时目录的路径 006E5BD6 8DBD 93D94000 LEA EDI, [EBP+40D993] 006E5BDC 33C0 XOR EAX, EAX 006E5BDE F2:AE REPNE SCAS BYTE PTR ES:[EDI] 006E5BE0 8DB5 A3DA4000 LEA ESI, [EBP+40DAA3] 006E5BE6 4F DEC EDI 006E5BE7 B9 0B000000 MOV ECX, 0B 006E5BEC F3:A4 REP MOVS BYTE PTR ES:[EDI], BYTE PTR> 006E5BEE 8DB5 93D94000 LEA ESI, [EBP+40D993] 006E5BF4 6A 00 PUSH 0 006E5BF6 6A 20 PUSH 20 006E5BF8 6A 02 PUSH 2 006E5BFA 6A 00 PUSH 0 006E5BFC 6A 03 PUSH 3 006E5BFE 68 000000C0 PUSH C0000000 006E5C03 56 PUSH ESI 006E5C04 FF95 16E34000 CALL [EBP+40E316] //查找是否有perplex.dll 006E5C0A 0BC0 OR EAX, EAX 006E5C0C 74 75 JE SHORT 006E5C83 ; ACProtec.006E5C83 //没有怎么办呢?自己分泌一个.我操 006E5C0E 90 NOP 006E5C0F 90 NOP 006E5C10 90 NOP 006E5C11 90 NOP 006E5C12 50 PUSH EAX 006E5C13 6A 00 PUSH 0 006E5C15 8DB5 9FDA4000 LEA ESI, [EBP+40DA9F] 006E5C1B 56 PUSH ESI 006E5C1C FFB5 ECAC4100 PUSH DWORD PTR [EBP+41ACEC] 006E5C22 8B9D E8AC4100 MOV EBX, [EBP+41ACE8] 006E5C28 039D 31DE4000 ADD EBX, [EBP+40DE31] 006E5C2E 2B9D ECAC4100 SUB EBX, [EBP+41ACEC] 006E5C34 53 PUSH EBX 006E5C35 50 PUSH EAX 006E5C36 FF95 3EE34000 CALL [EBP+40E33E] 006E5C3C FF95 12E34000 CALL [EBP+40E312] //分泌就是那么简单!呵呵 006E5C42 8DB5 93D94000 LEA ESI, [EBP+40D993] 006E5C48 56 PUSH ESI 006E5C49 FF95 88B04100 CALL [EBP+41B088] ; kernel32.LoadLibraryA //...... 006E5C4F 0BC0 OR EAX, EAX 006E5C51 74 30 JE SHORT 006E5C83 ; ACProtec.006E5C83 006E5C53 90 NOP 006E5C54 90 NOP 006E5C55 90 NOP 006E5C56 90 NOP 006E5C57 8985 29DE4000 MOV [EBP+40DE29], EAX 006E5C5D 8DB5 AFDA4000 LEA ESI, [EBP+40DAAF] 006E5C63 56 PUSH ESI 006E5C64 FFB5 29DE4000 PUSH DWORD PTR [EBP+40DE29] 006E5C6A FF95 80B04100 CALL [EBP+41B080] ; kernel32.GetProcAddress 006E5C70 8985 AFDA4000 MOV [EBP+40DAAF], EAX //EAX=10002DB0 006E5C76 0BC0 OR EAX, EAX 006E5C78 74 09 JE SHORT 006E5C83 ; ACProtec.006E5C83 //是否找到这个DLL的口子.是的话就进入 006E5C7A 90 NOP 006E5C7B 90 NOP 006E5C7C 90 NOP 006E5C7D 90 NOP 006E5C7E E8 20F8FFFF CALL 006E54A3 ; ACProtec.006E54A3 //跟进去瞧瞧是啥样子的娘们 006E5C83 60 PUSHAD 006E5C84 E8 00000000 CALL 006E5C89 ; ACProtec.006E5C89 006E5C89 5E POP ESI ; ACProtec.006E7D5C 006E5C8A 83EE 06 SUB ESI, 6 006E5C8D B9 EC000000 MOV ECX, 0EC 006E5C92 29CE SUB ESI, ECX ; ACProtec.006E7C00 006E5C94 BA 22F93191 MOV EDX, 9131F922 006E5C99 C1E9 02 SHR ECX, 2 006E5C9C 83E9 02 SUB ECX, 2 006E5C9F 83F9 00 CMP ECX, 0 006E5CA2 7C 1A JL SHORT 006E5CBE ; ACProtec.006E5CBE 006E5CA4 8B048E MOV EAX, [ESI+ECX*4] 006E5CA7 8B5C8E 04 MOV EBX, [ESI+ECX*4+4] 006E5CAB 2BC3 SUB EAX, EBX 006E5CAD C1C8 0B ROR EAX, 0B 006E5CB0 33C2 XOR EAX, EDX 006E5CB2 81EA B1E7B51F SUB EDX, 1FB5E7B1 006E5CB8 89048E MOV [ESI+ECX*4], EAX 006E5CBB 49 DEC ECX ; ACProtec.006E7C00 006E5CBC ^ EB E1 JMP SHORT 006E5C9F ; ACProtec.006E5C9F 006E5CBE 61 POPAD ************************************************************** ---> //006E5C7E处的CALL进入之后是小花,然后来到下面: //下面这段我看不懂.比较晕... //仔细跟了一下是一个把程序自己的路径转换成为Key.dat. //应该是准备计算注册Key是否合格了! 006E5669 FFB5 FA234000 PUSH DWORD PTR [EBP+4023FA] ; kernel32.77E40000 006E566F FF95 80B04100 CALL [EBP+41B080] ; kernel32.GetProcAddress 006E5675 FFD0 CALL EAX //kernel32.GetCommandLineA 006E5677 8BF0 MOV ESI, EAX 006E5679 8DBD 93D94000 LEA EDI, [EBP+40D993] 006E567F AC LODS BYTE PTR [ESI] 006E5680 0AC0 OR AL, AL 006E5682 74 30 JE SHORT 006E56B4 ; ACProtec.006E56B4 006E5684 90 NOP 006E5685 90 NOP 006E5686 90 NOP 006E5687 90 NOP 006E5688 3C 5C CMP AL, 5C 006E568A 75 0B JNZ SHORT 006E5697 ; ACProtec.006E5697 006E568C 90 NOP 006E568D 90 NOP 006E568E 90 NOP 006E568F 90 NOP 006E5690 C685 68164100 0>MOV BYTE PTR [EBP+411668], 1 006E5697 817E FB 2E45584>CMP DWORD PTR [ESI-5], 4558452E 006E569E 74 14 JE SHORT 006E56B4 ; ACProtec.006E56B4 006E56A0 90 NOP 006E56A1 90 NOP 006E56A2 90 NOP 006E56A3 90 NOP 006E56A4 817E FB 2E65786>CMP DWORD PTR [ESI-5], 6578652E 006E56AB 74 07 JE SHORT 006E56B4 ; ACProtec.006E56B4 006E56AD 90 NOP 006E56AE 90 NOP 006E56AF 90 NOP 006E56B0 90 NOP 006E56B1 AA STOS BYTE PTR ES:[EDI] 006E56B2 ^ EB CB JMP SHORT 006E567F ; ACProtec.006E567F 006E56B4 4F DEC EDI 006E56B5 8A07 MOV AL, [EDI] 006E56B7 0AC0 OR AL, AL 006E56B9 74 08 JE SHORT 006E56C3 ; ACProtec.006E56C3 006E56BB 90 NOP 006E56BC 90 NOP 006E56BD 90 NOP 006E56BE 90 NOP 006E56BF 3C 5C CMP AL, 5C 006E56C1 ^ 75 F1 JNZ SHORT 006E56B4 ; ACProtec.006E56B4 006E56C3 47 INC EDI 006E56C4 80BD 68164100 0>CMP BYTE PTR [EBP+411668], 1 006E56CB 74 0A JE SHORT 006E56D7 ; ACProtec.006E56D7 006E56CD 90 NOP 006E56CE 90 NOP 006E56CF 90 NOP 006E56D0 90 NOP 006E56D1 8DBD 93D94000 LEA EDI, [EBP+40D993] 006E56D7 8DB5 93DA4000 LEA ESI, [EBP+40DA93] 006E56DD B9 0C000000 MOV ECX, 0C 006E56E2 F3:A4 REP MOVS BYTE PTR ES:[EDI], BYTE PTR> 006E56E4 80BD 68164100 0>CMP BYTE PTR [EBP+411668], 1 006E56EB 74 0F JE SHORT 006E56FC ; ACProtec.006E56FC 006E56ED 90 NOP 006E56EE 90 NOP 006E56EF 90 NOP 006E56F0 90 NOP 006E56F1 8DBD 93DA4000 LEA EDI, [EBP+40DA93] 006E56F7 EB 14 JMP SHORT 006E570D ; ACProtec.006E570D 006E56F9 90 NOP 006E56FA 90 NOP 006E56FB 90 NOP 006E56FC 66:8B07 MOV AX, [EDI] 006E56FF 66:3D 3A5C CMP AX, 5C3A 006E5703 74 07 JE SHORT 006E570C ; ACProtec.006E570C 006E5705 90 NOP 006E5706 90 NOP 006E5707 90 NOP 006E5708 90 NOP 006E5709 4F DEC EDI 006E570A ^ EB F0 JMP SHORT 006E56FC ; ACProtec.006E56FC 006E570C 4F DEC EDI 006E570D 6A 00 PUSH 0 006E570F 68 80000000 PUSH 80 006E5714 6A 03 PUSH 3 006E5716 6A 00 PUSH 0 006E5718 6A 01 PUSH 1 006E571A 68 00000080 PUSH 80000000 006E571F 57 PUSH EDI 006E5720 FF95 16E34000 CALL [EBP+40E316] ; kernel32.CreateFileA //打开key.dat 006E5726 0BC0 OR EAX, EAX 006E5728 75 15 JNZ SHORT 006E573F ; ACProtec.006E573F 006E572A 90 NOP 006E572B 90 NOP 006E572C 90 NOP 006E572D 90 NOP 006E572E 6A 00 PUSH 0 006E5730 57 PUSH EDI 006E5731 57 PUSH EDI 006E5732 6A 00 PUSH 0 006E5734 FF95 90B04100 CALL [EBP+41B090] ; USER32.MessageBoxA 006E573A E9 26020000 JMP 006E5965 ; ACProtec.006E5965 006E573F 50 PUSH EAX 006E5740 8DB5 9FDA4000 LEA ESI, [EBP+40DA9F] 006E5746 8DBD 17DB4000 LEA EDI, [EBP+40DB17] 006E574C 6A 00 PUSH 0 006E574E 56 PUSH ESI 006E574F 68 00020000 PUSH 200 006E5754 57 PUSH EDI 006E5755 50 PUSH EAX 006E5756 FF95 3AE34000 CALL [EBP+40E33A] ; kernel32.ReadFile 006E575C FF95 12E34000 CALL [EBP+40E312] ; kernel32.CloseHandle 006E5762 81BD 9FDA4000 0>CMP DWORD PTR [EBP+40DA9F], 200 //比较这个Key.dat是否200字节 006E576C 0F85 F3010000 JNZ 006E5965 ; ACProtec.006E5965 006E5772 8DB5 E6D64000 LEA ESI, [EBP+40D6E6] 006E5778 8DBD E7DB4000 LEA EDI, [EBP+40DBE7] 006E577E B9 28000000 MOV ECX, 28 006E5783 F3:A7 REPE CMPS DWORD PTR ES:[EDI], DWORD P> 006E5785 83F9 00 CMP ECX, 0 006E5788 74 31 JE SHORT 006E57BB ; ACProtec.006E57BB 006E578A 90 NOP 006E578B 90 NOP 006E578C 90 NOP 006E578D 90 NOP 006E578E 8DB5 A5174100 LEA ESI, [EBP+4117A5] 006E5794 6A 00 PUSH 0 006E5796 56 PUSH ESI 006E5797 56 PUSH ESI 006E5798 6A 00 PUSH 0 006E579A FF95 90B04100 CALL [EBP+41B090] ; USER32.MessageBoxA 006E57A0 E9 C0010000 JMP 006E5965 ; ACProtec.006E5965 006E57A5 6C INS BYTE PTR ES:[EDI], DX ; I/O command 006E57A6 6963 65 6E73652>IMUL ESP, [EBX+65], 2065736E 006E57AD 76 65 JBE SHORT 006E5814 ; ACProtec.006E5814 006E57AF 72 73 JB SHORT 006E5824 ; ACProtec.006E5824 006E57B1 696F 6E 2065727>IMUL EBP, [EDI+6E], 72726520 006E57B8 6F OUTS DX, DWORD PTR ES:[EDI] ; I/O command 006E57B9 72 00 JB SHORT 006E57BB ; ACProtec.006E57BB 006E57BB 8DB5 93D74000 LEA ESI, [EBP+40D793] 006E57C1 8DBD 17DB4000 LEA EDI, [EBP+40DB17] 006E57C7 833E 00 CMP DWORD PTR [ESI], 0 006E57CA 74 54 JE SHORT 006E5820 ; ACProtec.006E5820 006E57CC 90 NOP 006E57CD 90 NOP 006E57CE &n, bsp; 90 NOP 006E57CF 90 NOP 006E57D0 813E 20202020 CMP DWORD PTR [ESI], 20202020 006E57D6 74 48 JE SHORT 006E5820 ; ACProtec.006E5820 006E57D8 90 NOP 006E57D9 90 NOP 006E57DA 90 NOP 006E57DB 90 NOP 006E57DC B9 20000000 MOV ECX, 20 006E57E1 F3:A6 REPE CMPS BYTE PTR ES:[EDI], BYTE PTR> 006E57E3 0BC9 OR ECX, ECX 006E57E5 74 13 JE SHORT 006E57FA ; ACProtec.006E57FA 006E57E7 90 NOP 006E57E8 90 NOP 006E57E9 90 NOP 006E57EA 90 NOP 006E57EB 807E FF 00 CMP BYTE PTR [ESI-1], 0 006E57EF 74 09 JE SHORT 006E57FA ; ACProtec.006E57FA 006E57F1 90 NOP 006E57F2 90 NOP 006E57F3 90 NOP 006E57F4 90 NOP 006E57F5 83C6 20 ADD ESI, 20 006E57F8 ^ EB CD JMP SHORT 006E57C7 ; ACProtec.006E57C7 |