UPX0: 00401C20 sub???? esp, 608h UPX0: 00401C26 push??? ebx UPX0: 00401C27 push??? ebp UPX0: 00401C28 push??? esi UPX0: 00401C29 mov???? ebp, ecx UPX0: 00401C2B push??? edi UPX0: 00401C2C mov???? ecx, 7Dh ; '}' UPX0: 00401C31 xor???? eax, eax UPX0: 00401C33 lea???? edi, [esp + 3Ch ] UPX0: 00401C37 rep stosd UPX0: 00401C39 mov???? ecx, 7Dh ; '}' UPX0: 00401C3E lea???? edi, [esp + 424h ] UPX0: 00401C45 rep stosd UPX0: 00401C47 mov???? ecx, 7Dh ; '}' UPX0: 00401C4C lea???? edi, [esp + 230h ] UPX0: 00401C53 rep stosd UPX0: 00401C55 lea???? eax, [esp + 3Ch ] UPX0: 00401C59 push??? 64h ; 'd' UPX0: 00401C5B push??? eax UPX0: 00401C5C lea???? ecx, [ebp + 5Ch ] UPX0: 00401C5F call??? MfcGetText????????????????????? ;? 获取Name的字符串 name = esp + 3c UPX0: 00401C64 lea???? ecx, [esp + 424h ] UPX0: 00401C6B push??? 64h ; 'd' UPX0: 00401C6D push??? ecx UPX0: 00401C6E lea???? ecx, [ebp + 0ACh ] UPX0: 00401C74 call??? MfcGetText????????????????????? ; 获取Code的字符串存在 esp + 0x424 UPX0: 00401C79 lea???? edi, [esp + 3Ch ] UPX0: 00401C7D or ????? ecx, 0FFFFFFFFh UPX0: 00401C80 xor???? eax, eax UPX0: 00401C82 lea???? edx, [esp + 230h ] UPX0: 00401C89 repne scasb UPX0: 00401C8B not ???? ecx???????????????????????????? ; 求name长度 UPX0: 00401C8D sub???? edi, ecx UPX0: 00401C8F mov???? eax, ecx UPX0: 00401C91 mov???? esi, edi UPX0: 00401C93 mov???? edi, edx UPX0: 00401C95 shr???? ecx, 2 UPX0: 00401C98 rep movsd?????????????????????????????? ; name复制到esp + 230h UPX0: 00401C9A mov???? ecx, eax UPX0: 00401C9C and ???? ecx, 3 UPX0: 00401C9F rep movsb UPX0: 00401CA1 lea???? ecx, [esp + 230h ] UPX0: 00401CA8 push??? ecx UPX0: 00401CA9 call??? __strrev??????????????????????? ; 将name反转 UPX0: 00401CAE lea???? edi, [esp + 234h ] UPX0: 00401CB5 or ????? ecx, 0FFFFFFFFh UPX0: 00401CB8 xor???? eax, eax UPX0: 00401CBA add???? esp, 4 UPX0: 00401CBD repne scasb UPX0: 00401CBF not ???? ecx???????????????????????????? ; 求反转后长度 UPX0: 00401CC1 sub???? edi, ecx UPX0: 00401CC3 lea???? edx, [esp + 3Ch ] UPX0: 00401CC7 mov???? esi, edi UPX0: 00401CC9 mov???? ebx, ecx UPX0: 00401CCB mov???? edi, edx UPX0: 00401CCD or ????? ecx, 0FFFFFFFFh UPX0: 00401CD0 repne scasb UPX0: 00401CD2 mov???? ecx, ebx UPX0: 00401CD4 dec???? edi UPX0: 00401CD5 shr???? ecx, 2 UPX0: 00401CD8 rep movsd?????????????????????????????? ; strcat(name,strrev(name)) UPX0: 00401CDA mov???? ecx, ebx UPX0: 00401CDC lea???? eax, [esp + 18h ] UPX0: 00401CE0 and ???? ecx, 3 UPX0: 00401CE3 push??? eax UPX0: 00401CE4 push??? offset aSoftwareMicros????????? ; "SOFTWARE\\Microsoft\\Windows\\CurrentVe" ... UPX0: 00401CE9 push??? 80000002h UPX0: 00401CEE rep movsb UPX0: 00401CF0 call??? ds:RegOpenKeyA????????????????? ; 打开注册表 UPX0: 00401CF6 mov???? ebx, ds:RegQueryValueExA??????? ; 查询ProductID UPX0: 00401CFC lea???? ecx, [esp + 14h ] UPX0: 00401D00 lea???? edx, [esp + 230h ] UPX0: 00401D07 push??? ecx UPX0: 00401D08 mov???? ecx, [esp + 1Ch ] UPX0: 00401D0C lea???? eax, [esp + 14h ] UPX0: 00401D10 push??? edx UPX0: 00401D11 push??? eax UPX0: 00401D12 push??? 0 UPX0: 00401D14 push??? offset aProductid?????????????? ; "ProductID" UPX0: 00401D19 mov???? dword ptr [esp + 24h ], 1 UPX0: 00401D21 mov???? dword ptr [esp + 28h ], 100h UPX0: 00401D29 push??? ecx UPX0: 00401D2A call??? ebx ; RegQueryValueExA????????? ; 查询ProductID UPX0: 00401D2C lea???? edi, [esp + 230h ] UPX0: 00401D33 or ????? ecx, 0FFFFFFFFh UPX0: 00401D36 xor???? eax, eax UPX0: 00401D38 lea???? edx, [esp + 3Ch ] UPX0: 00401D3C repne scasb UPX0: 00401D3E not ???? ecx UPX0: 00401D40 sub???? edi, ecx UPX0: 00401D42 mov???? dword ptr [esp + 10h ], 1 UPX0: 00401D4A mov???? esi, edi UPX0: 00401D4C mov???? edi, edx UPX0: 00401D4E mov???? edx, ecx UPX0: 00401D50 or ????? ecx, 0FFFFFFFFh UPX0: 00401D53 repne scasb UPX0: 00401D55 mov???? ecx, edx UPX0: 00401D57 dec???? edi UPX0: 00401D58 shr???? ecx, 2 UPX0: 00401D5B rep movsd?????????????????????????????? ; 将查询的字符串strcat到name UPX0: 00401D5D mov???? ecx, edx UPX0: 00401D5F lea???? eax, [esp + 14h ] UPX0: 00401D63 and ???? ecx, 3 UPX0: 00401D66 push??? eax UPX0: 00401D67 mov???? eax, [esp + 1Ch ] UPX0: 00401D6B lea???? edx, [esp + 14h ] UPX0: 00401D6F rep movsb UPX0: 00401D71 lea???? ecx, [esp + 234h ] UPX0: 00401D78 mov???? dword ptr [esp + 18h ], 100h UPX0: 00401D80 push??? ecx UPX0: 00401D81 push??? edx UPX0: 00401D82 push??? 0 UPX0: 00401D84 push??? offset aRegisteredowne????????? ; "RegisteredOwner" UPX0: 00401D89 push??? eax UPX0: 00401D8A call??? ebx ; RegQueryValueExA????????? ; 查询RegisteredOwner UPX0: 00401D8C lea???? edi, [esp + 230h ] UPX0: 00401D93 or ????? ecx, 0FFFFFFFFh UPX0: 00401D96 xor???? eax, eax UPX0: 00401D98 lea???? edx, [esp + 3Ch ] UPX0: 00401D9C repne scasb UPX0: 00401D9E not ???? ecx???????????????????????????? ; 求注册表查询字符串长度 UPX0: 00401DA0 sub???? edi, ecx UPX0: 00401DA2 mov???? esi, edi UPX0: 00401DA4 mov???? ebx, ecx UPX0: 00401DA6 mov???? edi, edx UPX0: 00401DA8 or ????? ecx, 0FFFFFFFFh UPX0: 00401DAB repne scasb UPX0: 00401DAD mov???? ecx, ebx UPX0: 00401DAF dec???? edi UPX0: 00401DB0 shr???? ecx, 2 UPX0: 00401DB3 rep movsd UPX0: 00401DB5 mov???? ecx, ebx UPX0: 00401DB7 and ???? ecx, 3 UPX0: 00401DBA rep movsb?????????????????????????????? ; 将查询的字符串strcat到name UPX0: 00401DBC lea???? edi, [esp + 3Ch ]????????????????? ; 由于win10缺少这几个注册表项,其得到的name = name + strrev(name) + strrev(name) + strrev(name) UPX0: 00401DC0 or ????? ecx, 0FFFFFFFFh ???????????????? ; 如果xp下应该是 name + strrev(name) + ProducID(查询得到字符串) + RegisterOwner(查询的字符串) UPX0: 00401DC3 repne scasb UPX0: 00401DC5 not ???? ecx???????????????????????????? ; 求组合后的长度 UPX0: 00401DC7 lea???? eax, [esp + 2Ch ] UPX0: 00401DCB dec???? ecx UPX0: 00401DCC push??? eax UPX0: 00401DCD mov???? esi, ecx UPX0: 00401DCF call??? Md5InitState??????????????????? ; 初始化md5的 4 个state UPX0: 00401DD4 lea???? edx, [esp + esi + 40h ] UPX0: 00401DD8 mov???? ecx, 13h UPX0: 00401DDD xor???? eax, eax UPX0: 00401DDF mov???? edi, edx UPX0: 00401DE1 rep stosd?????????????????????????????? ; 清空name后面 19 * 4 字节 UPX0: 00401DE3 add???? esp, 4 UPX0: 00401DE6 inc???? esi UPX0: 00401DE7 stosw UPX0: 00401DE9 mov???? ecx, esi UPX0: 00401DEB stosb UPX0: 00401DEC and ???? ecx, 3Fh ??????????????????????? ; 对齐数据 64 UPX0: 00401DEF mov???? eax, 40h ; '@' ????????????????? ; 对齐数据 64 UPX0: 00401DF4 sub???? eax, ecx??????????????????????? ; 对齐数据 64 UPX0: 00401DF6 mov???? byte ptr [edx], 80h ; '€' ?????? ; name最后结尾赋值 0x80 UPX0: 00401DF9 cmp ???? eax, 7 ????????????????????????? ; 对齐数据 64 UPX0: 00401DFC jg????? short loc_401E01 UPX0: 00401DFE add???? eax, 40h ; '@' ????????????????? ; 对齐数据 64 UPX0: 00401E01 UPX0: 00401E01 loc_401E01:???????????????????????????? ; CODE XREF: UPX0: 00401DFC ↑j UPX0: 00401E01 add???? esi, eax UPX0: 00401E03 lea???? edi, [esp + 3Ch ] UPX0: 00401E07 or ????? ecx, 0FFFFFFFFh UPX0: 00401E0A xor???? eax, eax UPX0: 00401E0C repne scasb UPX0: 00401E0E not ???? ecx UPX0: 00401E10 dec???? ecx UPX0: 00401E11 xor???? edi, edi UPX0: 00401E13 shl???? ecx, 3 ????????????????????????? ; 长度 * 8 UPX0: 00401E16 test??? esi, esi UPX0: 00401E18 mov???? [esp + esi + 34h ], ecx????????????? ; 添加长度数据 UPX0: 00401E1C jle???? short loc_401E37 UPX0: 00401E1E UPX0: 00401E1E loc_401E1E:???????????????????????????? ; CODE XREF: UPX0: 00401E35 ↓j UPX0: 00401E1E lea???? edx, [esp + 2Ch ] UPX0: 00401E22 lea???? eax, [esp + edi + 3Ch ] UPX0: 00401E26 push??? edx UPX0: 00401E27 push??? eax UPX0: 00401E28 call??? Md5Transform??????????????????? ; md5Transform UPX0: 00401E2D add???? edi, 40h ; '@' ????????????????? ; 递增 64 字节 UPX0: 00401E30 add???? esp, 8 UPX0: 00401E33 cmp ???? edi, esi UPX0: 00401E35 jl????? short loc_401E1E??????????????? ; for (i = 0 ;i < esi(对齐长度);i + = 64 ) UPX0: 00401E37 UPX0: 00401E37 loc_401E37:???????????????????????????? ; CODE XREF: UPX0: 00401E1C ↑j UPX0: 00401E37 mov???? ebx, [esp + 2Ch ] UPX0: 00401E3B lea???? ecx, [esp + 28h ] UPX0: 00401E3F lea???? edx, [esp + 24h ] UPX0: 00401E43 push??? ecx UPX0: 00401E44 lea???? eax, [esp + 24h ] UPX0: 00401E48 push??? edx UPX0: 00401E49 lea???? ecx, [esp + 24h ] UPX0: 00401E4D push??? eax UPX0: 00401E4E push??? ecx UPX0: 00401E4F lea???? edx, [esp + 434h ]???????????????? UPX0: 00401E56 and ???? ebx, 0FFFFh ???????????????????? ; 将state[ 0 ]的高位抹去 UPX0: 00401E5C push??? offset aLxLxLxLx??????????????? ; "%lx%lx%lx%lx" UPX0: 00401E61 push??? edx UPX0: 00401E62 mov???? [esp + 44h ], ebx UPX0: 00401E66 call??? _sscanf???????????????????????? ; 从code字符串中获取 4 个UINT数据 UPX0: 00401E6B add???? esp, 18h UPX0: 00401E6E cmp ???? eax, 4 ????????????????????????? ; 不够 4 个就报错 UPX0: 00401E71 jz????? short loc_401E91 UPX0: 00401E73 push??? 30h ; '0' UPX0: 00401E75 push??? offset aFailed????????????????? ; "Failed" UPX0: 00401E7A push??? offset aHmmmYouDonTEve????????? ; "... Hmmm, you don't even pass the first" ... UPX0: 00401E7F mov???? ecx, ebp UPX0: 00401E81 call??? MfcMsgBox UPX0: 00401E86 pop???? edi UPX0: 00401E87 pop???? esi UPX0: 00401E88 pop???? ebp UPX0: 00401E89 pop???? ebx UPX0: 00401E8A add???? esp, 608h UPX0: 00401E90 retn UPX0: 00401E91 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - UPX0: 00401E91 UPX0: 00401E91 loc_401E91:???????????????????????????? ; CODE XREF: UPX0: 00401E71 ↑j UPX0: 00401E91 xor???? esi, esi UPX0: 00401E93 lea???? edi, [esp + 1Ch ] UPX0: 00401E97 UPX0: 00401E97 loc_401E97:???????????????????????????? ; CODE XREF: UPX0: 00401EB3 ↓j UPX0: 00401E97 mov???? eax, 0BADC0DEh ????????????????? ; for (i = 0 ;i < 3 ;i + + ) UPX0: 00401E9C lea???? ecx, [esi + 50h ] UPX0: 00401E9F cdq UPX0: 00401EA0 idiv??? ecx???????????????????????????? ; loop_cnt = 0xbadc0de / (i + 80 ) UPX0: 00401EA2 push??? eax UPX0: 00401EA3 push??? edi UPX0: 00401EA4 call??? Encode????????????????????????? ; 算法关键:将 4 个UINT做 3 轮ENcode UPX0: 00401EA9 add???? esp, 8 UPX0: 00401EAC inc???? esi UPX0: 00401EAD add???? edi, 4 UPX0: 00401EB0 cmp ???? esi, 3 UPX0: 00401EB3 jl????? short loc_401E97??????????????? ; for (i = 0 ;i < 3 ;i + + ) UPX0: 00401EB5 xor???? eax, eax UPX0: 00401EB7 UPX0: 00401EB7 loc_401EB7:???????????????????????????? ; CODE XREF: UPX0: 00401EC9 ↓j UPX0: 00401EB7 mov???? edx, [esp + eax + 1Ch ] UPX0: 00401EBB mov???? ecx, [esp + eax + 2Ch ] UPX0: 00401EBF cmp ???? edx, ecx UPX0: 00401EC1 jnz???? short loc_401EE9 UPX0: 00401EC3 add???? eax, 4 UPX0: 00401EC6 cmp ???? eax, 10h UPX0: 00401EC9 jl????? short loc_401EB7 UPX0: 00401ECB push??? 40h ; '@' UPX0: 00401ECD push??? offset aWelcome???????????????? ; "Welcome" UPX0: 00401ED2 push??? offset aManYouReGoodEn????????? ; "... Man, you're good enough to join COR" ... UPX0: 00401ED7 mov???? ecx, ebp UPX0: 00401ED9 call??? MfcMsgBox UPX0: 00401EDE pop???? edi UPX0: 00401EDF pop???? esi UPX0: 00401EE0 pop???? ebp UPX0: 00401EE1 pop???? ebx UPX0: 00401EE2 add???? esp, 608h UPX0: 00401EE8 retn UPX0: 00401EE9 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - UPX0: 00401EE9 UPX0: 00401EE9 loc_401EE9:???????????????????????????? ; CODE XREF: UPX0: 00401EC1 ↑j UPX0: 00401EE9 push??? 30h ; '0' UPX0: 00401EEB push??? offset aFailed????????????????? ; "Failed" UPX0: 00401EF0 push??? offset aBetterLuckNext????????? ; "... Better luck next time ..." UPX0: 00401EF5 mov???? ecx, ebp UPX0: 00401EF7 call??? MfcMsgBox UPX0: 00401EFC pop???? edi UPX0: 00401EFD pop???? esi UPX0: 00401EFE pop???? ebp UPX0: 00401EFF pop???? ebx UPX0: 00401F00 add???? esp, 608h UPX0: 00401F06 retn |