新CrackMe160之153 - Cobra's - Crackme

  1. 去弹框
    OD载入程序,搜索界面找到弹框提示词00401840处,向上看到由0040180E跳转而来~, 同处上下有几处跳转, 猜测下一个跳为主界面, 所以把当前跳改为下一个跳
    即,将0040180E这行改为je 00401874, 保存修改,运行测试正常~

  2. 去灰
    重新载入去NAG程序, 运行后发现菜单中的注册按钮是灰的, 接下来就开始去灰, 搜索界面打开后,可以看到很多关键词, 每个都双击定位到左侧代码区域对应看是什么功能
    很快可以发现前面几个一样的"Software\Cobra"对应的代码区域中有RegOpenKeyA, RegCreateKeyA, RegDeleteKeyA的系统关键字样,是操作注册表的,分别对这三个方法头下断点
    重新运行程序,发现程序断点在00401290(RegOpenKeyA)这个方法中了, 返回结果eax=2,此时注册表中没有这个选项, 00401540处判断这个值如果为0, local17=0x6C, 否则就=0x67
    所以这个6C跟67是有问题的,判断结果为不跳, 我们强制让它跳(修改寄存器Z值为1,双击即可修改), 运行后,发现Register按钮不灰了, 所以把判断跳转这行改为强制跳转
    即将00401540这行改为 jmp 0040154B就实现去灰了

  3. 破解
    重新载入保存后的程序, 搜索界面直接定位到成功关键词00401773,向上可看到关键算法就一个方法00401725,下好断点,F7进入方法再F8单步跟踪分析算法
    直接对着注册机看吧:

#include <stdio.h>
#include <string.h>

int main() {
	int i, len, eax, ebx = 0; 
	char user[30] = {0};
	printf("用户名: "); scanf("%s", user); getchar();
	len = strlen(user);
	if(len < 2){
		eax = user[0] + 5;
	} else {
		eax = user[len-1] + user[len-2];
	}
	eax = eax ^ 0x12C;
	eax = ((eax << 2) + eax) << 2;
	if(eax == 0) eax = 3;
	eax = eax >> 2;
	eax = eax & 0xF0F0F0F0;
	
	if(len < 2){
		ebx = 5;
	}else{
		ebx = user[1] + user[2];
	}
	ebx ^= 0x12C;
	ebx = ((ebx << 2) + ebx) << 2;
	if(ebx == 0) ebx = 3;
	ebx = ebx >> 2;
	ebx = ebx & 0xF0F0F0F0;
	
	printf("系列号: REG-%lX-%lX-KEY\n", eax, eax + ebx);
	getchar();
	return 0;
}

运行示例:
用户名: Test
系列号: REG-F0-1B0-KEY

 
 
本节高手录制的视频,点击前往查看

 
 
 
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~
OD界面布局

posted @ 2024-12-30 14:36  hankerstudio  阅读(19)  评论(0)    收藏  举报