记一次算法分析--->易语言源码加密算法分析+算法源码
本帖最后由 丶纯情小强 于 2015-11-14 11:23 编辑目标:易语言程序511 源码加密算法
平台: windows xp
工具:Ollydbg.exe WinHex
找到以前写的一个源码,发现加密了,然后密码又忘记了,所以有了分析加密算法的想法
嗯,大半夜的,也没事情做,说干就干,看看能不能追出密码来
1.首先定位关键
od载入e.exe(没有的话,自己装一个易语言程序),载入完毕后,程序,打开一个加密了源码的易语言,显示如下:
现在我们随便输入错误的密码,错误3次后会提示如下:
又或者直接esc,取消输入密码,提示如下:
这样我们可以通过上述图中提示的错误信息进行定位.
2.初步分析
定位了关键位置后,解析下来,就是简单分析加密算法,通过步骤1,我最终定位在这个位置,我输入了假码:52pojie.cn
0044800D .83F8 01 cmp eax,0x1 //判断是否终止输入密码或有没有输入密码
00448010 .74 0A je short e.0044801C
00448012 .68 30915800 push e.00589130 ;您中止了密码输入,因此无法访问被密码保护的指定源程序!
00448017 .E9 D9000000 jmp e.004480F5
0044801C >8B85 00FFFFFF mov eax,dword ptr ss: //如果输入了密码,则会跳转到这里,eax的值即输入的密码
00448022 .6A 08 push 0x8
00448024 .50 push eax
00448025 .6A 0A push 0xA
00448027 .8BF8 mov edi,eax
然后F8往下跟
00448029 .FF53 78 call dword ptr ds: ;对密码进行计算【功能1】
.
00448047 .6A 00 push 0x0
00448049 .6A 20 push 0x20
0044804B .50 push eax
0044804C .8BCE mov ecx,esi
0044804E .FF52 20 call dword ptr ds: ;打开源码文件
00448051 .8B16 mov edx,dword ptr ds:
00448053 .6A 00 push 0x0
00448055 .6A 08 push 0x8
00448057 .8BCE mov ecx,esi
00448059 .FF52 28 call dword ptr ds: ;设置读取文件的位置,文件偏移+8
0044805C .8B06 mov eax,dword ptr ds:
0044805E .8D8D 04FFFFFF lea ecx,dword ptr ss:
00448064 .6A 20 push 0x20
00448066 .51 push ecx
00448067 .8BCE mov ecx,esi
00448069 .FF50 34 call dword ptr ds: ;接着就是读取源码文件的内容,会有算法
0044806C .83F8 20 cmp eax,0x20
0044806F .0F85 88000000 jnz e.004480FD
00448075 .8D95 28FFFFFF lea edx,dword ptr ss:
0044807B .52 push edx
0044807C .57 push edi
0044807D .6A 0C push 0xC
0044807F .FF53 78 call dword ptr ds: ;经过一系列算法
F8一直到这里
00448082 .8D85 28FFFFFF lea eax,dword ptr ss: //eax的内容是根据假码算出的一串字符
00448088 .8D8D 04FFFFFF lea ecx,dword ptr ss: //ecx的内容,是根据源码经过算法出现的(用正确的码比较下就懂了)
0044808E .50 push eax //如果eax=ecx表示解密成功
0044808F .51 push ecx //不要尝试爆破,要不然你会失望的
00448090 .E8 389D0B00 call e.00501DCD
3.针对分析
3.1 针对功能1,进行分析
call dword ptr ds: ;对密码进行计算【功能1】
主要功能:
1.对输入的密码进行md5计算,并且按照1234=3412进行逆序,得到一组32长度字符串
2.用输入的密码作为key进行算法3(key),得到一组加密密文模版,具体见3.2分析
3.2 通过上述2步,我们对流程已经有了个大概的了解,接着我们继续细致的分析,首先看下读取了源码那些内容
通过下ReadFile断点,可以发现读取了源码文件
偏移位置+8读取大小 0x20(32)长度大小,们用winhex打开源码,看下到底读取了什么
这个是OD读取的内容
这个是winhex查看的内容
嗯,很好,和我们想象中的一模一样,那么我们分析是对的了,我们继续单补走,看看读取了之后,他搞了什么鬼,走到了这个Call
01065C82 6A 01 push 0x1
01065C84 57 push edi
01065C85 55 push ebp
01065C86 53 push ebx
01065C87 8BCE mov ecx,esi
01065C89 E8 E2020000 call krnln.01065F70//F7 进入 【功能2】
01065C8E 8BC7 mov eax,edi
01065C90 5F pop edi
01065C91 5D pop ebp
01065C92 5B pop ebx
01065C93 5E pop esi
01065C94 C2 0800 retn 0x8
F7进入后,来到这里,重要,需要仔细分析(我们标记下,记录为 【功能2】)
01065F70 55 push ebp
01065F71 8BEC mov ebp,esp
01065F73 81EC 2C010000 sub esp,0x12C
01065F79 8B45 14 mov eax,dword ptr ss:
01065F7C 53 push ebx
01065F7D 56 push esi
01065F7E 57 push edi
01065F7F 85C0 test eax,eax
.
.
.
01066160 5F pop edi
01066161 5E pop esi
01066162 5B pop ebx
01066163 8BE5 mov esp,ebp
01066165 5D pop ebp
01066166 C2 1000 retn 0x10
ret 10 有4个参数,我们去看看堆栈窗口,如图,看到了,读取的内容也被当作参数传递进来了,我们看看,到底做了什么
我们继续看这个call里面做了什么,F8一直单步走,遇到第一个call,停止
01065FF1 8D0C9D 00000000 lea ecx,dword ptr ds:
01065FF8 51 push ecx
01065FF9 66:A5 movs word ptr es:,word ptr ds:
01065FFB E8 80FEFFFF call krnln.01065E80 //call 标记1
01066000 8B45 10 mov eax,dword ptr ss:
01066003 83C4 08 add esp,0x8
01066006 99 cdq
01066007 81E2 FF0F0000 and edx,0xFFF
中间有个call,没什么作用,我们继续走,到这里第三个call停止
01066046 50 push eax
01066047 51 push ecx
01066048 56 push esi
01066049 E8 A2FEFFFF call krnln.01065EF0 //call 标记2
0106604E 8B7D 08 mov edi,dword ptr ss:
01066051 83C4 0C add esp,0xC
01066054 81E7 FF0F0080 and edi,0x80000FFF
以及第四个call,仔细看,发现【功能2】这段程序,里面的call,主要都是我们标记的3个call,所以,我们需要分析这3个call都做了什么
01066081 43 inc ebx
01066082 83C6 04 add esi,0x4
01066085 E8 36FDFFFF call krnln.01065DC0 //call 标记3
0106608A 8D85 D4FEFFFF lea eax,dword ptr ss:
01066090 8D4F 24 lea ecx,dword ptr ds:
call 1 的核心算法
01065EAE 8B4D 08 mov ecx,dword ptr ss:
01065EB1 85C9 test ecx,ecx //第一个参数不为0的时候进行算法操作
01065EB3 7E 10 jle short krnln.01065EC5
01065EB5 FEC3 inc bl
01065EB7 8A041E mov al,byte ptr ds:
01065EBA 02D0 add dl,al
01065EBC 860416 xchg byte ptr ds:,al
01065EBF 88041E mov byte ptr ds:,al
01065EC2 49 dec ecx
01065EC3^ 75 F0 jnz short krnln.01065EB5 //根据传入的值,进行算法操作
call 2 的核心算法 和算法1有点类似,但是又不一样 3个参数
参数1 加密后,返回的内容
参数2 控制循环次数
参数3 循环的时候,需要操作的数据
01065F23 8B4D 0C mov ecx,dword ptr ss:
01065F26 85C9 test ecx,ecx
01065F28 7E 19 jle short krnln.01065F43
01065F2A FEC3 inc bl
01065F2C 8A041E mov al,byte ptr ds:
01065F2F 02D0 add dl,al
01065F31 860416 xchg byte ptr ds:,al
01065F34 88041E mov byte ptr ds:,al
01065F37 020416 add al,byte ptr ds:
01065F3A 8A0406 mov al,byte ptr ds:
01065F3D 3007 xor byte ptr ds:,al
01065F3F 47 inc edi
01065F40 49 dec ecx
01065F41^ 75 E7 jnz short krnln.01065F2A
call 3的核心算法,算是3个里面最复杂一个了 3个参数,根据参数1,和00-ff进行算法运算
参数1 类似密钥
参数2 参数1大小,或者说长度
参数3 返回数据用
01065DF1 B9 40000000 mov ecx,0x40
01065DF6 BE 30D51901 mov esi,krnln.0119D530 //这个地址的内容是00-FF
01065DFB 8BFB mov edi,ebx
01065DFD F3:A5 rep movs dword ptr es:,dword ptr ds>
01065DFF 3BC2 cmp eax,edx
算法核心代码
01065E0D /7E 68 jle short krnln.01065E77
01065E0F |33F6 xor esi,esi
01065E11 |55 push ebp
01065E12 |885424 20 mov byte ptr ss:,dl
01065E16 |33C9 xor ecx,ecx
01065E18 |8B7C24 20 mov edi,dword ptr ss:
01065E1C |8B6C24 18 mov ebp,dword ptr ss:
01065E20 |8A041E mov al,byte ptr ds:
01065E23 |81E7 FF000000 and edi,0xFF
01065E29 |33D2 xor edx,edx
01065E2B |8A142F mov dl,byte ptr ds:
01065E2E |8BE8 mov ebp,eax
01065E30 |81E5 FF000000 and ebp,0xFF
01065E36 |03CA add ecx,edx
01065E38 |03CD add ecx,ebp
01065E3A |81E1 FF000080 and ecx,0x800000FF
01065E40 |79 08 jns short krnln.01065E4A
01065E42 |49 dec ecx
01065E43 |81C9 00FFFFFF or ecx,0xFFFFFF00
01065E49 |41 inc ecx
01065E4A |884C24 10 mov byte ptr ss:,cl
01065E4E |8B4C24 10 mov ecx,dword ptr ss:
01065E52 |81E1 FF000000 and ecx,0xFF
01065E58 |8A1419 mov dl,byte ptr ds:
01065E5B |88141E mov byte ptr ds:,dl
01065E5E |880419 mov byte ptr ds:,al
01065E61 |8D47 01 lea eax,dword ptr ds:
01065E64 |99 cdq
01065E65 |F77C24 1C idiv dword ptr ss:
01065E69 |46 inc esi
01065E6A |81FE 00010000 cmp esi,0x100
01065E70 |885424 20 mov byte ptr ss:,dl
01065E74^|7C A2 jl short krnln.01065E18
接着又是算法 1 2 进行运算
简单来说 算法大概思路是:(经过转换后的)
输入的密码→MD5运算→按照1234<>3412逆序得到的结果 结果1
根据输入的密码→进行算法3运算,得到一个256大小的key 结果2
算法1(固定8,结果2) 得到 结果3
结果3前4个内容+结果1+结果3前4个内容 得到 结果4
结果4经过算法3 得到 结果5
算法1(固定44,结果5 ) 得到 结果6
算法2(结果1,结果6)得到 结果7
接着源码32长度的内容=== 结果7
4.总结:
通过上面分析,算法不是很难,主要是算法1 算法2 算法3,虽然算法是跟出来了,不过,想要追回密码发现还是不可能了,只能通过暴力枚举了.
PS:第一次发分析贴,希望大家能支持下,哪里有不足的地方,大家多多提意见
算法源码:打开密码 www.52pojie.cn
鑒於樓主第壹次發佈技術文章主題,
因未達到精華標準 。特採取 高亮 威望 優秀 以茲鼓勵 ,希望堅持自己的愛好、多多發佈技術文獻與作品 並且早壹日成為大牛。
同時也希望他人學習樓主分享精神、技術菜,文章門檻低,不好意思發佈,這都不要緊.還有很多很多人正在破解大門前久久不能入門,也許正在苦惱。也許妳的壹個文章能讓他找到自信。而挽救壹個準備放棄的人 自己的沙发!~ 地板地板 很详细,感谢分享.... 前排出售瓜子,花生,爆米花,可乐 {:17_1073:} 帅的不要不要的 萋小磊 发表于 2015-11-14 11:43
前排出售瓜子,花生,爆米花,可乐
禁止水贴~{:1_918:} 【=筱筱=】 发表于 2015-11-14 12:42
禁止水贴~
好黑哦·{:17_1072:} 萋小磊 发表于 2015-11-14 13:15
好黑哦·
{:1_918:}哪有~{:1_918:}多读版规还是好的~
页:
[1]
2