-
-
[原创]crackme-分析算法写算号器
-
发表于: 2010-6-15 14:05 4609
-
呼~~~这个crackme用了我将近5小时,因为遇到了很多以前不懂得问题。不过写这篇帖子时我把我走的弯路都省略了。。。
点此下载
===================================程序分析=====================================
用od载入,在代码框(也许不叫代码框)中右键单击->查找->所有参考文本字串,看到这样一行:
双击进入,在上方发现了关键跳转。
在关键跳转前面的那个call上下断点,输入用户名phrain,序列号123456,点OK,然后停下来了:
同时注意到寄存器窗口:
可以确定"phrain",和"123456"是其参数。
现在F7单步进入,一路F8到这里:
注意EAX保存了"phrain"的指针。
再按F8,EAX=6,猜测为length函数,该函数与后面的三行一起,判断字符串是否为空。
接下来进入一个循环,这个循环对于像我们这样的汇编菜鸟来说很难理解,尤其是那个JGR和IMUL。
大致能明白它是将用户名串和"LANNYDIBANDINGINANAKEKHYANGNGENTOT"一起,来计算一个数存入EBX。
然后将EBX异或0x12345678,此时EBX=0x432F913C。
继续F8,到这里:
注意到"112790844"是该函数的返回值(事实上应该是指针或者引用),且112790844=0x432F913C=EBX。
可以推断这个函数是将数字转换为10进制表示的字符串。
继续F8到了这个循环:
实际上这只是将"112790844"倒序后进行字符替换而已:
0123456789
LANNY56465
得到的正确序列号为"YY6L54NAA"
继续F8:
很明显这是字符串比较函数。接下来的跟踪就不必要了。
===================================算法分析=====================================
算法已经比较明显了,以下是算号器代码(暂时不会win32编程):
===================================总结=====================================
基础知识不扎实啊。。。比如说这个程序EAX和EDX都是表示函数参数的,我就是没看出来。
还有JGR和IMUL以及TEST的用法都费了我不少时间。
点此下载
===================================程序分析=====================================
用od载入,在代码框(也许不叫代码框)中右键单击->查找->所有参考文本字串,看到这样一行:
双击进入,在上方发现了关键跳转。
在关键跳转前面的那个call上下断点,输入用户名phrain,序列号123456,点OK,然后停下来了:
同时注意到寄存器窗口:
可以确定"phrain",和"123456"是其参数。
现在F7单步进入,一路F8到这里:
注意EAX保存了"phrain"的指针。
再按F8,EAX=6,猜测为length函数,该函数与后面的三行一起,判断字符串是否为空。
接下来进入一个循环,这个循环对于像我们这样的汇编菜鸟来说很难理解,尤其是那个JGR和IMUL。
大致能明白它是将用户名串和"LANNYDIBANDINGINANAKEKHYANGNGENTOT"一起,来计算一个数存入EBX。
然后将EBX异或0x12345678,此时EBX=0x432F913C。
继续F8,到这里:
注意到"112790844"是该函数的返回值(事实上应该是指针或者引用),且112790844=0x432F913C=EBX。
可以推断这个函数是将数字转换为10进制表示的字符串。
继续F8到了这个循环:
实际上这只是将"112790844"倒序后进行字符替换而已:
0123456789
LANNY56465
得到的正确序列号为"YY6L54NAA"
继续F8:
很明显这是字符串比较函数。接下来的跟踪就不必要了。
===================================算法分析=====================================
算法已经比较明显了,以下是算号器代码(暂时不会win32编程):
//Dev-C++ 4.9.9.2下编译通过 #include <cstdlib> #include <cstdio> using namespace std; int main(){ const char c[11]="LANNY56465"; const char m[35]="LANNYDIBANDINGINANAKEKHYANGNGENTOT"; char s[35],i; unsigned x; scanf("%s",s); i=-1;x=0; while(s[++i]){ x=((x+s[i])<<8)|m[i]; if(int(x)<0)x=-x; } x=x^0x12345678; while(x){ printf("%c",c[x%10]); x/=10; } system("pause"); return 0; }
===================================总结=====================================
基础知识不扎实啊。。。比如说这个程序EAX和EDX都是表示函数参数的,我就是没看出来。
还有JGR和IMUL以及TEST的用法都费了我不少时间。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
- int13绝对读磁盘出错(已解决,求原因~) 3940
- [原创]将CrackMe改造成注册机 5751
- [原创]crackme-分析算法写算号器 4610
- [原创]crackme分析算法+暴力枚举求序列号 4939
- [原创]最简单的crackme,逆求序列号 3593
看原图
赞赏
雪币:
留言: