学破解第63天,自写的简单的C语言字符串异或加密分析
本帖最后由 小菜鸟一枚 于 2019-9-23 20:17 编辑一直对黑客充满了好奇,觉得黑客神秘,强大,无所不能,来论坛一年多了,天天看各位大佬发帖,自己只能做一个伸手党。也看了官方的入门视频教程,奈何自己基础太差,看不懂。自我反思之下,决定从今天(2019年6月17日)开始定下心来,从简单的基础教程开始学习,希望能从照抄照搬,到能独立分析,能独立破解。
立帖为证!--------记录学习的点点滴滴
自写的简单的C语言字符串异或加密分析
程序介绍:
输入正确的16位字符串,txt文件就会保存我们输入的字符串。
然后就可以用这个字符串去打开我的源码压缩包!
1.自己写的程序,没壳,所以不用查壳,直接将程序丢进OD,停在了
004014C7 > $E8 7D040000 call demo02.__security_init_cookienFilte>
004014CC .^ E9 B3FDFFFF jmp demo02.__tmainCRTStartupexceptionFil>
004014D1 > >8BFF mov edi,edi
004014D3/.55 push ebp
首先右键-》中文搜索引擎-》智能搜索
中文搜索引擎
地址 反汇编 文本字符串
00401010 mov eax,dword ptr ds: 52pojie.txt
00401015 mov ecx,dword ptr ds: jie.txt
0040101B mov edx,dword ptr ds: txt
0040102C mov eax,dword ptr ds: BX42ET3TK32VD6J1
00401034 mov eax,dword ptr ds: (Initial CPU selection)
00401034 mov eax,dword ptr ds: D6J1
0040103C mov ecx,dword ptr ds: ET3TK32VD6J1
00401045 mov edx,dword ptr ds: K32VD6J1
0040105C mov edx,dword ptr ds: reading GO!!!
00401069 mov eax,dword ptr ds: ing GO!!!
00401071 mov ecx,dword ptr ds: GO!!!
0040107A mov dx,word ptr ds: !
00401086 push demo02.00402134 请输入长度为16的字符串:\n
004010A3 push demo02.00402150 %s
00401105 push demo02.00402168 r
004011D1 push demo02.0040216C w
004011F8 push demo02.0040216C w
00401203 push demo02.00402154 o%%%|g`"=8;7|1<o
0040141F mov eax,dword ptr ds: è
004015A7 push offset demo02.GS_ExceptionPointerss80@
0040190A push demo02.__security_check_cookieionFi;\r
试了试BX42ET3TK32VD6J1,发现密码不对,按照程序流程我们知道输入字符串,然后比较后将
我们输入的字符串写入到52pojie.txt文件,那么我们在00401086这里回车跟进去
00401086|.68 34214000 push demo02.00402134 ; /请输入长度为16的字符串:\n
0040108B|.894D DC mov ,ecx ; |
0040108E|.66:8955 E0 mov word ptr ss:,dx ; |
00401092|.8945 E2 mov dword ptr ss:,eax ; |
00401095|.66:8945 E6 mov word ptr ss:,ax ; |
00401099|.FF15 B8204000 call dword ptr ds:[<&MSVCR100.printf>] ; \printf
0040109F|.8D45 E8 lea eax,
004010A2|.50 push eax
004010A3|.68 50214000 push demo02.00402150 ; /%s
004010A8|.FF15 B0204000 call dword ptr ds:[<&MSVCR100.scanf>] ; \scanf
然后这里提示我们输入16位字符串,我们输入1234567891234567,继续向下单步,
看信息窗口
堆栈地址=0018FF2C, (ASCII "1234567891234567")
eax=0018FF3D
demo02.wmainerrinitgeBasexceptionFiltertion+0AE
0018FF2C这个地址存的是我们刚刚输入的地址,在数据窗口中跟随一下这个数据地址!
然后我们继续向下单步,我们单步到004010EA这里,在观察数据窗口
004010DC|.8D6424 00 lea esp,dword ptr ss:
004010E0|>80740D E8 52/xor byte ptr ss:,0x52
004010E5|.41 |inc ecx
004010E6|.3BC8 |cmp ecx,eax
004010E8|.^ 7C F6 \jl short demo02.004010E0
004010EA|>8D45 E8 lea eax,
很明显发现数据变成了
0018FF2C63 60 61 66 67 64 65 6A 6B 63 60 61 66 67 64 65c`afgdejkc`afgde
2.既然数据改变了,那么看看上面那断代码,很明显是对字符串进行了xor 0x52这个操作,
再来看看寄存器窗口:
EAX 00000010
ECX 00000010
EDX 0018FF2D ASCII "`afgdejkc`afgde"
EBX 00000000
ESP 0018FF04 ASCII "52pojie.txt"
EBP 0018FF44
ESI 00000001
EDI 00403374 offset demo02.__native_startup_lockonement
EIP 004010EA demo02.004010EA
每加密一个字符,ecx+1,直到等于16(0x10等于十进制的16),这几个汇编指令百度就知道了
xor 异或52
inc +1指令
cmp 比较两个数(ecx,eax)
jl 小于就跳转(不小于就跳出循环向下执行)
然后我们继续向下单步走
00401160 8D55 D4 lea edx,dword ptr ss:
00401163 8D4D E8 lea ecx,dword ptr ss:
00401166 8A01 mov al,byte ptr ds:
00401168 3A02 cmp al,byte ptr ds:
0040116A 75 1A jnz short demo02.00401186
0040116C 84C0 test al,al
0040116E 74 12 je short demo02.00401182
00401170 8A41 01 mov al,byte ptr ds:
00401173 3A42 01 cmp al,byte ptr ds:
00401176 75 0E jnz short demo02.00401186
00401178 83C1 02 add ecx,0x2
0040117B 83C2 02 add edx,0x2
0040117E 84C0 test al,al
00401180^ 75 E4 jnz short demo02.00401166
00401182 33C0 xor eax,eax
学了C语言的可能很明显就能看出这是c语言中的strcmp函数,在循环比较两个字符串
中的每个字符是否相等,当然了,百度一下add是加法指令,test指令百度了我看不明白,
但是知道其他指令,我们就能知道这是一个字符串比较操作。
3.到这里,我们知道00401160是真实字符串加密后的给了edx,00401163是我输入的字符串
给了ecx,有的坛友就想到爆破了,将这两句代码改成一样,不就破解了吗?
但是大家看我的代码流程:
成功了写入我们输入的字符串,(而加密后的字符串我直接放在了txt文件里),如果你选择
了将00401160这一行改成lea ecx,dword ptr ss:,那么txt文件中加密的字符串
将被我们输入的错误字符串覆盖,你将永远得不到正确的密码。
(所以我友好的增加了用户输入的字符串不为16位,就硬编码方式写入加密后的字符串到txt文件)
好了,言归正传,我们发现整个程序比较后,写入文件就结束了,而我们知道前面
只对我们的字符串进行了xor 0x52操作,我们就只需要对加密后的字符串再次执行
xor 0x52操作,就可以得出正确的密码。
4.到了这里可能有的坛友说,我不会编程,不会写代码,嘿嘿,还记得吗前面就是对我输入的
字符串xor 0x52再去做比较,那么此时我们输入的字符串改为加密后的字符串也就是
o%%%|g`"=8;7|1<o,程序再做xor 0x52后就能得到正确的密码!
OD重载程序,直接F4到00401168这一行,然后在输入加密后的o%%%|g`"=8;7|1<o,这个字符串,
再看寄存器窗口,如图所示:
ECX就是我们输入的o%%%|g`"=8;7|1<o执行xor 0x52后出来的密码,程序直接告诉了我们
密码:=www.52pojie.cn=
至此,程序分析完毕!
源程序下载地址:https://www.52pojie.cn/thread-1026935-1-1.html
欢迎大家留下其他的破解方法,共同学习!
总结:虽然学了这么多天,但是我是零基础小白,到现在勉勉强强论坛官方入门视频教程才学到
了第6课,都是照抄教程的,自己还是没办法分析CM区别人的程序!
最后附上我的学习记录导航贴:https://www.52pojie.cn/thread-1020860-1-1.html
里面有我学习的论坛教程帖子地址和我第1天到现在的学习记录帖子地址
最后,欢迎大家一起来学习破解,我也是零基础,虽然学了这么久还是不会破解,但是
也算懂了一点点破解知识,如果你想一步登天,学了几天就想破解xx软件,那就算了,道不同,不相为谋!
也不要问我学到什么程度,能不能破解,能不能学得会的话题,你都没有坚持学,就问我这种问题毫无意义,
我享受的是学习过程,破解软件是为了验证我的学习程度,我的技术!
PS:其实我学破解是为了装X,为了吹牛,为了炫耀,我原本是在水区和@夏南离 一起水的,没事每天发几篇
从论坛教程抄袭的技术帖子在水区发出来装装X,直到遇到了@小糊涂虫 ......
后面省略一万字......
刚刚对这个程序录了一个视频,看不懂图文教程的可以看看视频:
https://www.52pojie.cn/thread-1028246-1-1.html
本帖最后由 小菜鸟一枚 于 2019-9-23 20:14 编辑
我叫蛋dan 发表于 2019-9-23 13:37
总结下来可以说是密钥是52 然后对明文密码进行了加密 每次对比都要解密加密对比是么
还有就是 做一个cr ...
xor 52就是对字符串进行了异或操作,注意数据窗口里面你输入的数据改变了,你肯定就知道上面是改变字符串了,单步把上面循环跟几次,注意数据是在经过xor 52这一行逐个改变就知道了是对整个字符串进行了异或操作,然后其他的汇编代码我也不懂,都是靠百度的,没学过汇编。
多关注堆栈窗口和数据窗口,汇编代码我都是百度的。
有些不懂,但是数据改变了,像上面,你说的前面那个命令我不懂,但是我看到信息窗口显示,前面那句是我输入的数据1,不管他怎么算,反正记得他就是一个1,然后xor,得到一个加密后的字符。
针对这个图文教程,我做了个视频,你可以参考一下:https://www.52pojie.cn/thread-1028246-1-1.html
本帖最后由 小菜鸟一枚 于 2019-9-23 10:45 编辑
小糊涂虫 发表于 2019-9-23 09:20
为了装X就是错误的,学习方向都是错的,况且高手太多(一般都隐起来了),就目前而言装X一般不会成功
现在我还是有一颗虚荣心,喜欢炫耀,喜欢装X,我现在目标是向大哥这个用户组出发,边学破解,边学点c语言,最后再去研究算法。
不过看论坛的零基础入门贴,我估计我的学习之路还很漫长。
哦,对了,大哥,请教一下,脱壳方面你有没有一些新的壳脱壳视频教学,我要把你的技术都学过来,这样我就更有信心的装X了。(适当的装X才有继续学习的动力)
看了看目标:
LCG要求:windows脱壳和破解题
所以想找找脱壳方面的教程存起来以后学习。
非常感谢 曾经我也想,但没有坚持下来,不过另一方面坚持下来了 加油 莫莫 发表于 2019-9-22 22:27
非常感谢 曾经我也想,但没有坚持下来,不过另一方面坚持下来了 加油
嗯嗯,不管我们在做什么,自制力很重要,长期的坚持下去,最终才能看到结果!:handshake 夏南离 发表于 2019-9-22 22:27
额,吹着吹着就学到了,也不错了
在论坛做了快两年的伸手党,除了找软件基本不上论坛,今年心情一直不好,就想着论坛这个虚拟的网络世界来吹吹牛,吐吐苦水,然后........,不知道怎么跑偏了{:1_909:},可能是被LCG那位大哥热心的帮助我感动了,不好意思让它知道我其实就是在水贴{:1_924:},然后就从吹牛,变成了真的学技术了!{:1_925:} 厉害,加油 看起来很厉害样子哦。 加油楼主! 鼓励一下。。。坚持就是胜利