好友
阅读权限10
听众
最后登录1970-1-1
|
本人小白,初学汇编和破解,160个cm前20个里爆破了几个,后来试着逆向,因基础太差完全懵B,后来终于找到个看得懂的,感动啊发帖纪念一下。
本小白一上来查找字符串,这个前辈倒是爽快,就留了几个都是关键字符串,没为难小弟。
1
来到字符串位置,往前看了几个跳转,发现也是验证后成功就跳到成功,失败就跳到失败,没坑。
分析如下,前面绿色线框着的是个循环,中间不停比较bl和cl的值,jnz,如果值不一样就跳到失败的地方004015C3,如果一直一样,到比较完之后就无条件跳到成功的位置 004015D9,爆破的话把这个JNZ改Nop掉就可以了。但本小白已经不满足于爆破了,试着逆向一下看能不能找出算号规律,关键就是BL和CL 的值,而上面两句MOV:
mov bl,byte ptr ds:[eax]
mov cl,byte ptr ds:[edx]
就是给BL和CL赋值,看来关键就在这段内存中了。猜测一个是存放name的运算结果,一个是存放serial的运算结果。
2
再往前翻,发现这两句话,说明这两个值存在栈中
mov eax,dword ptr ss:[ebp-0x1C]
mov edx,dword ptr ss:[ebp-0x10]
再往前,又发现两个循环,读下来思路很清晰。前面把寄存器都清零,然后把ECX赋值1,进入第一个循环。
跟踪内存和堆栈发现,mov eax,[local.7]就是取name字符串的地址放在eax,然后bl读这个地址的数据,也就是name的首个字节,然后bl和cl异或再放回内存,然后cl+1,所以第二个字母和02异或,如此循环直到读出是0说明字符串结束。
第二个是serial的值,和0x0a异或,和0x0b异或....,然后放回内存,这样我们输入的name和serial就被异或成一堆乱七八糟的东西。。。
3
下面用C语言写了个算号器:
#include <stdio.h>
void main()
{
char name[16] = "\0";
char key[16]="\0";
int i=0;
printf("Please input the name:\n");
scanf("%s",&name);
while(name!=0)
{
key = name ^ (i+1) ^(i+0x0a);
i++;
}
printf("the key is %s\n",key);
system("pause");
}
思路就是name异或两次得到serial,验证结果也是正确的。另外有个需要注意的点是,前面有个地方调用了GetWindowTextLengthA,然后跟5比较,不大于则直接跳到失败的地方,说明name和serial都需要大于5个字符
4
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|