一个crackme keygen的部分代码出现的问题
dot99 2002-08-22 01:18:47 问题是在练习crackme的时候出现的
这个crackme有段注册号的算法
其中有用到
char * GetCommandLine();
GetVolumeInformation(
char* lpRootPathName,
char* lpVolumeNameBuffer,
long nVolumeNameSize,
long* lpVolumeSerialNumber,
long* lpMaximumComponentLength,
long* lpFileSystemFlags
);
其中用到的是lpRootPathName和lpVolumeSerialNumber
我用的是lcc写的
其中一段代码是(不是完全的keygen,只是得到生成key的一个参数ser序列号)
int main()
{
char* dtmp = GetCommandLine(); //Get cmd lines;
long int ser;
char droot[4];
for (int i = 0; i < 3; i++)
droot[i] = dtmp[i];
droot[3] = '\0';
GetVolumeInformation(droot, 0, 0, &ser, 0, 0, 0, 0);
if (ser == 0) {
printf("System Error, Exit!");
goto err;
}
printf("The serial number is: %x", ser);
err:
return 0;
}
追了一下crackme,发现droot的内容是 'E:\',0h
我写的这个东西droot的内容也是 'E:\',0h
但是,上面的这个keygen在调试的时候,ser为正确(与crackme的一样),然后单独运行的时候却是错误的
我追了一下crackme
发现dtmp(char * GetCommandLine()返回的指针)是这个样子的
dtmp[0] = '"'
dtnp[1...n]='E', ':', '\'......
即dtmp指向的字符为'"', 而不是'E'
于是我又写了一个
int main()
{
char* dtmp = GetCommandLine(); //Get cmd lines;
long int ser;
char droot[4];
droot[0] = dtmp[1];
droot[1] = dtmp[2];
droot[2] = dtmp[3];
droot[3] = '\0';
GetVolumeInformation(droot, 0, 0, &ser, 0, 0, 0, 0);
if (ser == 0) {
printf("System Error, Exit!");
goto err;
}
printf("The serial number is: %x", ser);
err:
while(!getchar());
return 0;
}
这回droot成了':\n',0h
但是,这个与上面哪个相反,调试的时候错误,但运行的时候正确(ser正确)
哪位告诉我为什么呢?
解决的话,到asm版,还有50分放在那里