Crackme逆向分析

逆向第一题,很简单,分分钟能搞定。题目大致是说找一个key,提示success就行。
Peid查一下没有任何壳,是vc写的程序,里面没有知名的算法。开始分析

错误的时候是这个样子
首先这一点就能给我们以下几点提示:
1此程序是vc写的,那么得到用户输入肯定是用到getdigitemtext系列函数,通过对函数下断即可以得到用户的输入
2.比较字符串,提示错误的字符串为done,查找字符串
3.失败与成功都会弹出对话框,那么同理也可也对messagebox系列函数下断
4.……其他 的方法暂且不说
直接getdigitemtext下断发现断不下,嗯嗯,后来查看程序的时候发现这个程序并不是调用了这个函数,而是他的同类型函数 GetWindowTextA,下断点之后,截断了用户的输入来到这个函数开头:

0042BAA3  |. 8B4D 10       mov ecx,[arg.3]
0042BAA6  |.  6AFF         push -0x1
0042BAA8  |.  E8846BFFFF   call CrackMe.00422631
0042BAAD  |.  EB0B         jmp XCrackMe.0042BABA
0042BAAF  |> 8B45 10       mov eax,[arg.3]
0042BAB2  |. FF30          push dword ptrds:[eax]
0042BAB4  |. 56            push esi
0042BAB5  |.  E8E4EBFFFF   call CrackMe.0042A69E
0042BABA  |> 5F            pop edi
0042BABB  |. 5E            pop esi
0042BABC  |. 5D            pop ebp
0042BABD  \.  C20C00       retn 0xC
,嗯嗯,直接单步掉,过几个跳转之后来到算法的地方:
00401420   .  6AFF         push -0x1
00401422   .  68D0904300   push CrackMe.004390D0                    ;  SE 处理程序安装
00401427   . 64:A1 0000000>mov eax,dword ptr fs:[0]                 ;  关键代码
0040142D   . 50            push eax
0040142E   . 64:8925 00000>mov dword ptr fs:[0],esp
00401435   . 83EC 0C       sub esp,0xC                              ;  保护现场
00401438   . 56            push esi
00401439   . 57            push edi
0040143A   . 8BF9          mov edi,ecx
0040143C   .  6A01         push 0x1
0040143E   .  E8FD3E0200   call CrackMe.00425340                    ;  读字符串给edx
00401443   .  6A00         push 0x0
00401445   . 8D4F 5C       lea ecx,dword ptrds:[edi+0x5C]
00401448   .  E895110200   call CrackMe.004225E2                    ;  读输入字符串给eax
0040144D   . 51            push ecx
0040144E   . 8BF0          mov esi,eax
00401450   . 8BCC          mov ecx,esp
00401452   . 896424 14     mov dword ptrss:[esp+0x14],esp
00401456   .  68CCA04400   push CrackMe.0044A0CC                    ;  strawberry
0040145B   .  E8C00D0200   call CrackMe.00422220
00401460   .  E81BFFFFFF   call CrackMe.00401380                    ;  读入一系列key做运算
00401465   . 83C4 04       add esp,0x4
00401468   . 8D4C24 0C     lea ecx,dword ptrss:[esp+0xC]
0040146C   . 50            push eax
0040146D   .  E8AE0D0200   call CrackMe.00422220
00401472   . 8D4C24 0C     lea ecx,dword ptrss:[esp+0xC]
00401476   . C74424 1C 000>mov dword ptr ss:[esp+0x1C],0x0
0040147E   .  E8CF120200   call CrackMe.00422752
00401483   .  6A00         push 0x0
00401485   . 8D4C24 10     lea ecx,dword ptrss:[esp+0x10]
00401489   .  E854110200   call CrackMe.004225E2
0040148E   . 50            push eax
0040148F   . 8D4C24 0C     lea ecx,dword ptrss:[esp+0xC]
00401493   . C640 09 4B    mov byte ptrds:[eax+0x9],0x4B
00401497   .  E8840D0200   call CrackMe.00422220
0040149C   . 8D4C24 08     lea ecx,dword ptrss:[esp+0x8]
004014A0   . C64424 1C 01  mov byte ptrss:[esp+0x1C],0x1
004014A5   .  E8A8120200   call CrackMe.00422752
004014AA   .  6A00         push 0x0
004014AC   . 8D4C24 0C     lea ecx,dword ptrss:[esp+0xC]
004014B0   .  E82D110200   call CrackMe.004225E2
004014B5   >  8A10          mov dl,byte ptr ds:[eax]                 ;  判断成功的代码
004014B7   .  8ACA          mov cl,dl                                ;  查看比较就知道是上面出现过的key
004014B9   .  3A16          cmp dl,byte ptr ds:[esi]
004014BB   .  75 1C         jnz XCrackMe.004014D9
004014BD   .  84C9          test cl,cl
004014BF   .  74 14         je XCrackMe.004014D5
004014C1   .  8A50 01       mov dl,byte ptr ds:[eax+0x1]
004014C4   .  8ACA          mov cl,dl
004014C6   .  3A56 01       cmp dl,byte ptr ds:[esi+0x1]
004014C9   .  75 0E         jnz XCrackMe.004014D9
004014CB   .  83C0 02       add eax,0x2
004014CE   .  83C6 02       add esi,0x2
004014D1   .  84C9          test cl,cl
004014D3   .^ 75 E0         jnz XCrackMe.004014B5
004014D5   >  33C0          xor eax,eax
004014D7   .  EB 05         jmp XCrackMe.004014DE
004014D9   >  1BC0          sbb eax,eax
004014DB   .  83D8 FF       sbb eax,-0x1
004014DE   >  85C0          test eax,eax
004014E0   .  6A 00         push 0x0
004014E2   .  6A 00         push 0x0
004014E4   .  75 07         jnz XCrackMe.004014ED
004014E6   .  68 E0A04400   push CrackMe.0044A0E0                    ;  success
004014EB   .  EB 05         jmp XCrackMe.004014F2                    ;  破解完成
004014ED   >  68 D8A04400   push CrackMe.0044A0D8                    ;  Done

破解过程直接看注释吧,比较累,所以写的比较简单,没有仔细分析算法。
嗯嗯,破到这个地方,看看堆栈,发现暂停堆栈分析也能秒破这个程序

0018F830   00422761  CrackMe.00422761
0018F834   01D3D8E8  ASCII "K$q*a_+@Xt"
0018F838   01D3D848  ASCII "123456"
0018F83C   00000000
0018F840   0018FE6C
0018F844   0043B890  CrackMe.0043B890
0018F848   01D3D8E8  ASCII "K$q*a_+@Xt"
0018F84C   01D3D898  ASCII "tX@+_a*q$K"

分析结束,大牛勿喷!

Reverseme逆向分析

题目只记得大致意思,是说有一个文件.db被这个程序加密了,要想得到key就要么逆向这个加密程序的算法,然后自己写解密程序解密,要么用这个软件修复里面的bug运行两次就可以得到key(坑爹的提示,反正我没有运行两次就整出来了)
同样peid查出无壳,没有加过壳,运行这个程序:

嗯嗯,根据提示,肯定是里面某个函数传参出了问题。
OD载入,刚入口就有这个messagebox,一开始参数出现了错误。

0040103D>/$  68 10304000   push ReverseM.00403010
00401042      6A 01         push 0x1
00401044  |.  E873010000   call ReverseM.004011BC
00401049  |. 83F8 01       cmp eax,0x1
0040104C  |.  7414         je XReverseM.00401062
0040104E  |.  6A00         push 0x0                                 ; /Style =MB_OK|MB_APPLMODAL
00401050  |.  681D344000   push ReverseM.0040341D                   ; |Title = "提示"
00401055  |.  6810344000   push ReverseM.00403410                   ; |Text = "输入参数错误"
0040105A  |.  6A00         push 0x0                                 ; |hOwner =NULL
0040105C  |.  E847010000   call<jmp.&user32.MessageBoxA>          ; \MessageBoxA

跟进Reverse,.004011BC,发现这个函数实际上是在读这个软件的路径,但是没有成功。(算法分析过,结果最近手残OD清空过一次,算法没了,有兴趣的可以自己下去分析,)用IDA分析的算法差不多是下面这个样子:

将读出的路径写到00403010去,这里管不管都行,,因为程序的大致思路是在下面的readfile读出来,然后在write回去。加上pass.db把参数push0x1改为 push 0x0(这个时候会读reverseme.exe)。
单步到这个地方:

00401089  |.  6A00         push 0x0                                 ;/pFileSizeHigh = NULL
0040108B  |. FF35 00304000 push dword ptr ds:[0x403000]             ; |hFile = 0000005C
00401091  |.  E8EE000000   call<jmp.&kernel32.GetFileSize>        ; \GetFileSize
00401096  |.  A304304000   mov dword ptrds:[0x403004],eax
0040109B  |.  6A04         push 0x4                                 ; /Protect = PAGE_READWRITE
0040109D  |.  6800100000   push 0x1000                              ; |AllocationType= MEM_COMMIT
004010A2      FF35 FA2F4000 push dword ptrds:[0x402FFA]
004010A8  |.  6A00         push 0x0                                 ; |Address = NULL
004010AA  |.  E8E1000000   call<jmp.&kernel32.VirtualAlloc>       ; \VirtualAlloc

发现virtualalloc在分配内存的时候分配了0字节(关于这个api不懂的可以百度或者msdn),往上面瞅瞅,刚好有GetFileSize,将参数传递给他,然后绕过这个bug
然后哈,文件就可以正常的读进来了

(这个地方其实是已经得到的正确的key,貌似之前读进来的是一堆asc值好像,记不太清了)同理,绕过下面的bug,然后key就是刚刚那个了。
关于程序入口处第一个messagebox,是要修改跳转的,如果不修改跳转,而把参数0x1改为0x0,发现读进来的是

然后messagebox是没有异常存在了,但是下面那个分配内存的地方还是会出错,然后修改一下,在createfile和readfile之后文件夹中多了这么一个文件

Winhex分析之后实际上就是这个.exe的代码

熟悉的PE结构,然后下面写之后变成这样

哈,分析上面的之后加密算法就可以找出来了。然后找出来之后同样可以对.db解密。
至此,分析完毕,大牛勿喷!

inject

第三个程序:inject:
依然没有壳,想到病毒,第一反应是PE结构,然后也神马都不懂的就winhex了一下,结果啥子都不晓得。管他,运行一下,尼玛啊,啥都没有。看看资源管理器,并没有inject的进程。估计是被玩坏了的样子。
OD载入一下,没的啥思路,看了看字符串,嗯?

提示啊,来到这个函数地方
开始没搞懂这个是神马杰宝,代码并没有分析完全,然后分析了一下代码弄成这个样子:

0043E005   .  6A00         push 0x0
0043E007   .  685BE04300   push Inject.0043E05B                     ;  Key?NO!
0043E00C   .  682BE04300   push Inject.0043E02B                     ;  A02B8DE7F2BCD4ED
0043E011   .  6A 00        push 0x0
0043E013   .  E8F909A775   call kernel32.75EAEA11
0043E018   .  6A00         push 0x0
0043E01A      E8            db E8
0043E01B      47            db 47                                    ;  CHAR 'G'
0043E01C      62            db 62                                    ;  CHAR 'b'
0043E01D      08            db 08
0043E01E      75            db 75  

下面的OD还是没法分析,不过同样是call kernel32.75EAEA11(机器码一样)
在call的时候又一个A02B……的字符串,不过不是key,然后程序因为被病毒感染,所以IAT应该受到破坏了,一运行程序就自己蹦掉
了。

然后想想看还有木有其他办法:
程序从开头直接跳到假码,然后就直接崩了,所以直接把jmp给nop掉
发现了一些很有特征的函数,GetVersion,GetCommandLine……,擦,c程序的入口啊,尼玛跑下来,估计然后查一下字符串,发现了另外一个

坑爹啊,这货就是!!!,但是是在sendmessagebox后面,估计会弹出来个什么框框吧。
最坑爹的事情来了,尼玛nop掉之后我还在程序里面想怎么让他弹出个框,想了好久,每次还是会让这个程序崩掉,后来觉得每次改一遍nop麻烦,就直接先把nop保存下来,然后无聊点了一下保存的文件,靠,直接弹框啊

没道理啊,嗯,要去吃饭了,没怎么弄明白为什么保存之后程序可以正常运行了
,看这个样子估计是程序里面有反调试吧,在OD环境下不会正常运行。
分析完毕,大牛勿喷!!!

第4题题目忘记了

很遗憾当时第4题因为在web上被卡住了未能做出来。第4道题转自我的队友:

下午做了一下,这一题共有两个文件


那个exe打开后如下图

看到那个图片了么,还有一串像key的数字,我猜那串数字一定不是key,而且也不是隐写的题,要不然怎么放逆向这边了呢,所以咱还是要分析这个程序,经过几番尝试,知道源文件编辑框中输入上边这张图,数据文件是你要加入的数据,用txt保存,目的文件是将以上两个文件组合成第三个文件,所以这个目的文件也要是bmp文件。
点按钮“开始隐藏”,会弹出“隐藏信息完毕!”的对话框,可这怎么得到key呢,我们只有从图片中提取key。
用IDA看看,

发现不但有“隐藏信息完毕!”,还有“提取信息完毕!”,找到引用该字符串的代码,在401DD2处,向上翻,

有两个CreateFile,然后又两个ReadFile,又有一个WriteFile,发现CreateFile中的Filename是空的,应该就是那两个特别小的编辑框了,用PE-Explorer将编辑框放大。

就可以输入文件名了,可是怎么到达这处代码呢,看“开始隐藏”,
这部分功能代码与提取信息的那部分代码相似。

具体就不分析了,因为无关紧要,直接改代码,使它跳转到提取信息的代码处

保存运行:

这时候2.txt中就有key了,“B0ACD1BDA3FD1CD6”。

逆向-360逆向writeup相关推荐

  1. 【Android 逆向】逆向修改游戏应用 ( 分析应用结构 | 定位动态库位置 | 定位动态库中的修改点 | 修改动态库 | 重打包 )

    文章目录 一.应用结构分析 二.定位动态库位置 三.定位动态库中的修改点 四.修改动态库 五.重打包 一.应用结构分析 分析上一篇博客 [Android 逆向]逆向修改游戏应用 ( APK 解析工具 ...

  2. 游戏逆向-CSGO逆向透视自瞄分析技巧

    游戏逆向–CSGO逆向分析 分享一下个人所学,说实话自己也不是学的很透,首先我推荐使用Ce结合Old,因为可以看清汇编源码的同时通过ce查找突破口. 首先说一下,在弄清楚所谓的透视自瞄之前先弄清楚什么 ...

  3. 2021年巫妖易语言-js逆向-安卓逆向hook教程

    链接:https://pan.baidu.com/s/1kdiAfXVNHgKT6BFdqzCYsw 提取码:jvw8 2021年最新巫妖易语言-js逆向-安卓逆向hook教程-10.12上课录像(这 ...

  4. 巫妖易语言+js逆向+安卓逆向

    教程介绍 2021年最新巫妖易语言+js逆向+安卓逆向hook培训教程(修复画质声音不同步不加密版),课程主要讲解的内容是易语言+js逆向+安卓逆向hook,课程是2020年11月底刚培训结束的,也是 ...

  5. Android逆向writeup,【技术分享】春秋杯逆向第一题writeup

    最近被春秋杯逆向题坑了两天,记录一下解题过程. 程序一运行,就弹个控制台窗口,啥也没有,拖进IDA看了才知道,是在等待用户输入验证的key: 程序的主框架很简单,就是一运行后初始化一些数据,等待用户输 ...

  6. android 360加固 反编译,[原创]逆向360加固等dex被隐藏的APK

    如果遇到apk中的lib文件夹中是这样的 基本没有dex文件可以反编译,这中的dex文件一般都是加密混淆压缩后放在so中啦. 但是软件要想运行就需要解出dex字节码然后加载到手机内存中,这样就可以在软 ...

  7. 爬虫逆向 js逆向常用工具简单介绍

    古语有云:工欲善其事,必先利其器. 作为逆向的开始,这个自然是无法避免的,毕竟js逆向的环境是浏览器,而浏览器自然为开发做了很多工具,方便再开发的时候检测开发过程中是否有问题,就像开发过程中debug ...

  8. 【Android 逆向】逆向修改游戏应用 ( APK 解析工具 | 解包 -> 分析 -> 重打包 -> 签名 流程 )

    文章目录 一.APK 解析工具 二.解包 -> 分析 -> 重打包 -> 签名 流程 一.APK 解析工具 使用 [Android 逆向]使用 Python 编写 APK 批处理分析 ...

  9. 安卓逆向_1 --- 逆向环境配置、APK 文件结构、APK 打包流程

    哔哩哔哩:https://www.bilibili.com/video/BV1UE411A7rW?p=1 Android 逆向工程师系统培训‹第九期›( 课程目录 ):https://ke.yijin ...

最新文章

  1. 练习2:课工场响应式导航条_作业帮直播课APP下载最新版入口
  2. C语言文件最后一行重复储存,求大佬看看,我这个程序为什么保存进文件只有最后一行...
  3. html loading原理,加载HTML-Loading HTML
  4. MATLAB找不到遗传算法工具箱,用不了gatool命令的解决方案
  5. 数据中心加速,一文说清FPGA与GPU、ASIC目前的竞争格局
  6. cenotos 卸载mysql_CentOS 6.2编译安装Nginx1.0.12+MySQL5.5.21+PHP5.3.10 | 系统运维
  7. spark环境搭建(idea版本)
  8. 阿里云Https部署网站
  9. mysql主库从库在同一台服务器_MySQL数据库的主从配置(多主对一从)
  10. 地平线后端开发实习面经
  11. ZeroMQ使用教程
  12. 百度大脑FaceID人脸识别模型量化技术,确保算法精度无损加速一倍
  13. 以下关于python二维数据的描述中错误的是_关于二维数据CSV存储问题,以下选项中描述错误的是‪‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‫:...
  14. 指法练习软件需求说明书
  15. 双目结构光系统论文阅读总结
  16. html5怎么插入psv,请问psv要怎么才能连接电脑进行文件传输?
  17. excel将B列数据放在A列后面
  18. 论文投稿指南——中文核心期刊推荐(环境科学)
  19. 以下代码中的两个sizeof用法有问题吗?
  20. Android切面编程(AOP)详解

热门文章

  1. FFmpeg入门详解之11:H264BSAnalyzer简介
  2. python多元非线性回归_day-13 python库实现简单非线性回归应用
  3. leetcode(力扣) 718. 最长重复子数组 1143. 最长公共子序列 1035. 不相交的线 (动态规划)
  4. 简单的外汇市场赚钱方法
  5. 2012-2-15雨
  6. 蛇形走线用于什么方面,一文告诉你
  7. mysql只能存1000条数据_为什么我mysql的表添加了1000条记录之后就存不进去数据了,客户端也没报错...
  8. 如何去除 aspose.cells 水印
  9. 老年人计算机培训信息,老年人学习电脑基础知识
  10. html简单的时分秒计时器,时分秒自定义倒计时计时器