步骤如下
1 .程序链接 http://pan.baidu.com/s/1bSPUdK
2.这是一个vb程序,ida不能看出什么,只能靠OD了。首先打开程序查看界面以及填入name和serial后的弹出的关键字符串。
3.打开OD,定位关键字符串的位置,然后寻找关键跳转,发现是在0040258b的位置,往前看是test esi,esi 。
寻找一下esi的来源,发现时00402533位置的比较字符串函数的返回值,在此处下断点,在堆栈中发现了两个字符串AKA-585235和111111,一个是我们输入的serial,另一个应该我输入的name处理后的结果,继续向上寻找这个字符串的来源。在00402523位置的函数时一个字符串连接函数,把AKA和585235连接在一起,
继续往前找585235的位置,发现在4024f4d处的函数调用以后,在堆栈中出现了585235,记下它的地址0014e3dc,
重新运行程序到004024f4的位置,在内存区设置0014e3dc位置设置内存访问断点,然后运行程序,
程序停在了7c84c3A1的位置,查看堆栈,发现出现了585235字符,记下它的地址008fbc80,
然后重新运行程序,停在004024f4的位置,查看内存008fbc80的内容,发现还不是585235,然后f9运行直到找到对其赋值的位置,记下此时的地址,0014db00,
然后重新运行程序到004024f4的位置,在内存区寻找这个位置发现是585235,
继续往前找寻找它的来源,在004024c1的位置下断点,看一下此时它的数据是否有所变化,下面我的灵感来源于我对程序测试的结果,在程序中name输入123456和111111,serial都是585235,刚开始我以为这是一个固定的字符串,后来我输入1234567的时候,发现不一样了,于是我想着去找一下获取字符串长度的函数。在IDA中找到函数__vbaLenBstr,记下它的地址,在OD中找到这个位置00402415,返回值eax是5,然后后面就是eax乘以0x17cfb赋给edi,然后调用rtcansivaluebstr函数,网上查资料该函数是获取第一个字符的ascii值,得到eax=0x31即ax=31,最后得到edi的值为6*0x17cfb+0x31=0x8ee13,然后程序调用__vbastri4函数,即把十进制数转变为字符串即0x8ee13的十进制数位585235,转变为字符串“585235”,然后就得到这个585235,到此整个流程就很清楚了。
4.转化为c代码为:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char name[10];
int len=0,key=0;
scanf("%s",&name);
len=strlen(name);
key=len*0x17cfb+name[0];
printf("AKA-");
printf("%d\n",key);
system("pause");
return 0;
}