小菜鸟一枚 发表于 2019-9-22 22:20

学破解第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 13:54

本帖最后由 小菜鸟一枚 于 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:44

本帖最后由 小菜鸟一枚 于 2019-9-23 10:45 编辑

小糊涂虫 发表于 2019-9-23 09:20
为了装X就是错误的,学习方向都是错的,况且高手太多(一般都隐起来了),就目前而言装X一般不会成功
现在我还是有一颗虚荣心,喜欢炫耀,喜欢装X,我现在目标是向大哥这个用户组出发,边学破解,边学点c语言,最后再去研究算法。

不过看论坛的零基础入门贴,我估计我的学习之路还很漫长。
哦,对了,大哥,请教一下,脱壳方面你有没有一些新的壳脱壳视频教学,我要把你的技术都学过来,这样我就更有信心的装X了。(适当的装X才有继续学习的动力)

看了看目标:
LCG要求:windows脱壳和破解题
所以想找找脱壳方面的教程存起来以后学习。


莫莫 发表于 2019-9-22 22:27

非常感谢 曾经我也想,但没有坚持下来,不过另一方面坚持下来了 加油

夏南离 发表于 2019-9-22 22:27

小菜鸟一枚 发表于 2019-9-22 22:28

莫莫 发表于 2019-9-22 22:27
非常感谢 曾经我也想,但没有坚持下来,不过另一方面坚持下来了 加油

嗯嗯,不管我们在做什么,自制力很重要,长期的坚持下去,最终才能看到结果!:handshake

小菜鸟一枚 发表于 2019-9-22 22:34

夏南离 发表于 2019-9-22 22:27
额,吹着吹着就学到了,也不错了

在论坛做了快两年的伸手党,除了找软件基本不上论坛,今年心情一直不好,就想着论坛这个虚拟的网络世界来吹吹牛,吐吐苦水,然后........,不知道怎么跑偏了{:1_909:},可能是被LCG那位大哥热心的帮助我感动了,不好意思让它知道我其实就是在水贴{:1_924:},然后就从吹牛,变成了真的学技术了!{:1_925:}

夏南离 发表于 2019-9-22 22:49

如海之汐 发表于 2019-9-22 22:57

厉害,加油

jcy520 发表于 2019-9-22 23:09

看起来很厉害样子哦。

炖锅 发表于 2019-9-22 23:09

加油楼主!

boyving 发表于 2019-9-22 23:12

鼓励一下。。。坚持就是胜利
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 学破解第63天,自写的简单的C语言字符串异或加密分析