-
-
[原创]第5题算法分析
-
发表于: 2017-6-10 11:58 3432
-
破解工具:OD,IDA,Python
在WinXP虚拟机中直接用OD载入CrackMe.exe,查看字符串参考,有明显提示“驱动释放失败,\n请在xp平台中重新运行crackme”,有驱动。
先不管驱动,继续往下跟,在00401593 call 00401AA0处加载驱动,加载成功后在004015CA call dword ptr [<&KERNEL32.DeleteFileA>]删除驱动文件,在004015D4 call 00402250里间隔100ms建立5个004022A0的进程,进程作用是每3000ms与驱动通信一次。
字符串参考里0042D16C处的字符串"888aeda4ab"看起来很可疑,到该段函数的第一行00401760下断,跳过建立进程代码运行后,输入注册码按回车,果然断下来了。
程序先对输入字符串格式化(试了一下只是大写转小写),然后把字符串逆序,004017C5 cmp dword ptr [ecx-0x8], 0x6检测长度是否为6,检测调试004017D1 call <jmp.&KERNEL32.IsDebuggerPresent>,检测标志位004017DE mov eax, dword ptr [esi+0x64]为0时直接退出,然后在004017FB call 00401D50与驱动交互。
可能是驱动里做了anti-debug,调试到call DeviceIoControl时程序就崩了。
先把程序跑起来然后再附加,设置的断点无效,硬件断点也不好使。
这里卡住了一会,想到一个取巧的办法,调试的程序里跳过驱动加载和进程检测,修改程序检测流程跑到call 00401D50里时停下来,另外再运行一个CrackMe.exe加载驱动,然后再到调试程序里CreateFileA连接驱动,跳过DeviceIoControl驱动通信,直接执行WriteFile传字符串给驱动、ReadFile从驱动读取结果,居然成功了。
看到驱动读取了0x10字节计算结果,转换成0x20字符串,返回主流程后,00401829 call 00401920再次计算转换为0x20字符串,提取(2,0x0A)测试是否为"888aeda4ab"。
整个流程有2个关键算法,一个在驱动里,一个在call 00401920里。
先看call 00401920,输出值像是MD5,找个MD5计算器对驱动处理结果进行MD5计算,果然与call 00401920计算结果一样。
再看驱动计算过程,也像是MD5,直接对输入值进行MD5计算,不正确。看来需要分析驱动了。
在驱动释放完成后先把驱动文件存出来:vmxdrv.sys。只有6K,拖到IDA里分析一下,在sub_108B2处发现了疑似MD5算法的初始化代代码:
int *__stdcall myMd5Init(int *a1)
{
int *result; // eax@1
result = a1;
*a1 = 0;
a1[1] = 0;
a1[2] = 0x67452301;
a1[3] = 0xEFCDAB89;
a1[4] = 0x98BADCFE;
a1[5] = 0x10325476;
return result;
}
查看调用,找到MD5计算过程:
void __stdcall myMd5Calc(char *a1, char *a2)
{
signed int v2; // eax@1
signed int v3; // esi@1
signed int v4; // eax@2
int v5; // [sp+Ch] [bp-6Ch]@6
char v6[16]; // [sp+64h] [bp-14h]@1
v6[0] = 0;
*(_DWORD *)&v6[1] = 0;
*(_DWORD *)&v6[5] = 0;
*(_DWORD *)&v6[9] = 0;
*(_WORD *)&v6[13] = 0;
v6[15] = 0;
v2 = strlen(a1);
v3 = v2;
if ( v2 <= 16 )
{
memcpy(v6, a1, v2);
v4 = 0;
if ( dword_11380 )
++v6[0];
if ( v3 > 0 )
{
do
{
v6[v4] += v4;
++v4;
}
while ( v4 < v3 );
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课