首页
社区
课程
招聘
一个简单的crackme(高手略过)
发表于: 2010-3-5 21:24 8233

一个简单的crackme(高手略过)

2010-3-5 21:24
8233
第一次写crackme,很简单,只求大家踊跃提意见!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (32)
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
2
确实比较简单
GoodGavin
107629
2010-3-5 22:08
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
都不敢下。。动不动就要扣钱还是只能再忍耐几天俺变会员了再来
2010-3-5 22:46
0
雪    币: 6797
活跃值: (4451)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
4
下来看下,先顶一个!!
2010-3-5 22:52
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
本来就简单啊,给点意见好吗?初来乍到,还什么都不会!
2010-3-5 23:16
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
6
CM提升难度的话从两个方面了,一个是反调试,另一个是算法。

自己尝试下自己的CM,就会发现可以从哪里改进以增加难度,慢慢提高。

对本CM提个意见:这个是Debug版的,下回发Release版的吧。
2010-3-5 23:36
0
雪    币: 440
活跃值: (87)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
7
BOOL Is_API_breaked()
{
	DWORD address = GetProcAddress(LoadLibraryA("user32.dll"), "GetDlgItemTextA");
	
	if(0xcc==*(BYTE *)address) return true;
	else    return false;
}

int main()
{
	if(Is_API_breaked())
	{
		HWND hwnd = FindWindowA("OllyDBG.EXE", NULL);
		if(NULL!=hwnd) SendMessageA(hwnd, WM_CLOSE, NULL, NULL);
  }
  DialogBoxParamA(....);
}

1. FindWindowA的第一个参数应该修改为"OllyDBG".
2. DialogBoxParamA创建的模态对话框只能使用EndDialog结束。而楼主使用的是DestroyWindow.
/*
msdn : EndDialog Function
Dialog boxes created by the DialogBox, DialogBoxParam, DialogBoxIndirect, and DialogBoxIndirectParam functions must be destroyed using the EndDialog function.
*/
3. 使用 F(UserName)==Serial 的验证方式直接暴露了真正的注册码。
2010-3-5 23:41
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
8
请教楼上咋发现“ FindWindowA的第一个参数应该修改为"OllyDBG".”的,我都没有意识到他有反调试。。。
2010-3-5 23:53
0
雪    币: 80
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
新来的,报个到
2010-3-6 00:30
0
雪    币: 5582
活跃值: (3676)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
10
学习一下
2010-3-6 09:00
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
6楼的说的对,这次尝试了一下反调试,不过好像没用对,没用什么算法,简单的处理了一下。记住了,下次发Release版的。
7楼的大哥太感谢了,说的太好了,这次是直接比较的,没什么难度。主要是想试试反调试,不过还是不太懂!
2010-3-6 10:01
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
12
把代码发上来看看,或许提建议更容易些。。

在学着看代码,正好用这个简单的练习一下,写个Keygen:

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

int main()
{
int i, j, sum;
char name[100];
int keyTable[9] = {12, 10, 21, 9, 13, 11, 10, 8, 0};
memset(name, 0, 100);
printf("Please input your name: ");
scanf("%s", name);


sum = 0;
for(i = 3, j = 0; i != (signed)strlen(name); i++, j++)
{
if(j == 8)
{
j = 0;
}
sum += name * keyTable[j];
}

for(i = 10000; i != 10010; i++)
{
sum += i;
}

printf("The serial:%d\n", sum);

system("PAUSE");


return 0;
}
2010-3-6 10:09
0
雪    币: 351
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
改了两处,提示成功。不知道有没有被骗?
上传的附件:
2010-3-6 10:42
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
can u all talk in english plz?
2010-3-6 10:46
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
15
Are you an American?
2010-3-6 10:53
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
嗯!源文件已发。你看看,我主要想拦截CC断点,该怎样才好!
上传的附件:
2010-3-6 10:56
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
[QUOTE=wuzhidao;771046]改了两处,提示成功。不知道有没有被骗?[/QUOTE]
没被骗,你骗我啊!
2010-3-6 11:01
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
18
你拦截的CC断点是有效的啊,只是只会在程序启动时拦截,可是那个时候程序根本没有被下断点啊。
拦截的位置可以调整一下

然后里面HWND  hWnd =::FindWindow("OllyDBG",NULL);的意义好像不大,很多OD的名字不完全是“OllyDBG”,我感觉绝大部分情况下不会导致OD退出。

另外可以对成功提示的字符串进行处理,否则直接查找字符串就定位关键点了,根本就不需要去下GetDlgItemText断点
2010-3-6 11:47
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
能不能按你的思想改进一下,把源码给我看看!thanks
2010-3-6 11:55
0
雪    币: 66
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
瞎猫撞到“死耗子”,看样子我人品比较好。功力不到家,对整个流程不太懂!观摩学习!
username:erlong
pwd:104640
2010-3-6 12:30
0
雪    币: 66
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
这个确实不太管用,好多修改版的OD名字都不是OllyDBG。不过没写过cm,对反调试也不太懂,观望学习!
2010-3-6 12:43
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
22
http://bbs.pediy.com/showthread.php?t=108309

我简单改了一下的程序及代码,建议先试试程序,然后再看代码,最后谢谢破解方法。
2010-3-6 14:45
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
看了你的程序,写得不错,不过我都没怎么看懂,我水平有限哈!我自认为和我开始的那个相比没怎加多少难度。里面还是直接比较序列号,序列号直接就看到!我觉得在序列号计算出来后比较的时候下点功夫难度就会增加不少,还有我还是想在调试的时候直接把OD给干掉,不知道可行不!还得好好学习啊 !
2010-3-6 16:21
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
24
干掉OD当然是可以的,论坛里很多CM都可以,只是原来那种方法不大管用,需要改进!

好久不写代码了。。手生的不行。。
改的目的只是把你对断点检测的位置改了一下,然后把注册成功的提示加密存放,防止字符串查找直接定位关键代码。没有更改注册算法具体的东西。(刚开始改的有些问题,对检测到的断点处理无效,后来更新附件了,不知道你尝试的是哪一个.)

“序列号计算出来后比较的时候下点功夫难度就会增加不少”这样确实会给破解带来些难度
另:f(name) = f(serial)的方式就不会直接出现明码序列号。
2010-3-6 18:20
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
学习了!
2010-3-6 18:43
0
游客
登录 | 注册 方可回帖
返回
//