吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3082|回复: 9
收起左侧

[CrackMe] 上一个CM的讨论贴,开源,求大牛指点。

[复制链接]
O_o 发表于 2012-7-5 10:18
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

本帖最后由 O_o 于 2012-7-6 10:57 编辑

CM地址:
http://www.52pojie.cn/thread-155103-1-1.html
已经被大牛干掉,求大牛指点。
代码用aes加密,在不知道key和加密前的内容情况下,怎么解出key,和加密前的代码?
代码写的很搓。很多地方都偷懒了。
int GetAdd(char * buf)//用来算解密后的跳转地址的 结果必须是 2e
{
int len = lstrlen(buf);
int iResult = 0;
for(int i = 0 ; i != len; i ++)
{
iResult += buf[i] ^ len>>i;

}

return iResult/i-0xf;
}
void CCrackMeDlg::OnOK() 
{
// TODO: Add extra valIDAtion here


int key = 0x403001 - 0x000006d0;//用来解密messagebox的text,写这个cm的时候病了,很多东西都用的比较简单的东西,也很多没有处理。

__asm
{

//花指令

}
Next:
UpdateData(1);//用了这个,可以直接定位到关键代码,也懒的改。
char szPwd[32] = {0};

strcpy(szPwd,m_pwd);
int len = lstrlen(szPwd);//密码的长度也参与了解密运算
szPwd[len] = '\0';


BYTE * t1 = 0;
BYTE * t2 = 0;
BYTE * t3 = 0; 

tagSuccess:

__asm
{

mov t1,offset tagSuccess;//记录tagSuccess的地址,用来加密解密成功的代码
mov t2,offset tagEn;//
mov t3,offset tagSuccess;//t1的副本,用来跳转到成功的地址
jmp tagEn;//跳过成功的代码。//这里其实应该做一些混淆性的判断再跳转,头痛没做。




nop//aes加密的key,16个字节外加花指令4个字节,程序编译,将key复制到这里。
nop
nop
nop

nop
nop
nop
nop

nop
nop
nop
nop

nop
nop
nop
nop

nop
nop
nop
nop

//int 3
}

//下面是成功的代码
char szSuccess[] = {"\x3f\x67\x67\x5a\x16\x16\x16\x40\x67\x58\x19\x16\x00"};//God job与key异或的结果,key应该是0x403001。
//这个也不应该用异或,可以用一些其他的对称加密算法
for(int n = 0 ; n != 12;n++)
{

szSuccess[n] ^= key;//key是0x403001。可能存在其他的值。
szSuccess[n] += 9;
}
::MessageBox(0,szSuccess,szPwd,0);
__asm
{
jmp end//跳转到代码结束
nop//aes一次加密16个字节,这里留一些空间免得破坏下面的代码,多了的填花指令。
nop
nop
nop

nop
nop
nop
nop

nop
nop
nop
nop

nop
nop
nop
nop

nop
nop
nop
nop


}



tagEn:
BYTE *pKey = 0;

t1 = t1 + 3*11 + 13;//tagSuccess标签加上asm的代码长度,才到成功的代码
pKey = t1 - 20;//aes key的地址,就是上面的很多nop的地方
__asm
{

}
// memcpy(pKey,t1-16,16);
/*
unsigned char pKey[] = 
{
0x2b, 0x7e, 0x15, 0x16, //这个就是aes的key
0x28, 0xbe, 0xd2, 0xa6, 
0xab, 0xf7, 0x15, 0x88, 
0x09, 0xcf, 0x4f, 0x3c
};

*/
for(int i = 0 ; i != 4;i++)//用密码的4 5 6 7 位解密aes的key, 4 5 6 7为1990
{
pKey[i*4] ^= szPwd[3];//也不该用异或
pKey[i*4+1] ^= szPwd[4];
pKey[i*4+2] ^= szPwd[5];
pKey[i*4+3] ^= szPwd[6];

}
for(i = 0 ;i != 16;i++)
{
//int key = 0x403001 - 0x000006d0;
key += pKey[i];//结果累加,用来解密messagebox的//pKey[16] 中所有元素相加等于x6d0,然后与key的初始值相加就等于0x403001
}





// BYTE s[] = {0x1A,0x47,0x2C,0x26,0x19,0x87,0xEB,0x96,0x9A,0xCE,0x2C,0xB8,0x38,0xF6,0x76,0x0C};



AES aes(pKey);

for(i = 0 ; i !=11; i++)
{
aes.Cipher(t1+i*16);//加密成功代码。一共加密11*16个字节,加密后复制已经加密的11*16字节覆盖以前的代码,并nop掉本段代码,改为花指令。
//我刚第一次发出的CM,本段代码没有nop,只是简单跳过,加密函数也存在程序中。
}

for(i = 0 ; i !=11; i++)
{
aes.InvCipher(t1+i*16);//解密成功代码
}
int x = GetAdd(szPwd);
__asm
{


jb Next2;
jb Next1;
jnb Next1;

__emit 0xE8;
Next1:
push eax
mov eax,x
add t3,eax; //t3加2e就是成功代码的开始地址。
pop eax
Next2:
jmp t3;
// __emit 0xE8;
}
end:;


}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Ruin 发表于 2012-7-5 10:46
召唤josong师傅。
 楼主| O_o 发表于 2012-7-5 11:05
Ruin 发表于 2012-7-5 10:46
召唤josong师傅。

你果断召唤不过来。
killerwy 发表于 2012-7-5 14:58
啊 哦 汇编写的?
高手啊

话说你写一个RSA的加密 看他咋解
 楼主| O_o 发表于 2012-7-5 15:15
killerwy 发表于 2012-7-5 14:58
啊 哦 汇编写的?
高手啊

messagebox的代码就是用AES加密的,key 也进行了简单的异或。
结果还是被XXX了。
statlove 发表于 2012-7-5 18:50
根本看不懂 - -!~~什么也不会的菜鸟飞过~~
 楼主| O_o 发表于 2012-7-5 19:47
statlove 发表于 2012-7-5 18:50
根本看不懂 - -!~~什么也不会的菜鸟飞过~~

代码写的搓,大牛不想看吧。
josong 发表于 2012-7-6 09:16
写得这么复杂,难怪我等小菜破不鸟

点评

O_o
到底是不是破的哦,求破问或者思路  发表于 2012-7-6 10:53
mycc 发表于 2012-7-6 09:28
幸好没下,不然受打击是必然的,但师傅出手的话 。。。。果然必杀啊 {:1_931:}
头像被屏蔽
Shiny 发表于 2012-7-6 09:38
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表