• 全部
  • 问答

一个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分放在那里

...全文
30 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
sbnth 2002-08-24
你说的哦,抢分,^_^
回复
dot99 2002-08-22
帮我啊,我极度疑惑中~~~~~
分还可以加~~~~
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-08-22 01:18
社区公告
暂无公告