test:将两个操作数进行按位AND,设结果是TEMP,若TEMP为0则ZF为1,否则,ZF为0
cmp oprd1,oprd2:将第一个操作数减去第二个操作数
PS:
在函数内部呢,一般[ebp+8]是第一个参数,[ebp+C]是第二个参数,每次多加4依此类推。而函数内部的局部变量常用[ebp-4][ebp-8]...等等。(原因讲起来有点复杂,先记住就行了)函数的返回值在EAX里。
一
首先在OD中利用中文搜索找到报错字符串,在整个函数的入口处F2下断点(push ebp),之后按F9运行,键入
点击ok,OD停在了入口处,按F8进行单步调试,发现密钥产生代码
1 0040240F . 8B45 E4 mov eax,dword ptr ss:[ebp-0x1C] ; eax='vincebye' 2 00402412 . 50 push eax ; /String = NULL 3 00402413 . 8B1A mov ebx,dword ptr ds:[edx] ; | 4 00402415 . FF15 E4404000 call dword ptr ds:[<&MSVBVM50.__vbaLenBs>; \__vbaLenBstr 5 0040241B . 8BF8 mov edi,eax 6 0040241D . 8B4D E8 mov ecx,dword ptr ss:[ebp-0x18] 7 00402420 . 69FF FB7C0100 imul edi,edi,0x17CFB ; edi=edi*0x17CFB 8 00402426 . 51 push ecx ; /String = 37C6F27C ??? 9 00402427 . 0F80 91020000 jo Afkayas_.004026BE ; | 10 0040242D . FF15 F8404000 call dword ptr ds:[<&MSVBVM50.#rtcAnsiVa>; tcAnsiValueBstr 11 00402433 . 0FBFD0 movsx edx,ax 12 00402436 . 03FA add edi,edx ; edi=edi+edx 13 00402438 . 0F80 80020000 jo Afkayas_.004026BE 14 0040243E . 57 push edi 15 0040243F . FF15 E0404000 call dword ptr ds:[<&MSVBVM50.__vbaStrI4>; MSVBVM50.__vbaStrI4 16 00402445 . 8BD0 mov edx,eax ; 可能为密钥?
PS:
_vbaLenBs:计算字符串长度
rtcAnsiValueBstr:计算字符串ASCII值
_vbaStrI4:转化为长整型数值
算法:计算name的长度*0x17CFB+name第一个字符串的ASCII值,再转化为10进制数值,再最后在数值前面加上AKA-
注册机:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<iostream> 4 using namespace std; 5 int main() 6 { 7 printf("name:"); 8 char name[100]; 9 scanf("%s", name); 10 int first_value; 11 int length; 12 int value; 13 length = strlen(name); 14 first_value = name[0]; 15 value = length * 0x17CFB + first_value; 16 cout << "Code:"<<"AKA-"<<value << endl; 17 system("pause"); 18 }