首页
社区
课程
招聘
CrackMe12 题VM分析
发表于: 2016-11-26 12:27 5381

CrackMe12 题VM分析

2016-11-26 12:27
5381

虽然没有完成,但对这个题目的VM比较感兴趣,以下是一些分析记录,不过当前时间较短,不是很完整,如果有时间后续会继续补充。

准备工作:

首先用od搜集一些虚拟机运行时的一些数据,搜集数据的方式如下:



00EDD6FA  主  MOV AL,BYTE PTR DS:[EAX]  EAX=0112D4[COLOR="Red"]31[/COLOR]
00EDD6FC  主  PUSH EAX
00EDD6FD  主  PUSHFD
00EDD6FE  主  LEA EDI,DWORD PTR SS:[ESP+C]  EDI=00BEF2B8
00EDD702  主  PUSH EDX
00EDD703  主  TEST DWORD PTR SS:[ESP+18],E89DFB74
00EDD70B  主  JNS crackme_.00EDD632
00EDD632  主  PUSH EBP
00EDD633  主  LEA ECX,DWORD PTR SS:[ESP+20]  ECX=00BEF2C4
00EDD637  主  PUSH EBX
00EDD638  主  SUB ECX,DWORD PTR SS:[ESP+24]  ECX=FFD11BE7
00EDD63C  主  ROL DWORD PTR SS:[ESP+1C],1
00EDD640  主  MOV BYTE PTR SS:[ESP+2F],AL
00EDD644  主  PUSH DWORD PTR SS:[ESP+28]
00EDD648  主  NEG EDX  EDX=FF12299E
00EDD64A  主  MOV DWORD PTR SS:[ESP+14],EBX
00EDD64E  主  SUB DWORD PTR SS:[ESP+18],EDI
00EDD652  主  XOR ESI,DWORD PTR SS:[ESP+14]  ESI=8BA7EE45
00EDD656  主  XCHG DWORD PTR SS:[ESP+18],ESI  ESI=00000010
00EDD65A  主  MOV EDI,DWORD PTR SS:[ESP+1C]  EDI=00EDD6F2
00EDD65E  主  MOVZX ECX,BYTE PTR SS:[ESP+1C]  ECX=000000F2
00EDD663  主  MOV DWORD PTR SS:[ESP+10],ESI
00EDD667  主  XCHG DWORD PTR SS:[ESP+18],ESI  ESI=8BA7EE45
00EDD66B  主  ADD EDI,FFFF6E0E  EDI=00ED4500
00EDD671  主  XCHG DWORD PTR SS:[ESP+8],EAX  EAX=7C8DA807
00EDD675  主  MOV AL,BL  EAX=7C8DA88D
00EDD677  主  OR ESI,EAX  ESI=FFAFEECD
00EDD679  主  DEC ESI  ESI=FFAFEECC
00EDD67A  主  MOV DWORD PTR SS:[ESP+2F],EDI
00EDD67E  主  PUSH DWORD PTR SS:[ESP+28]
00EDD682  主  MOV ECX,DWORD PTR SS:[ESP+4]  ECX=D2DC9935
00EDD686  主  OR BYTE PTR SS:[ESP+24],DL
00EDD68A  主  CALL crackme_.00EDD690
00EDD690  主  DEC DL  EDX=FF12299D
00EDD692  主  SUB DWORD PTR SS:[ESP+14],8573D8F1
00EDD69A  主  MOV ECX,DWORD PTR SS:[ESP+37]  ECX=00ED4500
00EDD69E  主  PUSHFD
00EDD69F  主  INC EDI  EDI=00ED4501
00EDD6A0  主  XCHG DWORD PTR SS:[ESP+18],EDI  EDI=7B79FD71
00EDD6A4  主  SAR EDI,1  EDI=3DBCFEB8
00EDD6A6  主  PUSH DWORD PTR SS:[ESP+2C]
00EDD6AA  主  MOV EDX,EBP  EDX=7C8DA807
00EDD6AC  主  MOV DWORD PTR SS:[ESP+38],ECX
00EDD6B0  主  AND BYTE PTR SS:[ESP+4],AL
00EDD6B4  主  ADD EDX,EAX  EDX=F91B5094
00EDD6B6  主  XCHG BYTE PTR SS:[ESP+4],DL  EDX=F91B5005
00EDD6BA  主  POP EDI  EDI=F91B509E
00EDD6BB  主  PUSH DWORD PTR SS:[ESP+34]
00EDD6BF  主  XCHG DWORD PTR SS:[ESP+C],EDX  EDX=00EDD6DD
00EDD6C3  主  MOV EAX,DWORD PTR SS:[ESP+18]  EAX=0112D431
00EDD6C7  主  XCHG DWORD PTR SS:[ESP+1C],EDI  EDI=00ED4501
00EDD6CB  主  XCHG DWORD PTR SS:[ESP+20],ESI  ESI=00000010
00EDD6CF  主  XCHG DWORD PTR SS:[ESP+24],EBX
00EDD6D3  主  XCHG DWORD PTR SS:[ESP+34],EBP  EBP=00EF91B5
00EDD6D7  主  RETN 3F
00ED4500  主  PUSH EAX
00ED4501  主  PUSH EBP
[COLOR="red"]00ED4502  主  MOV CL,BYTE PTR SS:[EBP]  ECX=00ED45CD[/COLOR]
00ED4505  主  AND DWORD PTR SS:[ESP+4],ESI
00ED4509  主  PUSH EDX
00ED450A  主  SHL EDX,CL  EDX=BADBA000

00ED2A40  主  MOV CL,BYTE PTR SS:[EBP]  ECX=00ED45F8
00ED2A43  主  NEG ESI  ESI=B6EEC62F
00ED2A45  主  ROR ESI,CL  ESI=EEC62FB6
00ED2A47  主  MOV EDI,EBP  EDI=00EF91B7
00ED2A49  主  SBB EDX,EBX  EDX=BEE54755
00ED2A4B  主  DEC DL  EDX=BEE54754
00ED2A4D  主  MOVZX EAX,CL  EAX=000000F8
00ED2A50  主  ROR ESI,CL  ESI=C62FB6EE
00ED2A52  主  INC EBP  EBP=00EF91B8
00ED2A53  主  XOR EDI,EDX  EDI=BE0AD6E3
00ED2A55  主  ADD EDX,ECX  EDX=BFD28D4C
00ED2A57  主  PUSH EDI
00ED2A58  主  INC EDX  EDX=BFD28D4D
00ED2A59  主  XOR AL,BL  EAX=0000004E
00ED2A5B  主  SBB DWORD PTR SS:[ESP],8D9F2B3D
00ED2A63  主  INC DWORD PTR SS:[ESP]
00ED2A67  主  ROL EDX,CL  EDX=4DBFD28D
00ED2A69  主  PUSH EBX
00ED2A6A  主  MOV BL,DL  EBX=8B191C8D
00ED2A6C  主  MOVZX ESI,BX  ESI=00001C8D
00ED2A6F  主  ROR AL,1  EAX=00000027
00ED2A71  主  PUSH DWORD PTR SS:[ESP+4]
00ED2A75  主  ROR DWORD PTR SS:[ESP],3
00ED2A7A  主  NEG ESI  ESI=FFFFE373
00ED2A7C  主  PUSH EDX
00ED2A7D  主  PUSH EDI
00ED2A7E  主  ADD EDI,ESI  EDI=BE0ABA56
00ED2A80  主  SUB AL,0C  EAX=0000001B
00ED2A82  主  MOV BYTE PTR SS:[ESP+10],DL
00ED2A86  主  SUB EDX,EDI  EDX=8FB51837
00ED2A88  主  ROR EDX,CL  EDX=B518378F
00ED2A8A  主  MOV ESI,EDI  ESI=BE0ABA56
00ED2A8C  主  CALL crackme_.00ED329A
00ED329A  主  LEA ESI,DWORD PTR SS:[ESP+8]  ESI=00BEF2BE
00ED329E  主  PUSH EBP
00ED329F  主  MOV EBP,DWORD PTR SS:[ESP+14]  EBP=8B191CB6
00ED32A3  主  PUSH ESI
00ED32A4  主  ADD DL,BYTE PTR SS:[ESP+1C]  EDX=B518371C
00ED32A8  主  CMP ECX,809D7E86
00ED32AE  主  JPO crackme_.00ED2E07
00ED32B4  主  DEC EDI  EDI=BE0ABA55
00ED32B5  主  PUSH EDI
00ED32B6  主  XCHG DWORD PTR SS:[ESP+18],EDX  EDX=E60D7574
00ED32BA  主  MOV DL,BYTE PTR SS:[ESP+C]  EDX=E60D7591
00ED32BE  主  POP EDX  EDX=BE0ABA55
00ED32BF  主  ROR ESI,CL  ESI=BEF2BE00
00ED32C1  主  DEC AL  EAX=0000001A
00ED32C3  主  PUSH ESI
00ED32C4  主  MOV DL,CL  EDX=BE0ABAF8
00ED32C6  主  SAR ESI,CL  ESI=FFFFFFBE
00ED32C8  主  NOT AL  EAX=000000E5
00ED32CA  主  PUSH ECX
00ED32CB  主  MOV EDI,DWORD PTR SS:[ESP+24]  EDI=306BAB8
00ED32CF  主  ADD EDX,ECX  EDX=BEF800F0
00ED32D1  主  PUSH EDI
00ED32D2  主  NEG AL  EAX=0000001B
00ED32D4  主  AND EDX,EDI  EDX=30680080
00ED32D6  主  SAR DWORD PTR SS:[ESP+28],CL
00ED32DA  主  PUSH EDI
00ED32DB  主  SHR DWORD PTR SS:[ESP+8],CL
00ED32DF  主  INC DWORD PTR SS:[ESP+8]
00ED32E3  主  XOR BYTE PTR SS:[ESP+28],AL
00ED32E7  主  PUSH ESI
00ED32E8  主  ROR EDX,CL  EDX=68008030
00ED32EA  主  POP DWORD PTR SS:[ESP+24]
00ED32EE  主  SUB DWORD PTR SS:[ESP+C],EBX
00ED32F2  主  POP ESI  ESI=306BAB8D
00ED32F3  主  SAR DWORD PTR SS:[ESP+4],CL
00ED32F7  主  JMP crackme_.00ED3302
00ED3302  主  ADD BL,DL  EBX=8B191CBD
00ED3304  主  PUSH DWORD PTR SS:[ESP+4]
00ED3308  主  AND ESI,EDI
00ED330A  主  NOT ESI  ESI=CF945472
00ED330C  主  SUB DWORD PTR SS:[ESP+4],EBP
00ED3310  主  INC EDI  EDI=306BAB8E
00ED3311  主  MOV EDX,EAX  EDX=0000001B
00ED3313  主  ADD ESI,DWORD PTR SS:[ESP+2C]  ESI=CF9454A2
00ED3317  主  XCHG DWORD PTR SS:[ESP+C],ECX  ECX=33D9A173
00ED331B  主  LEA ECX,DWORD PTR SS:[ESP+1C]  ECX=00BEF2BA
00ED331F  主  PUSHFD
00ED3320  主  PUSH EBP
00ED3321  主  SHL EDX,2  EDX=0000006C           -> 解密后的字节码
00ED3324  主  PUSH DWORD PTR SS:[ESP+18]
00ED3328  主  SUB BYTE PTR SS:[ESP+C],8C
00ED332D  主  PUSH EAX
00ED332E  主  XCHG DWORD PTR SS:[ESP+34],ESI  ESI=FFFFFFBE
00ED3332  主  LEA ESI,DWORD PTR SS:[ESP+24]  ESI=00BEF2B2
00ED3336  主  MOV ESI,DWORD PTR SS:[ESP+28]  ESI=00ED2A91
00ED333A  主  SHL EDI,CL  EDI=38000000
00ED333C  主  PUSH DWORD PTR SS:[ESP+4]
00ED3340  主  LEA EDI,DWORD PTR DS:[EDI+FFFF7FAD]  EDI=37FF7FAD
00ED3346  主  PUSH EBP
00ED3347  主  ADD ESI,25F14  ESI=00EF89A5            -> 加密的handler表地址
00ED334D  主  PUSH 298890A7
00ED3352  主  CALL crackme_.00ED3359
00ED3359  主  PUSH DWORD PTR SS:[ESP+8]
00ED335D  主  ADD EDX,ESI  EDX=00EF8A11
00ED335F  主  XCHG DWORD PTR SS:[ESP+48],ESI  ESI=CF9454A2
00ED3363  主  PUSH EBX
00ED3364  主  MOV EDI,F8A791F5  EDI=F8A791F5
00ED3369  主  MOV ESI,DWORD PTR DS:[EDX]  ESI=487851D1  -> 加密的handler
00ED336B  主  PUSH ECX
00ED336C  主  MOVZX EDI,CL  EDI=000000BA
00ED336F  主  PUSH ESI
00ED3370  主  ADD DWORD PTR SS:[ESP+10],36A
00ED3378  主  PUSH EAX
00ED3379  主  ADD EDI,DWORD PTR SS:[ESP+28]  EDI=00BEF378
00ED337D  主  SAR DWORD PTR SS:[ESP+C],CL
00ED3381  主  MOV EDI,DWORD PTR SS:[ESP+1C]  EDI=8B191CB6
00ED3385  主  PUSH DWORD PTR SS:[ESP+14]
00ED3389  主  XOR BYTE PTR SS:[ESP+58],BL
00ED338D  主  NEG DWORD PTR SS:[ESP+20]
00ED3391  主  RETN 2C
00ED36C1  主  POP DWORD PTR SS:[ESP+24]
00ED36C5  主  ADC DWORD PTR SS:[ESP+C],905A3673
00ED36CD  主  PUSH EBP
00ED36CE  主  MOV DWORD PTR SS:[ESP+34],ESI
00ED36D2  主  AND EDI,EDX  EDI=00090810
00ED36D4  主  XCHG DWORD PTR SS:[ESP+2C],ESI  ESI=00EF89A5 [esp+2c] == 487851D1
00ED36D8  主  ROL ESI,CL  ESI=9403BE26
00ED36DA  主  NEG EDI  EDI=FFF6F7F0
00ED36DC  主  PUSH DWORD PTR SS:[ESP+30]
00ED36E0  主  NEG EDI  EDI=00090810
00ED36E2  主  TEST EAX,ECX
00ED36E4  主  JB crackme_.00ED3490
00ED36EA  主  MOV DWORD PTR SS:[ESP+1C],EDX
00ED36EE  主  NEG EDX  EDX=FF1075EF
00ED36F0  主  PUSH DWORD PTR SS:[ESP+1C]
00ED36F4  主  MOV DWORD PTR SS:[ESP+C],EAX
00ED36F8  主  ADD EAX,7B9AE0CF  EAX=7B9AE0EA
00ED36FD  主  INC BL  EBX=8B191CBE
00ED36FF  主  SUB DWORD PTR SS:[ESP+3C],56FB61D4
00ED3707  主  NEG AL  EAX=7B9AE016
00ED3709  主  ADD EDI,EAX  EDI=7BA3E826
00ED370B  主  CALL crackme_.00ED3713  -> 此处压入 0xED3710 后续取出用来计算handler的位置
00ED3713  主  MOV EDI,EDX  EDI=FF1075EF
00ED3715  主  ROR DWORD PTR SS:[ESP+40],0B
00ED371A  主  NOT EDI  EDI=00EF8A10
00ED371C  主  OR DWORD PTR SS:[ESP+14],EBX
00ED3720  主  PUSH ESI
00ED3721  主  ADD EDI,DWORD PTR SS:[ESP+30]  EDI=01DCB4A1
00ED3725  主  PUSH EBX
00ED3726  主  SHL EDI,CL  EDI=84000000
00ED3728  主  NOT DWORD PTR SS:[ESP+48]
00ED372C  主  ADD EDI,79895FA1  EDI=FD895FA1
00ED3732  主  SBB BYTE PTR SS:[ESP+1C],DL
00ED3736  主  PUSHFD
00ED3737  主  PUSH BAAA4D68
00ED373C  主  MOV EDI,DWORD PTR SS:[ESP+10]  EDI=00ED3710
00ED3740  主  NOT AL  EAX=7B9AE0E9
00ED3742  主  POP EAX  EAX=BAAA4D68
00ED3743  主  XOR DWORD PTR SS:[ESP+4],19F76BD5
00ED374B  主  MOV DWORD PTR SS:[ESP+18],EBP
00ED374F  主  PUSH ESI
00ED3750  主  ADD EDI,FFBEC8F0  EDI=00AC0000
00ED3756  主  MOV ECX,EDX  ECX=FF1075EF
00ED3758  主  PUSH DWORD PTR SS:[ESP+14]
00ED375C  主  SUB EBX,EDX  EBX=8C08A6CF
00ED375E  主  ADC EBP,98A469C  EBP=94A36353
00ED3764  主  ADD DWORD PTR SS:[ESP+54],EDI             // 00EDD062
00ED3768  主  DEC EDI  EDI=00ABFFFF
00ED3769  主  XOR AL,BL  EAX=BAAA4DA7
00ED376B  主  SUB EDI,ECX  EDI=019B8A10
00ED376D  主  XCHG BYTE PTR SS:[ESP+1C],DL  EDX=FF1075AD
00ED3771  主  MOVSX EDI,AL  EDI=FFFFFFA7
00ED3774  主  TEST DWORD PTR SS:[ESP+20],EDX
00ED3778  主  JE crackme_.00ED35E2
00ED377E  主  ROL EDI,5  EDI=FFFFF4FF
00ED3781  主  PUSH EBX
00ED3782  主  LEA EDI,DWORD PTR SS:[ESP+48]  EDI=00BEF2BA
00ED3786  主  XCHG DWORD PTR SS:[ESP+8],EDI  EDI=9403BE26
00ED378A  主  ADD DWORD PTR SS:[ESP+18],0A2
00ED3792  主  DEC EDI  EDI=9403BE25
00ED3793  主  PUSH DWORD PTR SS:[ESP+4]
00ED3797  主  INC BYTE PTR SS:[ESP+24]
00ED379B  主  MOV EDI,DWORD PTR SS:[ESP+30]  EDI=8B191C0F
00ED379F  主  PUSH DWORD PTR SS:[ESP+1C]
00ED37A3  主  ADD DL,9C  EDX=FF107549
00ED37A6  主  MOV EDI,ESI  EDI=9403BE26
00ED37A8  主  MOV EAX,DWORD PTR SS:[ESP+30]  EAX=0000001B
00ED37AC  主  RETN 3C
00ED37B2  主  PUSH DWORD PTR SS:[ESP+1C]
00ED37B6  主  MOV EDX,DWORD PTR SS:[ESP+8]  EDX=00EF8A11
00ED37BA  主  PUSH EAX
00ED37BB  主  MOVSX EAX,DL  EAX=00000011
00ED37BE  主  ADD EDI,8E9DCD6A  EDI=22A18B90
00ED37C4  主  SHR EDI,CL  EDI=00004543
00ED37C6  主  MOV EDX,DWORD PTR SS:[ESP+28]  EDX=00EDD062
00ED37CA  主  XOR EDI,ESI  EDI=9403FB65
00ED37CC  主  SUB BL,DL  EBX=8C08A66D
00ED37CE  主  MOV DWORD PTR SS:[ESP+24],EDX
00ED37D2  主  POP EAX  EAX=0000001B
00ED37D3  主  PUSHFD
00ED37D4  主  XCHG DWORD PTR SS:[ESP+1C],EDX  EDX=8B191CB6
00ED37D8  主  SHL EDX,CL  EDX=8E5B0000
00ED37DA  主  SUB DWORD PTR SS:[ESP],EDI
00ED37DE  主  MOV CL,BL  ECX=FF10756D
00ED37E0  主  PUSH EBX
00ED37E1  主  MOV EAX,DWORD PTR SS:[ESP+28]  EAX=00EDD062
00ED37E5  主  MOVZX EDI,CL  EDI=0000006D
00ED37E8  主  MOV DWORD PTR SS:[ESP+2C],EAX
00ED37EC  主  PUSH EDI
00ED37ED  主  ROR EDI,CL  EDI=03680000
00ED37EF  主  XCHG DWORD PTR SS:[ESP+8],EAX  EAX=6BFC0E9D
00ED37F3  主  LEA EAX,DWORD PTR DS:[EAX+FFFE18F8]  EAX=6BFA2795
00ED37F9  主  PUSH DWORD PTR SS:[ESP+28]                  // 存储 ----------->  00ED36D4 ->487851D1
00ED37FD  主  MOV EDI,DWORD PTR SS:[ESP+34]  EDI=00EDD062
00ED3801  主  MOV DWORD PTR SS:[ESP+2C],EDI
00ED3805  主  PUSH ECX
00ED3806  主  AND EDI,EDX  EDI=00490000
00ED3808  主  SAR EDI,CL  EDI=00000248
00ED380A  主  ADD DWORD PTR SS:[ESP+C],EAX
00ED380E  主  PUSH DWORD PTR SS:[ESP+8]
00ED3812  主  LEA EDI,DWORD PTR SS:[ESP+8]  EDI=00BEF296
00ED3816  主  PUSH DWORD PTR SS:[ESP+34]
00ED381A  主  MOV ESI,DWORD PTR SS:[ESP+C]  ESI=487851D1 // ------>取出
00ED381E  主  XCHG DWORD PTR SS:[ESP+18],EAX  EAX=00EDD062
00ED3822  主  MOV EBX,DWORD PTR SS:[ESP+1C]  EBX=8B191CAD
00ED3826  主  MOV ECX,DWORD PTR SS:[ESP+20]  ECX=00ED45F8
00ED382A  主  XCHG DWORD PTR SS:[ESP+28],EBP  EBP=00EF91B8
00ED382E  主  XCHG DWORD PTR SS:[ESP+30],EDI  EDI=BE0AD6E3
00ED3832  主  XCHG DWORD PTR SS:[ESP+34],EDX  EDX=00EDD062
00ED3836  主  RETN 40                                      // 跳转到handler
00EDD062  主  PUSH ECX
00EDD063  主  NOT CL  ECX=00ED4507
00EDD065  主  PUSH ESI
00EDD066  主  PUSHFD
00EDD067  主  MOV DWORD PTR SS:[ESP+4],ECX
00EDD06B  主  ROL ECX,CL  ECX=76A28380
00EDD06D  主  PUSH EDX
00EDD06E  主  SUB DL,0CB  EDX=00EDD097
00EDD071  主  MOVZX EAX,BYTE PTR SS:[ESP+10]  EAX=0000002F
00EDD076  主  XCHG DWORD PTR SS:[ESP+C],ECX  ECX=00ED45F8
00EDD07A  主  AND ESI,81E23C22  ESI=00601000
00EDD080  主  ADD DL,76  EDX=00EDD00D
00EDD083  主  XOR ESI,DWORD PTR SS:[ESP+C]  ESI=76C29380
00ED4502  主  MOV CL,BYTE PTR SS:[EBP]  ECX=00ED45CD

00ED2A40  主  MOV CL,BYTE PTR SS:[EBP]  ECX=00ED45F8
00ED2A4D  主  MOVZX EAX,CL  EAX=000000F8
00ED2A52  主  INC EBP  EBP=00EF91B8
00ED2A59  主  XOR AL,BL  EAX=0000004E
00ED2A6F  主  ROR AL,1  EAX=00000027
00ED2A80  主  SUB AL,0C  EAX=0000001B
00ED32C1  主  DEC AL  EAX=0000001A
00ED32C8  主  NOT AL  EAX=000000E5
00ED32D2  主  NEG AL  EAX=0000001B
00ED3311  主  MOV EDX,EAX  EDX=0000001B
00ED3321  主  SHL EDX,2  EDX=0000006C           -> 解密后的字节码



00ED36FF  主  SUB DWORD PTR SS:[ESP+3C],56FB61D4
00ED3707  主  NEG AL  EAX=7B9AE016
00ED3709  主  ADD EDI,EAX  EDI=7BA3E826
00ED370B  主  CALL crackme_.00ED3713  -> 此处压入 0xED3710 后续取出用来计算handler的位置
00ED3713  主  MOV EDI,EDX  EDI=FF1075EF
00ED3715  主  ROR DWORD PTR SS:[ESP+40],0B


00EDD12B  主  RETN 4A
00ED4F78  主  PUSH EBX
00ED4F79  主  INC EAX  EAX=00BEF2FF


00ED3832  主  XCHG DWORD PTR SS:[ESP+34],EDX  EDX=00EDD062
00ED3836  主  RETN 40                                      // 跳转到handler
00EDD062  主  PUSH ECX


00ED3336  主  MOV ESI,DWORD PTR SS:[ESP+28]  ESI=00ED2A91
00ED3347  主  ADD ESI,25F14  ESI=00EF89A5            -> 加密的handler表地址
00ED335D  主  ADD EDX,ESI  EDX=00EF8A11
00ED3369  主  MOV ESI,DWORD PTR DS:[EDX]  ESI=487851D1  -> 加密的handler
00ED36CE  主  MOV DWORD PTR SS:[ESP+34],ESI
00ED36FF  主  SUB DWORD PTR SS:[ESP+3C],56FB61D4


00ED3715  主  ROR DWORD PTR SS:[ESP+40],0B
00ED3728  主  NOT DWORD PTR SS:[ESP+48]
00ED373C  主  MOV EDI,DWORD PTR SS:[ESP+10]  EDI=00ED3710
00ED3750  主  ADD EDI,FFBEC8F0  EDI=00AC0000
[COLOR="Red"]00ED3764  主  ADD DWORD PTR SS:[ESP+54],EDI             // 00EDD062[/COLOR]


00ED370B  主  CALL crackme_.00ED3713  -> 此处压入 0xED3710 后续取出用来计算
handler的位置


  x = [edx]  // 4896E1D1
        x = x - 56FB61D4 = F19B7FFD
  x = ror(x, 0B) = FFBE336F
  x = not(x) = 41CC90

  handler = y + x
        = va + FFBEC8F0 + not(ror((x - 56FB61D4), 0x0B))
        = va + FFBEC8F0 + 41CC90

  DWORD handler[46] = { 0 };

  fread(handler, sizeof(handler), 1, f);
  fclose(f);

  for (int i = 0; i < sizeof(handler)/4; i++)
  {
    char bptext[30] = { 0 };
    handler[i] = handler[i] - 0x56FB61D4;
    handler[i] = (handler[i] >> 0x0b) | ((handler[i] & 0xfff) << (0x20 - 0x0B));
    handler[i] = ~handler[i];

    handler[i] += 0xffbec8f0;
    handler[i] += g_base + g_rva;

    sprintf(bptext, "bp %04x\n", handler[i]);
    fwrite(bptext, strlen(bptext), 1, f_o);

    printf(bptext);
  }


  • 分析取字节码过程

  •     找到字节码取码的位置对了解虚拟机有必要,而从runtrace跑过的代码来看,还是有些混乱的,我大致用下面的思路来找。
        a: 取几段连续代码,然后在上下文中查看其出现的次数, 以确定这段代码是否在循环中
        b: 寻找类似 MOV AA,BYTE PTR SS:[BBB] 以及 inc BBB 的指令 这也是一般取字节码的方式。


  • 1.1 runtrace反单步

  • 本应该把这部分放在前面的,但影响也不大。就是在runtrace时会遇到pushfd之类的指令,导致调试器出现异常,无法继续,还好这个壳比较友好,没有大量集成反调试以及反跟踪。计算下后续无效指令长度,然后nop掉就可以了。

  • 1.2 寻找定位

  • 按照上面的方式找到取字节码的过程:

  • 设置API断点
  • 上传的附件:
    收藏
    免费 1
    支持
    分享
    最新回复 (2)
    雪    币: 449
    活跃值: (233)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    2
    抢个沙发,留个位置。
    2016-11-29 10:10
    0
    雪    币: 6
    活跃值: (1120)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    3
    对vm分析的还是要顶一下的
    2016-11-29 13:21
    0
    游客
    登录 | 注册 方可回帖
    返回
    //