工具:原版OllyDbg v1.10 + StrongOD + ODBGScript + "Oreans UnVirtualizer ODBG Plug-in v1.5"
声明:JFF(JUST for FUN);转载请注明出处!
实例程序来自帖子“这家伙那么恐怖吗?才下1次,没人接单指点吗? ”
楼主的标题确实够吸引眼球,“电击率”也算不错。程序本身已经失效,大概是人家把漏子堵上了,所以才会有这篇文章。if 只想使用目标程序 goto :EOF else goto Label_请继续往下看
后来铁打英雄的帖子“GetDuxiuStr破解 ---WL/TMD加密 ”也提到这个东西,不过他是有Key的,用"Bypass HWID"方法;而我没有,只能Keygen了。
不管用那种方法,按说过了WinLicense的"License System",就应该出现用户界面了,但是程序却莫名其妙地退出了。看来作者在用户代码中还设有“机关”。
WinLicense的"许可系统"就不用再关心它了,我们从用户代码开始找。起点当然是目标的OEP。一.寻找OEP
本例是CISC虚拟机,除注明外,以下讨论只针对CISC VM。
直接跑LCF-AT的脚本"Themida - Winlicense 1.x - 2.x Multi PRO Edition 1.2",得到:"VM OEP ADDRESS is 5C88A7"005C88A7 68 68E57B13 PUSH 137BE568 ; VM OEP by LCF-AT
005C88AC E9 4B6FE5FF JMP 0041F7FC
可见,OEP被虚拟化了,所以称为"VM OEP"。稍后可以看到"Entry Point Virtualization"的值,也就是说OEP处有多少条指令被虚拟化。
"VM OEP"处为一个典型的PUSH/JMP序列:PUSH KEY/JMP VM_ENTRY。
在一个TMD/WL保护的应用中,如果虚拟机的处理器类型选择CISC,一定有3~4个VMs。Themida是3个,WinLicense是4个。
按其出现的地址顺序,将它们依次命名为VM1、VM2、VM3、VM4:
a) VM1是主控,包括三个重要DLL(KERNEL32.dll,USER32.dll,ADVAPI32.dll)的处理;WL中HWID的生成及处理;及部分Anti Checks。
b) VM2 & VM3 基本就是打酱油的,主要是一些Anti Checks。
c) VM4是WL才有的,负责处理"License System"相关的东西。VM4是WinLicense中Bypass或Keygen的关键。
cektop、quosego等等那些文章中著名的CmpEcxEaxAddress就是VM4中一个Handler的有效关键指令地址,明白了道理就不用满世界去找它。
查找这些个VMs的入口/出口地址、CONTEXT地址/大小、Handlers个数等等,可以用手工或脚本,本文不再深入。虚拟机的基本信息对写脚本、或正确理解使用插件工具非常重要。
在一个CISC虚拟机中,无论以何种方式,当来到VM_ENTRY时,栈上的第一个DWORD总是KEY。我把它称为"VM CALL",对每个"VM CALL"用VM#_KEY的格式来标识,它有可能只是一个过程,也可能是一个子程序被多次调用。
比如这里,"VM OEP"跳向VM1,用VM1_137BE568来表示。
好了,VM1_137BE568究竟干了些什么?显然需要弄清楚两件事:
i) 模拟执行了哪些被虚拟的指令,也就是人们常说的"Stolen Code"——被偷的代码;
ii) 没有不醒的梦——总要从虚拟回到现实的:这些代码执行完后,它一定会回到用户代码段(对EXE基本上是0x401000段)继续执行接下来的代码——返回地址。
第一点在Unpacking简单保护的Themida目标时很重要——“还原OEP”,在不清楚或不愿意碰虚拟机这个“黑匣子”的情况下,人们使用“类比法”来还原,即找目标的相同编程语言、编译连接版本等入口特征信息。
在WinLicense或保护得较好的Themida目标中,“还原OEP”已显得毫无意义,特别是虚拟机处理器为RISC时,情况会更加复杂,还涉及跨区段。所以返回地址对我们更加重要。
第二点取得返回地址,很简单,拦在VM1_EXIT处。
在这里我们可以避开“黑匣子”,但是在其他地方我们却不得不面对它。要打开它,如果不借助适当的工具是很困难的——不是说不可能。
事实上,我在逆向WL中那个用来自LicenseHash的“四小天鹅”(4 DWORDs)解密LicenseFileKey[0]~[2F]的算法时,只用到了脚本;而在使用下面提到的工具时,它崩溃了。
工具不是万能的,但是确实能为我们提供极大的便利,特别是当你理解并掌握了它。
要用到的工具就是"Oreans UnVirtualizer ODBG Plug-in",来自“伟大的Deathway”——请原谅我模仿一下“建翔体”。相信很多人是知道这个工具的,但大多数人是把这柄宝剑珍藏在箱底,连取出来舞弄一下的机会都没有。
这把利剑经过数年的磨砾,不能说有多完美,但已足够“神器”。如果不会用就放弃,可惜哦!总不能永远停留在“牛B”的阶段(NB = newbie?)吧。
我们在VM1_137BE568上小试“牛刀”: ... ; 此处省略数十行
@Label_005C8331
005C8331 PUSH DWORD PTR [ESP]
005C834D MOV EBP,DWORD PTR [ESP]
005C836E ADD ESP,0x4
005C8397 ADD ESP,0x4
005C83F4 PUSH DWORD PTR [ESP]
005C840A MOV EAX,DWORD PTR [ESP]
005C8426 ADD ESP,0x4
005C846D ADD ESP,0x4
005C8488 MOV EBX,DWORD PTR [ESP]
005C849E PUSH ECX
005C84A5 MOV ECX,ESP
005C84B4 ADD ECX,0x4
005C84CE ADD ECX,0x4
005C8518 PUSH DWORD PTR [ESP]
005C851F MOV DWORD PTR [ESP],ECX
005C8582 POP ECX
005C85AC POP ESP ; <-***
005C85B4 PUSH EBP ; emulating OEP of MFC started here
005C85BD MOV EBP,ESP
005C85D3 PUSH 0xff
005C85D8 PUSH 0x411670
005C8603 PUSH 0x40dfec ; SE handler installation
005C863A MOV EAX,DWORD PTR FS:[0x0]
005C86AA PUSH EAX
005C86BD MOV DWORD PTR FS:[0x0],ESP
005C86CC SUB ESP,0x68
005C8732 PUSH EBX
005C8747 PUSH ESI
005C8755 PUSH EDI
005C8768 MOV DWORD PTR [EBP+0xffffffe8],ESP ; [EBP-18]
005C8798 XOR EBX,EBX
005C87F8 MOV DWORD PTR [EBP+0xfffffffc],EBX ; [EBP-04]
005C8867 JMP 0x40de8a ; back to the real world
以上复制自"Oreans UnVirtualizer"生成的"Cisc_Uv_Dump.txt"文件。
首先,本段反汇编的地址不是现实世界的地址,而是虚拟机的取指指针ESI。其次,地址不是连续的,除了虚拟机本身 (1字节指令代码) + (0/1/2/4字节操作码) 的因素外,还有大量垃圾指令的影响。
从005C85B4到005C87F8,随便找个MFC应用的OEP对比一下,看到它的神奇了吧。
005C8867处返回到用户代码0x40de8a处:
顺便说一下,OllyDBG的SFX功能或手工查找栈上的"SEH Record"也可以找到0040DE8A处,它是现实世界中执行的第一条用户程序指令。二.用户代码跟踪
本段代码列表显示了从MFC入口跟踪到我们所关注代码处的过程,期间含有大量的"VM CALL",其中代码的虚实转换非常有意思,可以观察到SecureEngine是怎么把他们组合到一起的。你可以跳过本节直接到第三节。0040DE8A 6A 02 PUSH 2
0040DE8C E8 EB747F77 CALL msvcrt.__set_app_type
0040DE91 90 NOP
0040DE92 59 POP ECX
...
0040DF80 6A 0A PUSH 0A
0040DF82 58 POP EAX
0040DF83 50 PUSH EAX
0040DF84 56 PUSH ESI
0040DF85 53 PUSH EBX
0040DF86 53 PUSH EBX
0040DF87 E8 33650900 CALL 004A44BF
0040DF8C 90 NOP
0040DF8D 50 PUSH EAX
0040DF8E E8 91000000 CALL 0040E024 ; <-***
0040DF93 8945 98 MOV [EBP-68], EAX
0040DF96 50 PUSH EAX
0040DF97 90 NOP
0040DF98 E8 E1BE7F77 CALL msvcrt.exit
...
0040E024 FF7424 10 PUSH DWORD PTR [ESP+10] ; 0000000A
0040E028 FF7424 10 PUSH DWORD PTR [ESP+10] ; 00152371
0040E02C FF7424 10 PUSH DWORD PTR [ESP+10] ; 00000000
0040E030 FF7424 10 PUSH DWORD PTR [ESP+10] ; 00400000
0040E034 E8 43000000 CALL 0040E07C
0040E039 C2 1000 RETN 10
...
0040E07C E9 AAEE9273 JMP mfc42.#1576
...
73D3CF2B > 8BFF MOV EDI, EDI ; in mfc42.dll
...
73D3CF71 FF50 58 CALL NEAR [EAX+58] ; back to 004013D0
...
004013D0 55 PUSH EBP
004013D1 8BEC MOV EBP, ESP
004013D3 6A FF PUSH -1
004013D5 68 F3E04000 PUSH 0040E0F3
004013DA 64:A1 00000000 MOV EAX, FS:[0]
004013E0 50 PUSH EAX
004013E1 64:8925 00000000 MOV FS:[0], ESP
004013E8 81EC C4010000 SUB ESP, 1C4
004013EE 53 PUSH EBX
004013EF 56 PUSH ESI
004013F0 57 PUSH EDI
004013F1 8BF1 MOV ESI, ECX
004013F3 E8 D2C70000 CALL 0040DBCA
004013F8 E9 57081E00 JMP 005E1C54
...
005E1C54 68 2D5B7D13 PUSH 137D5B2D ; VM1_137D5B2D
005E1C59 E9 9EDBE3FF JMP 0041F7FC ; VM1_EXIT back to 004044E0
...
004044E0 6A FF PUSH -1
004044E2 68 20E94000 PUSH 0040E920
004044E7 64:A1 00000000 MOV EAX, FS:[0]
...
004045A2 64:890D 00000000 MOV FS:[0], ECX
004045A9 81C4 1C010000 ADD ESP, 11C
004045AF C3 RETN ; return to 005DCA83
...
005DCA83 68 5B957D13 PUSH 137D955B ; 以下"VM CALL"依次执行
005DCA88 E9 6F2DE4FF JMP 0041F7FC
005DCA8D 68 36977D13 PUSH 137D9736
005DCA92 E9 652DE4FF JMP 0041F7FC
005DCA97 68 F1987D13 PUSH 137D98F1
005DCA9C E9 5B2DE4FF JMP 0041F7FC
005DCAA1 68 A69A7D13 PUSH 137D9AA6
005DCAA6 E9 512DE4FF JMP 0041F7FC
005DCAAB 68 E79B7D13 PUSH 137D9BE7
005DCAB0 E9 472DE4FF JMP 0041F7FC
005DCAB5 68 2B9D7D13 PUSH 137D9D2B
005DCABA E9 3D2DE4FF JMP 0041F7FC
005DCABF 68 C99D7D13 PUSH 137D9DC9
005DCAC4 E9 332DE4FF JMP 0041F7FC
005DCAC9 68 F19E7D13 PUSH 137D9EF1
005DCACE E9 292DE4FF JMP 0041F7FC
005DCAD3 68 80A07D13 PUSH 137DA080
005DCAD8 E9 1F2DE4FF JMP 0041F7FC
005DCADD 68 98A17D13 PUSH 137DA198
005DCAE2 E9 152DE4FF JMP 0041F7FC
005DCAE7 68 95A27D13 PUSH 137DA295
005DCAEC E9 0B2DE4FF JMP 0041F7FC
005DCAF1 68 50A37D13 PUSH 137DA350
005DCAF6 E9 012DE4FF JMP 0041F7FC
005DCAFB 68 A2A47D13 PUSH 137DA4A2
005DCB00 E9 F72CE4FF JMP 0041F7FC
005DCB05 68 6DA67D13 PUSH 137DA66D
005DCB0A E9 ED2CE4FF JMP 0041F7FC
005DCB0F 68 05A77D13 PUSH 137DA705
005DCB14 E9 E32CE4FF JMP 0041F7FC
005DCB19 68 42A87D13 PUSH 137DA842
005DCB1E E9 D92CE4FF JMP 0041F7FC
005DCB23 68 63A97D13 PUSH 137DA963
005DCB28 E9 CF2CE4FF JMP 0041F7FC
005DCB2D 68 FFA97D13 PUSH 137DA9FF
005DCB32 E9 C52CE4FF JMP 0041F7FC
005DCB37 68 28AB7D13 PUSH 137DAB28
005DCB3C E9 BB2CE4FF JMP 0041F7FC ; VM1_EXIT to 00401541
...
00401541 E9 C93A1E00 JMP 005E500F
...
005E500F 68 6FAC7D13 PUSH 137DAC6F
005E5014 E9 E3A7E3FF JMP 0041F7FC ; VM1_EXIT to 00404C10
...
00404C10 55 PUSH EBP
00404C11 8BEC MOV EBP, ESP
00404C13 6A FF PUSH -1
00404C15 68 90EA4000 PUSH 0040EA90
00404C1A 64:A1 00000000 MOV EAX, FS:[0]
00404C20 50 PUSH EAX
00404C21 64:8925 00000000 MOV FS:[0], ESP
00404C28 81EC 28070000 SUB ESP, 728
00404C2E 53 PUSH EBX
00404C2F 56 PUSH ESI
00404C30 57 PUSH EDI
00404C31 E9 78E22000 JMP 00612EAE ; <-***
...
00612EAE 68 D22D8013 PUSH 13802DD2 ; <-***
00612EB3 E9 44C9E0FF JMP 0041F7FC 三.用户代码中的校验分析
00404C31处的JMP指向"VM CALL":VM1_13802DD2。“机关”就在这个里面,再次祭出"Oreans UnVirtualizer"进行UnVirtualizing。
处理CISC虚拟机VM1的Handlers:
反虚拟化真实地址:
反虚拟化完成:
“反虚拟化”后(以下全部为正确流程,否则就去msvcrt.exit了):00404C31 /EB 10 JMP SHORT 00404C43
00404C33 |90 NOP
00404C34 |90 NOP
00404C35 |90 NOP
00404C36 |90 NOP
00404C37 |90 NOP
00404C38 |90 NOP
00404C39 |90 NOP
00404C3A |90 NOP
00404C3B |90 NOP
00404C3C |90 NOP
00404C3D |90 NOP
00404C3E |90 NOP
00404C3F |90 NOP
00404C40 |90 NOP
00404C41 |90 NOP
00404C42 |90 NOP
00404C43 \8D45 DC LEA EAX, [EBP-24]
00404C46 50 PUSH EAX
00404C47 E8 94F8FFFF CALL 004044E0 ; Get CurrentFolder to [EBP-24], "C:\Temp"
00404C4C 83C4 04 ADD ESP, 4
00404C4F 68 E8444100 PUSH 004144E8 ; ASCII "\regkey.dat"
00404C54 8D4D D8 LEA ECX, [EBP-28]
00404C57 50 PUSH EAX
00404C58 51 PUSH ECX
00404C59 C745 FC 00000000 MOV DWORD PTR [EBP-4], 0
00404C60 E8 5F8F0000 CALL 0040DBC4 ; mfc42.#924, string cat, "C:\Temp\regkey.dat"
00404C65 8B00 MOV EAX, [EAX]
00404C67 50 PUSH EAX
00404C68 FF15 34004100 CALL NEAR [410034] ; [00410034]=02B30000, kernel32.GetFileAttributesW, ret EAX=00000020
00404C6E 83CF FF OR EDI, FFFFFFFF
00404C71 8D4D D8 LEA ECX, [EBP-28]
00404C74 39F8 CMP EAX, EDI
00404C76 0F94C3 SETE BL
00404C79 E8 028E0000 CALL 0040DA80
00404C7E 8D4D DC LEA ECX, [EBP-24]
00404C81 897D FC MOV [EBP-4], EDI
00404C84 E8 F78D0000 CALL 0040DA80
00404C89 84DB TEST BL, BL
00404C8B /74 1C JE SHORT 00404CA9
00404C8D |8B55 08 MOV EDX, [EBP+8] ; 0012FEAC, [0012FEAC]=001605F0
00404C90 |5F POP EDI
00404C91 |5E POP ESI
00404C92 |31C0 XOR EAX, EAX
00404C94 |C702 91010000 MOV DWORD PTR [EDX], 191
00404C9A |5B POP EBX
00404C9B |8B4D F4 MOV ECX, [EBP-C]
00404C9E |64:890D 00000000 MOV FS:[0], ECX
00404CA5 |89EC MOV ESP, EBP
00404CA7 |5D POP EBP
00404CA8 |C3 RETN
00404CA9 \E8 70930000 CALL 0040E01E ; VM1_137B4E2A, ret eax=00000001
调用0040E01E实际上就是虚拟化后的SDK函数:bool WLRegCheckMachineLocked(void);
if 只想使用目标程序 goto :EOF else goto Label_请继续往下看 005C88A7 68 68E57B13 PUSH 137BE568 ; VM OEP by LCF-AT
005C88AC E9 4B6FE5FF JMP 0041F7FC ... ; 此处省略数十行
@Label_005C8331
005C8331 PUSH DWORD PTR [ESP]
005C834D MOV EBP,DWORD PTR [ESP]
005C836E ADD ESP,0x4
005C8397 ADD ESP,0x4
005C83F4 PUSH DWORD PTR [ESP]
005C840A MOV EAX,DWORD PTR [ESP]
005C8426 ADD ESP,0x4
005C846D ADD ESP,0x4
005C8488 MOV EBX,DWORD PTR [ESP]
005C849E PUSH ECX
005C84A5 MOV ECX,ESP
005C84B4 ADD ECX,0x4
005C84CE ADD ECX,0x4
005C8518 PUSH DWORD PTR [ESP]
005C851F MOV DWORD PTR [ESP],ECX
005C8582 POP ECX
005C85AC POP ESP ; <-***
005C85B4 PUSH EBP ; emulating OEP of MFC started here
005C85BD MOV EBP,ESP
005C85D3 PUSH 0xff
005C85D8 PUSH 0x411670
005C8603 PUSH 0x40dfec ; SE handler installation
005C863A MOV EAX,DWORD PTR FS:[0x0]
005C86AA PUSH EAX
005C86BD MOV DWORD PTR FS:[0x0],ESP
005C86CC SUB ESP,0x68
005C8732 PUSH EBX
005C8747 PUSH ESI
005C8755 PUSH EDI
005C8768 MOV DWORD PTR [EBP+0xffffffe8],ESP ; [EBP-18]
005C8798 XOR EBX,EBX
005C87F8 MOV DWORD PTR [EBP+0xfffffffc],EBX ; [EBP-04]
005C8867 JMP 0x40de8a ; back to the real world 0040DE8A 6A 02 PUSH 2
0040DE8C E8 EB747F77 CALL msvcrt.__set_app_type
0040DE91 90 NOP
0040DE92 59 POP ECX
...
0040DF80 6A 0A PUSH 0A
0040DF82 58 POP EAX
0040DF83 50 PUSH EAX
0040DF84 56 PUSH ESI
0040DF85 53 PUSH EBX
0040DF86 53 PUSH EBX
0040DF87 E8 33650900 CALL 004A44BF
0040DF8C 90 NOP
0040DF8D 50 PUSH EAX
0040DF8E E8 91000000 CALL 0040E024 ; <-***
0040DF93 8945 98 MOV [EBP-68], EAX
0040DF96 50 PUSH EAX
0040DF97 90 NOP
0040DF98 E8 E1BE7F77 CALL msvcrt.exit
...
0040E024 FF7424 10 PUSH DWORD PTR [ESP+10] ; 0000000A
0040E028 FF7424 10 PUSH DWORD PTR [ESP+10] ; 00152371
0040E02C FF7424 10 PUSH DWORD PTR [ESP+10] ; 00000000
0040E030 FF7424 10 PUSH DWORD PTR [ESP+10] ; 00400000
0040E034 E8 43000000 CALL 0040E07C
0040E039 C2 1000 RETN 10
...
0040E07C E9 AAEE9273 JMP mfc42.#1576
...
73D3CF2B > 8BFF MOV EDI, EDI ; in mfc42.dll
...
73D3CF71 FF50 58 CALL NEAR [EAX+58] ; back to 004013D0
...
004013D0 55 PUSH EBP
004013D1 8BEC MOV EBP, ESP
004013D3 6A FF PUSH -1
004013D5 68 F3E04000 PUSH 0040E0F3
004013DA 64:A1 00000000 MOV EAX, FS:[0]
004013E0 50 PUSH EAX
004013E1 64:8925 00000000 MOV FS:[0], ESP
004013E8 81EC C4010000 SUB ESP, 1C4
004013EE 53 PUSH EBX
004013EF 56 PUSH ESI
004013F0 57 PUSH EDI
004013F1 8BF1 MOV ESI, ECX
004013F3 E8 D2C70000 CALL 0040DBCA
004013F8 E9 57081E00 JMP 005E1C54
...
005E1C54 68 2D5B7D13 PUSH 137D5B2D ; VM1_137D5B2D
005E1C59 E9 9EDBE3FF JMP 0041F7FC ; VM1_EXIT back to 004044E0
...
004044E0 6A FF PUSH -1
004044E2 68 20E94000 PUSH 0040E920
004044E7 64:A1 00000000 MOV EAX, FS:[0]
...
004045A2 64:890D 00000000 MOV FS:[0], ECX
004045A9 81C4 1C010000 ADD ESP, 11C
004045AF C3 RETN ; return to 005DCA83
...
005DCA83 68 5B957D13 PUSH 137D955B ; 以下"VM CALL"依次执行
005DCA88 E9 6F2DE4FF JMP 0041F7FC
005DCA8D 68 36977D13 PUSH 137D9736
005DCA92 E9 652DE4FF JMP 0041F7FC
005DCA97 68 F1987D13 PUSH 137D98F1
005DCA9C E9 5B2DE4FF JMP 0041F7FC
005DCAA1 68 A69A7D13 PUSH 137D9AA6
005DCAA6 E9 512DE4FF JMP 0041F7FC
005DCAAB 68 E79B7D13 PUSH 137D9BE7
005DCAB0 E9 472DE4FF JMP 0041F7FC
005DCAB5 68 2B9D7D13 PUSH 137D9D2B
005DCABA E9 3D2DE4FF JMP 0041F7FC
005DCABF 68 C99D7D13 PUSH 137D9DC9
005DCAC4 E9 332DE4FF JMP 0041F7FC
005DCAC9 68 F19E7D13 PUSH 137D9EF1
005DCACE E9 292DE4FF JMP 0041F7FC
005DCAD3 68 80A07D13 PUSH 137DA080
005DCAD8 E9 1F2DE4FF JMP 0041F7FC
005DCADD 68 98A17D13 PUSH 137DA198
005DCAE2 E9 152DE4FF JMP 0041F7FC
005DCAE7 68 95A27D13 PUSH 137DA295
005DCAEC E9 0B2DE4FF JMP 0041F7FC
005DCAF1 68 50A37D13 PUSH 137DA350
005DCAF6 E9 012DE4FF JMP 0041F7FC
005DCAFB 68 A2A47D13 PUSH 137DA4A2
005DCB00 E9 F72CE4FF JMP 0041F7FC
005DCB05 68 6DA67D13 PUSH 137DA66D
005DCB0A E9 ED2CE4FF JMP 0041F7FC
005DCB0F 68 05A77D13 PUSH 137DA705
005DCB14 E9 E32CE4FF JMP 0041F7FC
005DCB19 68 42A87D13 PUSH 137DA842
005DCB1E E9 D92CE4FF JMP 0041F7FC
005DCB23 68 63A97D13 PUSH 137DA963
005DCB28 E9 CF2CE4FF JMP 0041F7FC
005DCB2D 68 FFA97D13 PUSH 137DA9FF
005DCB32 E9 C52CE4FF JMP 0041F7FC
005DCB37 68 28AB7D13 PUSH 137DAB28
005DCB3C E9 BB2CE4FF JMP 0041F7FC ; VM1_EXIT to 00401541
...
00401541 E9 C93A1E00 JMP 005E500F
...
005E500F 68 6FAC7D13 PUSH 137DAC6F
005E5014 E9 E3A7E3FF JMP 0041F7FC ; VM1_EXIT to 00404C10
...
00404C10 55 PUSH EBP
00404C11 8BEC MOV EBP, ESP
00404C13 6A FF PUSH -1
00404C15 68 90EA4000 PUSH 0040EA90
00404C1A 64:A1 00000000 MOV EAX, FS:[0]
00404C20 50 PUSH EAX
00404C21 64:8925 00000000 MOV FS:[0], ESP
00404C28 81EC 28070000 SUB ESP, 728
00404C2E 53 PUSH EBX
00404C2F 56 PUSH ESI
00404C30 57 PUSH EDI
00404C31 E9 78E22000 JMP 00612EAE ; <-***
...
00612EAE 68 D22D8013 PUSH 13802DD2 ; <-***
00612EB3 E9 44C9E0FF JMP 0041F7FC 00404C31 /EB 10 JMP SHORT 00404C43
00404C33 |90 NOP
00404C34 |90 NOP
00404C35 |90 NOP
00404C36 |90 NOP
00404C37 |90 NOP
00404C38 |90 NOP
00404C39 |90 NOP
00404C3A |90 NOP
00404C3B |90 NOP
00404C3C |90 NOP
00404C3D |90 NOP
00404C3E |90 NOP
00404C3F |90 NOP
00404C40 |90 NOP
00404C41 |90 NOP
00404C42 |90 NOP
00404C43 \8D45 DC LEA EAX, [EBP-24]
00404C46 50 PUSH EAX
00404C47 E8 94F8FFFF CALL 004044E0 ; Get CurrentFolder to [EBP-24], "C:\Temp"
00404C4C 83C4 04 ADD ESP, 4
00404C4F 68 E8444100 PUSH 004144E8 ; ASCII "\regkey.dat"
00404C54 8D4D D8 LEA ECX, [EBP-28]
00404C57 50 PUSH EAX
00404C58 51 PUSH ECX
00404C59 C745 FC 00000000 MOV DWORD PTR [EBP-4], 0
00404C60 E8 5F8F0000 CALL 0040DBC4 ; mfc42.#924, string cat, "C:\Temp\regkey.dat"
00404C65 8B00 MOV EAX, [EAX]
00404C67 50 PUSH EAX
00404C68 FF15 34004100 CALL NEAR [410034] ; [00410034]=02B30000, kernel32.GetFileAttributesW, ret EAX=00000020
00404C6E 83CF FF OR EDI, FFFFFFFF
00404C71 8D4D D8 LEA ECX, [EBP-28]
00404C74 39F8 CMP EAX, EDI
00404C76 0F94C3 SETE BL
00404C79 E8 028E0000 CALL 0040DA80
00404C7E 8D4D DC LEA ECX, [EBP-24]
00404C81 897D FC MOV [EBP-4], EDI
00404C84 E8 F78D0000 CALL 0040DA80
00404C89 84DB TEST BL, BL
00404C8B /74 1C JE SHORT 00404CA9
00404C8D |8B55 08 MOV EDX, [EBP+8] ; 0012FEAC, [0012FEAC]=001605F0
00404C90 |5F POP EDI
00404C91 |5E POP ESI
00404C92 |31C0 XOR EAX, EAX
00404C94 |C702 91010000 MOV DWORD PTR [EDX], 191
00404C9A |5B POP EBX
00404C9B |8B4D F4 MOV ECX, [EBP-C]
00404C9E |64:890D 00000000 MOV FS:[0], ECX
00404CA5 |89EC MOV ESP, EBP
00404CA7 |5D POP EBP
00404CA8 |C3 RETN
00404CA9 \E8 70930000 CALL 0040E01E ; VM1_137B4E2A, ret eax=00000001 00404CAE 84C0 TEST AL, AL ; Is locked to a specific machine?
00404CB0 /75 1C JNZ SHORT 00404CCE ; Yes
00404CB2 |8B45 08 MOV EAX, [EBP+8]
00404CB5 |5F POP EDI
00404CB6 |5E POP ESI
00404CB7 |5B POP EBX
00404CB8 |C700 92010000 MOV DWORD PTR [EAX], 192
00404CBE |31C0 XOR EAX, EAX
00404CC0 |8B4D F4 MOV ECX, [EBP-C]
00404CC3 |64:890D 00000000 MOV FS:[0], ECX
00404CCA |89EC MOV ESP, EBP
00404CCC |5D POP EBP
00404CCD |C3 RETN
00404CCE \8D8D CCF8FFFF LEA ECX, [EBP-734] ; 0012F5B0, pCustomData
00404CD4 8D95 CCFCFFFF LEA EDX, [EBP-334] ; 0012F9B0, pCompanyName
00404CDA 51 PUSH ECX
00404CDB 8D85 CCFDFFFF LEA EAX, [EBP-234] ; 0012FAB0, pName
00404CE1 52 PUSH EDX
00404CE2 50 PUSH EAX
00404CE3 E8 18930000 CALL 0040E000 ; VM1_137A376D, ret eax=00000001 00404CE8 84C0 TEST AL, AL ; Is succeeded?
00404CEA /75 1C JNZ SHORT 00404D08 ; Yes
00404CEC |8B4D 08 MOV ECX, [EBP+8]
00404CEF |5F POP EDI
00404CF0 |5E POP ESI
00404CF1 |31C0 XOR EAX, EAX
00404CF3 |C701 93010000 MOV DWORD PTR [ECX], 193
00404CF9 |5B POP EBX
00404CFA |8B4D F4 MOV ECX, [EBP-C]
00404CFD |64:890D 00000000 MOV FS:[0], ECX
00404D04 |89EC MOV ESP, EBP
00404D06 |5D POP EBP
00404D07 |C3 RETN
00404D08 \8D95 CCFDFFFF LEA EDX, [EBP-234] ; pName
00404D0E 8D4D E8 LEA ECX, [EBP-18] ; 0012FCCC
00404D11 52 PUSH EDX
00404D12 E8 898E0000 CALL 0040DBA0 ; mfc42.#537, copy to [EBP-18]
00404D17 8D85 CCF8FFFF LEA EAX, [EBP-734] ; pCustomData
00404D1D 8D4D F0 LEA ECX, [EBP-10]
00404D20 50 PUSH EAX
00404D21 C745 FC 01000000 MOV DWORD PTR [EBP-4], 1
00404D28 E8 738E0000 CALL 0040DBA0 ; mfc42.#537, copy to [EBP-10]
00404D2D 8B4D E8 MOV ECX, [EBP-18]
00404D30 C645 FC 02 MOV BYTE PTR [EBP-4], 2
00404D34 8B41 F8 MOV EAX, [ECX-8] ; length of Name
00404D37 83F8 02 CMP EAX, 2
00404D3A 0F8C D7020000 JL 00405017
00404D40 83F8 0A CMP EAX, 0A ; 0x02 <= length of Name <= 0x0A
00404D43 0F8F CE020000 JG 00405017 00404D49 8B55 F0 MOV EDX, [EBP-10]
00404D4C 8B42 F8 MOV EAX, [EDX-8] ; length of CustomData
00404D4F 83F8 31 CMP EAX, 31
00404D52 0F8F B4020000 JG 0040500C
00404D58 83F8 27 CMP EAX, 27
00404D5B 0F8C AB020000 JL 0040500C ; 0x27 <= length of CustomData <= 0x31 00404D61 68 E4444100 PUSH 004144E4 ; pointer to delimiter char: 0x7C('|')
00404D66 8D4D F0 LEA ECX, [EBP-10]
00404D69 E8 4C8F0000 CALL 0040DCBA ; mfc42.#2764, search '|' in CustomData string 00404D6E 50 PUSH EAX
00404D6F 8D45 E0 LEA EAX, [EBP-20]
00404D72 50 PUSH EAX
00404D73 8D4D F0 LEA ECX, [EBP-10]
00404D76 E8 1F8E0000 CALL 0040DB9A ; mfc42.#4129, get Name string in CustomData to [EBP-20]
00404D7B 8B4D F0 MOV ECX, [EBP-10]
00404D7E 68 E4444100 PUSH 004144E4
00404D83 C645 FC 03 MOV BYTE PTR [EBP-4], 3
00404D87 8B71 F8 MOV ESI, [ECX-8]
00404D8A 8D4D F0 LEA ECX, [EBP-10]
00404D8D E8 288F0000 CALL 0040DCBA
00404D92 29C6 SUB ESI, EAX
00404D94 8D55 EC LEA EDX, [EBP-14]
00404D97 4E DEC ESI
00404D98 8D4D F0 LEA ECX, [EBP-10]
00404D9B 56 PUSH ESI
00404D9C 52 PUSH EDX
00404D9D E8 488F0000 CALL 0040DCEA ; mfc42.#5710, RString(ecx, esi) to [EBP-10]: get Hardware ID sting in CustomData
00404DA2 8B4D E0 MOV ECX, [EBP-20] ; pName
00404DA5 C645 FC 04 MOV BYTE PTR [EBP-4], 4
00404DA9 8B41 F8 MOV EAX, [ECX-8] ; length of Name
00404DAC 83F8 02 CMP EAX, 2
00404DAF 0F8C 34020000 JL 00404FE9
00404DB5 83F8 14 CMP EAX, 14
00404DB8 0F8F 2B020000 JG 00404FE9 ; 2<= length of Name <=0x14
00404DBE 8B45 E8 MOV EAX, [EBP-18]
00404DC1 50 PUSH EAX ; EAX 003853D8 ASCII "MistHill", get by function WLRegGetLicenseInfo
00404DC2 51 PUSH ECX ; ECX 00385428 ASCII "MistHill", from CustomData
00404DC3 FF15 D8024100 CALL NEAR [4102D8] ; msvcrt._mbsicmp, if Name matches ret eax=0, else eax=FFFFFFFF
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
上传的附件: