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

...全文
93 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sbnth 2002-08-24
  • 打赏
  • 举报
回复
你说的哦,抢分,^_^
dot99 2002-08-22
  • 打赏
  • 举报
回复
帮我啊,我极度疑惑中~~~~~
分还可以加~~~~

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧