文档章节

crackme6算法分析记录

enimey
 enimey
发布于 2014/03/22 11:15
字数 423
阅读 151
收藏 1

记录一次非明文的crackme分析记录,和注册机的编写。

下载地址:http://pan.baidu.com/s/1ntNTCBv

软件界面如下:

image

软件是加壳了的,脱壳很简单就不写了。

直接od载入,下断点bp GetDlgItemTextA,f9运行,输入Name:eni,Serial:T1,点击check,直接贴注释:

image

在关键call,f7跟进:

image

image

image

image

s2 = T294-96

关键call,f7跟进:

image

用java写的注册机算法:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class main {
	//private static char[] table = new char[]{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','S','Y','Z'};
	private static String table = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	
	public static void main(String[] args) {
		String name = null;
		System.out.println("请输入NAME:长度不大于9,不小于3");
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		try {
			while ((name=br.readLine())!=null) {
				System.out.print(name);
				if(name.length() < 3 || name.length() > 9) {
					System.out.println("NAME长度错误");
				}
				else {
					int name_length = name.length();
					int[] nameint = new int[10];
					int name_sum = 0;
				
					for(int i = 0; i < name_length; ++i) {
						nameint[i] = (int)(name.charAt(i));
						name_sum += nameint[i]; 
						System.out.println(" " + nameint[i]);
						System.out.println("sum: " + name_sum);
					}
				
					int n = 0, zimu = 0;
					String s1 = "", s2 = "", s3 = "";
					int eax = 0, ebx = 0, ecx = 0, edx = 0, esi = 0, edi = 0;
					for(int i = 0; i < name_length; ++i) {
						n = i*4 -(i+1);
						if(n < 0)
							zimu = 0;
						else
							zimu = (int)(table.charAt(n));
						System.out.println("zimu" + zimu);
						edx = nameint[i] ^ zimu;
						esi = (name_sum * i - name_sum) ^ 0xffffffff;
						esi = edx + esi + 0x14d;
						ecx = nameint[i] * name_length * (i + 3);
						eax = esi + ecx;
						edx = (eax % 0xa) + 0x30;
						eax = (edx ^ 0xadac) * (i + 2);
						edx = eax % 0xa + 0x30;
						s1 = s1 + String.valueOf(edx - 48);
						System.out.println("s1: " + s1);
						//s1 = (((((nameint[i] ^ zimu + ((name_sum * i -name_sum) ^ 0xffffffff) + 0x14d + nameint[i] * name_length * (i + 3)) % 0xa + 0x30) ^ 0xadac) * (i + 2)) % 0xa) + 0x30;
						//s1 = ((((nameint[i] ^ zimu + (name_sum * i - name_sum) ^ 0xffffffff + 0x14d + nameint[i] * name_length * (i + 3)) % 0xa + 0x30) ^ 0xadac) * (i + 2)) % 0xa + 0x30;
					
					}
					eax = name_length * name_sum;
					edi = eax % 0x64 + 0x30;
					s2 = "T" + s1 + "-" + String.valueOf(edi);
					ebx = s2.length();
					for(int i = 1; i < ebx; i++) {
						edi = ((int)s2.charAt(i) ^ 0x20) % 0xa + 0x30;
						s3 = s3 + String.valueOf(edi -48);
					}
					s3 = "T" + s3;
					System.out.println("Serial: " + s3); //最终注册码
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

© 著作权归作者所有

共有 人打赏支持
enimey
粉丝 15
博文 18
码字总数 12299
作品 0
成都
Mahout安装与配置笔记

一、硬件环境 操作系统:Linux ubuntu-13.04-desktop-i386 jdk安装版本:jdk-7u51-linux-i586 Hadoop版本:Hadoop-1.1.1(一个Namenode,三个Datanode部署) 二、安装步骤 在Mahout安装之前读...

kartik
2014/06/01
0
0
MySQL的JOIN(二):JOIN原理

表连接算法 Nested Loop Join(NLJ)算法: 首先介绍一种基础算法:NLJ,嵌套循环算法。循环外层是驱动表,循坏内层是被驱动表。驱动表会驱动被驱动表进行连接操作。首先驱动表找到第一条记录...

文文1
04/01
0
0
冒泡排序(Bubble Sort)

1、定义 冒泡排序(Bubble Sort)是一种交换排序。 应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。 2、基本思想 两两比较待排序记录的关键字,发现两个记录的次序相反时即进行...

野渡书生
2016/04/29
29
0
算法导论第二章小试牛刀

Author: bakari   Date: 2015.9.11 《算法导论》真是一本让人又爱又恨的书,爱自然是因为它精简凝练的算法呈现,读来让人欲罢不能;至于恨,是因为它在进行算法分析的时候所体现的数学思想...

chambai
2015/09/11
0
0
内排序及时间复杂度分析-插入排序&选择排序&交换排序&归并排序&分配和索引排序对比

基本概念 什么是排序? 排序 将序列中的记录按照排序码顺序排列起来 排序码域的值具有不减(或不增)的顺序 内排序 整个排序过程在内存中完成 给定一个序列 R = { r1, r2, ...,rn } 其排序码分...

tcfellow
07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如果彻底的卸载 visual-studio-code

C:\Users\Administrator\AppData\Roaming 我安装了visual-studio-code ,然后配置了 一堆东西。 现在我不需要了,我希望是 卸载 visual-studio-code ,然后来一个干净的visual-studio-code ...

之渊
10分钟前
0
0
[DOM] Found 2 elements with non-unique id

在同一个html文件中两个id都相同,所以才会出现上面问题。 参考路径: https://pdf-lib.org/Home/Details/5866

度_
26分钟前
0
0
Java 异常处理的误区和经验总结

前言 本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳。只有处理好了异常,才能提升开发人员的基本素养,提高系统的...

小致dad
32分钟前
0
0
dropWhile删除从第一个元素开始匹配,匹配失败则停止匹配

val set1=Set("a","b","c") val set2=Set("c","d","e") var set3=set1.drop(2) println(s"set3 drop first tow element : $set3") val set5=set1 drop 2 println(s"set1 ......

freeli
38分钟前
0
0
hive udf、udaf、udtf

1、UDF:用户定义(普通)函数,只对单行数值产生作用; 实现方法: 1. 继承UDF类 2. 重写evaluate方法 /** * @function 自定义UDF统计最小值 * @author John * */...

张欢19933
45分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部