找入口
ctrl+f8
找到第一个入口点002f2283
分析一下,下面马上要到,exit函数退出,所以在这个点和下面一个call打下断点,然后重跟
f9跑到开始找到的入口点断点002f2283然后f8继续跟,进入输入界面,输入123123回车继续看,到下一列了,继续跟看下算法在哪,过了下一个call228d之后有个test 判定出来a1=00
然后就进入jnz判断,非0则跳,然后a1=00,所以不跳直接走到退出,所以002f228D是关键call关键算法应该在里面,现在重新跟
跟到这个关键call里面来
,发现跟下来并没有看见处理我们输入的地方,那就看下最初的入口call,重放一下
f7跟进2283,f8继续跟,跟到了一个输入,这个地方就是刚刚2283的输入,输入123123回车继续,跟到下一个call的时候已经看到在处理我们的输入了,
继续f8,走到11c0,一个cmp操作,比较0x10和eax寄存器的值,eax的值下面已经写出来了是00000006
,而我们输入的是123123,所以这里记录的应该是我们的长度,然后比较长度,所以长度应该为0x10也就是16位的值,下面就是je判断,应该不会跳直接往下走进入下一个call就退出。这里我们直接改标志位让他je通过,继续跟可以跟到这里movsx看下面框,他是取出第一个我们的输入值也就是1==0x31,然后进入一个call我们双击看下这个call
,可以看到一个算法,ecx*2-0x6寄存到eax,这一步在左边可以看到ecx==0x31==1也就是我们的第一个输入,然后下一步亦或eax,ecx亦或之后存在ecx,继续走,回到跟进之前的页面,继续跟,中间没有处理数据,直到跟到下一个call,
跟进去,继续算,eax=edx+edx,edx=0,所以eax=0,然后,ecx=ecx-eax,ecx=0x6D,eax=0,所以ecx=0x6D,然后,eax=ecx=0x6d,继续跟,返回,然后到movzx-->eax=0x6D,ecx=0xB9,用0x6D减去位数,也就是下标的2倍,第一轮还是0x6d,用0x6D拿来比较,猜测是每一个值去一个数来比较,先记下,我们继续跟,
比较然后不同sete-->d1=00 ,下面应该会je判断进入一个退出函数,因为第一个都错了,我们直接跳,jmp跳回去,循环到2,
现在是取第二个值2==0x32然后eax=eax^ecx=0x5E,继续,
现在eax=0x02所以可以猜测是已经改了下标知道第3个值了,edx还是1,继续,
ds=edx+0x2f5018这递增的这个起始地址的位置,我们找到这个地址,
开始第一个B9然后3A,证明猜想,然后我们看到原来的地方有个11c0,一个cmp操作,比较0x10,所以取16位,也就是B9 3A A9 D8 15 8A E7 42 69 90 CA A3 4D D8 D9 C9这16个,只要输入的东西经过运算之后等于这一串就可以绕过直接退出。
算法:
第一个call:ecx*2-0x6,eax^ecx,即时自身乘2-0x6,然后与自身亦或
第二个call:处理对比地址加的位数,这里可以理解为下标
然后写个脚本:
但是有点问题,跑出来有些项没有匹配