新手破解练习Crackme160之123 - noos.1

程序需要输入系列号验证, 没有错误提示, C++写的, 没有壳
OD载入程序, 搜索界面看到了成功关键词"Thank you for registering!", 定位到对应方法入口004013C0下断点~ F9运行点注册, 成功在入口处停下~ 开始单步算法分析, 00401489 ~ 004014A2 将输入串12位转为12位密串与注册码对比, 关键代码如下:

00401463   .  52            push edx
00401464   .  68 48304000   push noos_1.00403048                    ; |%d
00401469   .  50            push eax                                ; |s = "" 将系列号字符串转整形
0040146A   .  FF15 84214000 call dword ptr ds:[<&MSVCRT.sscanf>]    ; \sscanf
00401470   .  8B4C24 24     mov ecx,dword ptr ss:[esp+0x24]
00401474   .  51            push ecx                                ; /seed = 系列号整数作为随机因子
00401475   .  FF15 B0214000 call dword ptr ds:[<&MSVCRT.srand>]     ; \srand
0040147B   .  8B3D B8214000 mov edi,dword ptr ds:[<&MSVCRT.rand>]   ;  msvcrt.rand
00401481   .  83C4 10       add esp,0x10
00401484   .  BE 0C000000   mov esi,0xC                             ; 循环12次
00401489   >  FFD7          call edi                                ;  msvcrt.rand 得到一个随机数
0040148B   .  99            cdq
0040148C   .  B9 1A000000   mov ecx,0x1A                            ; mod 0x1A
00401491   .  F7F9          idiv ecx
00401493   .  8D4C24 0C     lea ecx,dword ptr ss:[esp+0xC]
00401497   .  8A5414 24     mov dl,byte ptr ss:[esp+edx+0x24]       ; "A~Z"字符串中取余数值对应位置的数
0040149B   .  52            push edx
0040149C   .  E8 AD020000   call <jmp.&MFC42.#940>
004014A1   .  4E            dec esi
004014A2   .^ 75 E5         jnz short noos_1.00401489

随机数的生产关键代码:
76D4C655    6948 14 FD43030>imul ecx,dword ptr ds:[eax+0x14],0x343FD    ; mfc42.7781EB24
76D4C65C    81C1 C39E2600   add ecx,0x269EC3
76D4C662    8948 14         mov dword ptr ds:[eax+0x14],ecx
76D4C665    C1E9 10         shr ecx,0x10
76D4C668    81E1 FF7F0000   and ecx,0x7FFF
76D4C66E    8BC1            mov eax,ecx

eax = ((seed * 0x343FD) << 0x10) & 0x7FFF;

这里我们单步跟踪很容易得到12个余数分别是 19, 18, 18, 5, 19, 12, 4, 25, 3, 15, 10, 18, 接下来好像没什么办法能直接逆运算得到系列号, 只能暴破了

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

int myrand(unsigned int *seed){
	*seed = *seed * 0x343FD + 0x269EC3;
	return *seed >> 0x10 & 0x7FFF;
}

int main() {
	int data[] = {19,18,18,5,19,12,4,25,3,15,10,18};
	for(unsigned int i=0; i<0xFFFFFFFF; i++){
		int s = 0;
		unsigned int rlt = i;
		for(int j=0; j<12; j++){
			if((myrand(&rlt) % 0x1A) == data[j]){ s++; } else { break; }
		}
		if(s == 12){
			printf("注册码: %d\n", i);
		}
	}
	
	printf("结束\n");
	
	getchar();getchar();
	return 0;
}

%d / %ld (整形或长整形输出):
注册码: 692659380
注册码: -1454824268

%lld (长长整形输出):
注册码: 8562589888833725620
注册码: 8562589890981209268

经验证上面4个都通过~

 
 
 
这是160个软件part1
这是160个软件part2

1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~

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

posted @ 2024-07-28 17:25  hankerstudio  阅读(13)  评论(0)    收藏  举报