-
-
[分享]看雪论坛.珠海金山2007逆向分析挑战赛
-
发表于:
2009-6-9 10:36
24409
-
【文章标题】: 看雪论坛.珠海金山2007逆向分析挑战赛
【文章作者】: finn
【编写语言】: c++
【使用工具】: SoftIce
【操作平台】: winxp sp2
【作者声明】: 初入逆向。失误之处敬请诸位大侠赐教!(未完待续。。)
【详细过程】
看雪论坛.珠海金山2007逆向分析挑战赛 第一阶段第一题
#include <iostream.h>
#include <string.h>
void main()
{
char UserID[10];
char serial[20];
unsigned char UserIDTable[10];
int UserIDLength;
unsigned ASM_EAX;
unsigned UserIDCalc;
unsigned ASM_ESI;
//输入用户名
cin>>UserID;
//得到输入的用户名的长度
UserIDLength=strlen(UserID);
//计算用户名的特征值前的一个变量赋予的初值
UserIDCalc=0x13572468;
//循环计算输入的用户名每一位
//用户名有几位就循环几次
for (int i=0; i<UserIDLength; i++)
{
ASM_EAX=(UserID[i]+UserIDCalc)*0x3721273+0x24681357;
ASM_ESI=ASM_EAX;
//逻辑左移0x19位(逻辑左移1位等价于数值*2)
//如果喜欢可以写个for循环,乘以2循环0x19次。。。
ASM_ESI=ASM_ESI<<=0x19;
//算术右移0x7位 (算术右移1位等价于数值/2)
//如果喜欢可以写个for循环,除以2循环0x7次。。。
//本来想用“ASM_EAX=ASM_EAX>>=0x7”
//后来发现不等价,随改用内联汇编。。。
__asm sar ASM_EAX,0x7;
ASM_ESI=ASM_EAX|ASM_ESI;
UserIDCalc=ASM_ESI;
}
//输出用户名特征值(与反汇编的对照一下看看是否正确)
//经过验证看来这个特征值是正确的。。。
for (int j=0; j<9; j++)
{
__asm sar UserIDCalc,j;
UserIDTable[j]=(unsigned char) (UserIDCalc&1);
}
UserIDTable[9]=1;
cout<<"UserID[0]="<<UserID[0]<<endl
<<"UserIDLength="<<UserIDLength<<endl
<<"UserIDCalc="<<UserIDCalc<<endl;
for (int k=0; k<9; k++)
{
cout<<"UserIDTable="<<UserIDTable[k]<<endl;
}
}
【经验总结】:
1)逻辑左移1位等价于数值*2,ASM_ESI<<=0x19
2)算术右移1位等价于数值/2,
3)“ASM_EAX>>=0x7 ” 不等价于 “ __asm sar ASM_EAX,0x7”
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2009年06月09日 9:20:38
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课