CLI内核随记(2)
今天有空,继续调试上次的壳。该壳下载地址http://www.secureteam.net。上一次并没有深入壳的解密流程,而是看了下虚方法的定位。今天的重点是壳解密流程。壳安装后有一个GUI主程序,一个本地dll。调试的重点就是这个本地dll。
这次仍然下断点在它挂钩JIT的地方。怎样激活这个断点?只要运行一个还没有JIT的方法既可。便于重复,这里固定为显示关于窗口。F9运行后,我们中断在hook方法的入口处:
再看一下椎栈,椎顶的值0x79E9776F指向了mscorwks.dll中调用JIT的地方,而第二个0x790AF170则指向了JIT中调用compileMethod的地方,自然,一调用compileMethod就跳转到hook的代码中来了。
下面的一段代码是调用CEEInfo::getMethodModule判断是否是当前Module需要JIT。如果是,继续执行解密过程,如果不是,自然不需要解密了。
012B2A4C |. 8B45 0C mov eax,dword ptr ss:[ebp+C]
012B2A4F |. 8B48 04 mov ecx,dword ptr ds:[eax+4]
012B2A52 |. 8B51 04 mov edx,dword ptr ds:[ecx+4]
012B2A55 |. 8B45 0C mov eax,dword ptr ss:[ebp+C]
012B2A58 |. 8B48 04 mov ecx,dword ptr ds:[eax+4]
012B2A5B |. 8B41 04 mov eax,dword ptr ds:[ecx+4]
012B2A5E |. 8B4D 0C mov ecx,dword ptr ss:[ebp+C]
012B2A61 |. 8D4401 04 lea eax,dword ptr ds:[ecx+eax+>
012B2A65 |. 8B4D 0C mov ecx,dword ptr ss:[ebp+C]
012B2A68 |. 8B5411 04 mov edx,dword ptr ds:[ecx+edx+>
012B2A6C |. 50 push eax
012B2A6D |. 8B42 30 mov eax,dword ptr ds:[edx+30]
012B2A70 |. FFD0 call eax;调用getMethodModule
012B2A72 |. 8945 F0 mov dword ptr ss:[ebp-10],eax
012B2A75 |. 8D4D F0 lea ecx,dword ptr ss:[ebp-10]
012B2A78 |. 51 push ecx
012B2A79 |. 8D55 F8 lea edx,dword ptr ss:[ebp-8]
012B2A7C |. 52 push edx
012B2A7D |. 8B8D 7CFFF>mov ecx,dword ptr ss:[ebp-84]
012B2A83 |. E8 88FEFFF>call CliSec_1.012B2910
012B2A88 |. 8D45 98 lea eax,dword ptr ss:[ebp-68]
012B2A8B |. 50 push eax
012B2A8C |. 8B8D 7CFFF>mov ecx,dword ptr ss:[ebp-84]
012B2A92 |. E8 89FAFFF>call CliSec_1.012B2520
012B2A97 |. 50 push eax
012B2A98 |. 8D4D F8 lea ecx,dword ptr ss:[ebp-8]
012B2A9B |. E8 80F7FFF>call CliSec_1.012B2220
012B2AA0 |. 0FB6C8 movzx ecx,al
012B2AA3 |. 85C9 test ecx,ecx
012B2AA5 |. 0F84 35020>je CliSec_1.012B2CE0;正常(需要解密)时这里不会跳
紧接着代码取方法的名称:
012B2AAB |. 8D55 B4 lea edx,dword ptr ss:[ebp-4C]
012B2AAE |. 52 push edx
012B2AAF |. 8B45 10 mov eax,dword ptr ss:[ebp+10]
012B2AB2 |. 8B08 mov ecx,dword ptr ds:[eax]
012B2AB4 |. 51 push ecx
012B2AB5 |. 8B55 0C mov edx,dword ptr ss:[ebp+C]
012B2AB8 |. 8B42 04 mov eax,dword ptr ds:[edx+4]
012B2ABB |. 8B48 04 mov ecx,dword ptr ds:[eax+4]
012B2ABE |. 8B55 0C mov edx,dword ptr ss:[ebp+C]
012B2AC1 |. 8B42 04 mov eax,dword ptr ds:[edx+4]
012B2AC4 |. 8B50 04 mov edx,dword ptr ds:[eax+4]
012B2AC7 |. 8B45 0C mov eax,dword ptr ss:[ebp+C]
012B2ACA |. 8D5410 04 lea edx,dword ptr ds:[eax+edx+>
012B2ACE |. 8B45 0C mov eax,dword ptr ss:[ebp+C]
012B2AD1 |. 8B4C08 04 mov ecx,dword ptr ds:[eax+ecx+>
012B2AD5 |. 52 push edx
012B2AD6 |. 8B11 mov edx,dword ptr ds:[ecx]
012B2AD8 |. FFD2 call edx ;这里调用.text:7A0A2503 CEEInfo::getMethodName