上一个CM的讨论贴,开源,求大牛指点。
本帖最后由 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 ^ 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 = {0};
strcpy(szPwd,m_pwd);
int len = lstrlen(szPwd);//密码的长度也参与了解密运算
szPwd = '\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 ^= key;//key是0x403001。可能存在其他的值。
szSuccess += 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 ^= szPwd;//也不该用异或
pKey ^= szPwd;
pKey ^= szPwd;
pKey ^= szPwd;
}
for(i = 0 ;i != 16;i++)
{
//int key = 0x403001 - 0x000006d0;
key += pKey;//结果累加,用来解密messagebox的//pKey 中所有元素相加等于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:;
} 召唤josong师傅。 Ruin 发表于 2012-7-5 10:46 static/image/common/back.gif
召唤josong师傅。
你果断召唤不过来。 啊 哦 汇编写的?
高手啊
话说你写一个RSA的加密 看他咋解 killerwy 发表于 2012-7-5 14:58 static/image/common/back.gif
啊 哦 汇编写的?
高手啊
messagebox的代码就是用AES加密的,key 也进行了简单的异或。
结果还是被XXX了。 {:301_1008:}根本看不懂 - -!~~什么也不会的菜鸟飞过~~ statlove 发表于 2012-7-5 18:50 static/image/common/back.gif
根本看不懂 - -!~~什么也不会的菜鸟飞过~~
代码写的搓,大牛不想看吧。 写得这么复杂,难怪我等小菜破不鸟
{:1_932:} 幸好没下,不然受打击是必然的,但师傅出手的话 。。。。果然必杀啊 {:1_931:}
页:
[1]