能力值:
( LV6,RANK:90 )
|
-
-
CFileDialog类源代码问题?
以'\0'作为多个字符串分割符,当字符串长度为0时表示结束。
如
需要表示多个字符串 ".ZIP", ".TXT"
在此字符串中的存储为 ".ZIP\0.TXT\0\0"
|
能力值:
( LV6,RANK:90 )
|
-
-
[分享&挑战]sekurlsa.dll逆向分析challenge(可能发现windows系统账号存储机制的小秘密)
简单分析了下,DLL本身没有解密代码,结合了两个DLL获取了密码的原文。
有兴趣的同学,可以继续深入分析。
这里给出我分析几个点
1 通过 LsaEnumerateLogonSessions() 获取活动Session的LUID
2 在模块 wdigest 中
.text:7EAC538A 008 8B 0D AC E2 AC 7E mov ecx, ?l_LogSessList@@3U_LIST_ENTRY@@A ; _LIST_ENTRY l_LogSessList
.text:7EAC5390 008 8B 45 08 mov eax, [ebp+arg_0]
.text:7EAC5393 008 89 08 mov [eax], ecx
.text:7EAC5395 008 C7 40 04 AC E2 AC 7E mov dword ptr [eax+4], offset ?l_LogSessList@@3U_LIST_ENTRY@@A ; _LIST_ENTRY l_LogSessList
获取导出变量地址 ?l_LogSessList@@3U_LIST_ENTRY@@A ; _LIST_ENTRY l_LogSessList
l_LogSessList 变量地址 sekurlsa 10035868
3 遍历l_LogSessList 得到 指定LUID的密码密文。
枚举列表处理地址 sekurlsa 10014B80
4 调用在模块 lsasrv 中 内部函数LsaUnprotectMemory进行解密
LsaUnprotectMemory函数指针保存在 sekurlsa 10035870
 佩服作者对系统安全机制的研究深度
PS: getWDigest导出函数也可以获取密码。
不早了,明天还要Working。
|
能力值:
( LV6,RANK:90 )
|
-
-
关于vs2010的reloc
Linker 时加参数 /FIXED
参考 http://msdn.microsoft.com/zh-cn/library/w368ysh2%28v=VS.100%29.aspx
|
能力值:
( LV6,RANK:90 )
|
-
-
[讨论]第三题,抛砖引玉
我也一段Name的计算代码
int sub_4078E0(char* a0)
{
char *p = a0;
while (*p)
{
p++;
p++;
if (*(p-1) == '\0')
{
return p-a0-1;
}
p++;
if (*(p-1) == '\0')
{
return p-a0-1;
}
p++;
if (*(p-1) == '\0')
{
return p-a0-1;
}
}
return p+1-a0-1;
}
char *memcpy_r(char* a0, char* a4, int a8)
{
char *p = a0;
while (a8>0)
{
*p = *(a4-a0+p);
p++;
a8--;
}
return a0;
}
int bswap(int n)
{
_asm {
mov eax, n
bswap eax
mov n, eax
}
return n;
}
void my_sha1_compile(sha1_ctx ctx[1])
{
sha1_compile(ctx);
return;
}
void my_sha1_hash(sha1_ctx ecx[1], char* a0, int a4)
{
int eax = ((ecx->count[0]>>3) & 0x3f);
ecx->count[0] += a4*8;
if (ecx->count[0] < (sha1_32t)a4*8)
{
ecx->count[1]++;
}
ecx->count[1] += (a4>>29);
if (a4 < (0x40 - eax))
{
memcpy_r((char*)ecx->wbuf+eax, a0, a4);
return;
}
memcpy_r((char*)ecx->wbuf+eax, a0, (0x40 - eax));
my_sha1_compile(ecx);
int va4 = (0x40 - eax);
int ebp = va4+0x3f;
char* ebx = (char*)ecx->wbuf+0x100;
if (ebp < a4)
{
do {
my_sha1_compile(ecx);
va4 += 0x40;
ebp += 0x40;
ebx += 0x100;
} while(ebp < a4);
}
memcpy_r((char*)ecx->wbuf, a0+va4, a4-va4);
return;
}
void my_sha1_end(sha1_ctx ecx[1], char* a0)
{
char v1c[8] = {0};
*(int*)(v1c+4) = ecx->count[0];
*(int*)(v1c) = ecx->count[1];
int ecx1;
for (ecx1=0; ecx1<2; ecx1++)
{
*(int*)(v1c+ecx1*4) = bswap(*(int*)(v1c+ecx1*4));
}
sha1_32t i = (sha1_32t)((ecx->count[0]>>3) & 0x3f);
static char s_byte_40CD50[64] = {'\x80'};
my_sha1_hash(ecx, s_byte_40CD50, (i<56?56-i:120-56));
my_sha1_hash(ecx, v1c, 8);
char v14[20];
for (ecx1=0; ecx1<5; ecx1++)
{
*(int*)(v14+ecx1*4) = bswap(ecx->hash[ecx1]);
}
memcpy_r(a0, v14, 20);
memset(ecx->hash, 0, 20);
return;
}
bool sub_401000(int ecx, char *edi, char *a0)
{
char v30[32+12] = {0};
if (edi == NULL || a0 == NULL)
{
return false;
}
DWORD dwVolumeSerialNumber;
GetVolumeInformationA("C:\\", NULL, 0, &dwVolumeSerialNumber, NULL,NULL, NULL, 0);
memcpy_r(v30, a0, ecx);
*(DWORD*)(v30+ecx) = dwVolumeSerialNumber;
memcpy_r(v30+ecx+4, "Tencent", sub_4078E0("Tencent"));
sha1_ctx v8c;
sha1_begin(&v8c);
v8c.hash[0] = 0xB1CAB1CA;
v8c.hash[1] = 0xCCBFCCBF;
v8c.hash[2] = 0xBFB2D6BE;
v8c.hash[3] = 0xF8C7D8B5;
v8c.hash[4] = 0xEEC7BCCD;
my_sha1_hash(&v8c, v30, ecx+11);
my_sha1_end(&v8c, edi);
return true;
}
sha1系列函数的代码,到网上搜吧
|
能力值:
( LV6,RANK:90 )
|
-
-
[讨论]第三题,抛砖引玉
我也来一段计算的代码
void GetCode(unsigned char p[20], char code[32])
{
int ebp = 0;
int ebx = 0;
int esi = 0;
char str[33] = "ABCDEFGHJKMNPQRSTVWXYZ1234567890";
int flag[][2] =
{
{0xF8, -3},
{0x07, 2}, //+
{0xC0, -6},
{0x3E, -1},
{0x01, 4}, //+
{0xF0, -4},
{0x0F, 1}, //+
{0x80, -7},
{0x7C, -2},
{0x03, 3}, //+
{0xE0, -5},
{0x1F, 0}, //+
{0xF8, -3},
{0x07, 2}, //+
{0xC0, -6},
{0x3E, -1},
{0x01, 4}, //+
{0xF0, -4},
{0x0F, 1}, //+
{0x80, -7},
{0x7C, -2},
{0x03, 3}, //+
{0xE0, -5},
{0x1F, 0}, //+
{0xF8, -3},
{0x07, 2}, //+
{0xC0, -6},
{0x3E, -1},
{0x01, 4}, //+
{0xF0, -4},
{0x0F, 1}, //+
{0x80, -7},
{0x7C, -2},
{0x03, 3}, //+
{0xE0, -5},
{0x1F, 0}, //+
{0xF8, -3},
{0x07, 2}, //+
{0xC0, -6},
{0x3E, -1},
{0x01, 4}, //+
{0xF0, -4},
{0x0F, 1}, //+
{0x80, -7},
{0x7C, -2},
{0x03, 3}, //+
{0xE0, -5},
{0x1F, 0}, //+
};
int t20 = 0;
int t32 = 0;
int da = 0;
while (esi<20)
{
t20 |= flag[ebx][0];
t32 |= flag[ebx][1]>0?(flag[ebx][0]<<flag[ebx][1]):(flag[ebx][0]>>-flag[ebx][1]);
int t = (flag[ebx][0]&p[esi]);
da |= flag[ebx][1]>0?(t<<flag[ebx][1]):(t>>-flag[ebx][1]);
if (t20==0xff)
{
t20 = 0;
esi++;
}
if (t32==0x1f)
{
code[ebp] = str[da];
ebp++;
da = 0;
t32 = 0;
}
ebx++;
}
}
|