跳至主要内容

160个CrackMe之001 Acid burn

http://ift.tt/2i73gJv

[TOC]

前期准备工作

熟悉软件流程

首先打开软件,熟悉一遍软件的流程,以便了解基本导入口点

可以看到,界面的主要交互有2个,以一个是serial/name

还有一个就是serial

查看PE信息

首先用PEID扫一下,看看是什么语言编写的,连接器版本,有没有壳,TLS回调函数等

查看了这写信息之后,主要想做的事情就是点击check 的时候正确就好了(其实应该是逆出算法更好的,但是真心不想动)

开干

下断分析

根据点击发现,输入错误的时候,会填出一个框用来提示,那么猜一下这个框是什么东西,是MessageBox 还是Dialog 或者其他的,不妨挨个下断点试试
就还有一个点就是弹出的框中有字符串提示,其实可以搜一下字符串,直接找到这个定位(鉴于这样做的成本最小,所有先从搜索字符串开始吧)
###第一步
- 破解serial/name

果然,一搜就搜到了,果然难度为1的就是简单的

直接定位过去

0042FB03     /75 1A         JNZ SHORT Acid_bur.0042FB1F
0042FB05  |. |6A 00         PUSH 0x0
0042FB07  |. |B9 CCFB4200   MOV ECX,Acid_bur.0042FBCC                ;  Congratz !!
0042FB0C  |. |BA D8FB4200   MOV EDX,Acid_bur.0042FBD8                ;  Good job dude =)
0042FB11  |. |A1 480A4300   MOV EAX,DWORD PTR DS:[0x430A48]
0042FB16  |. |8B00          MOV EAX,DWORD PTR DS:[EAX]
0042FB18  |. |E8 53A6FFFF   CALL Acid_bur.0042A170
0042FB1D  |. |EB 18         JMP SHORT Acid_bur.0042FB37
0042FB1F  |> \6A 00         PUSH 0x0
0042FB21  |.  B9 74FB4200   MOV ECX,Acid_bur.0042FB74                ;  Try Again!
0042FB26  |.  BA 80FB4200   MOV EDX,Acid_bur.0042FB80                ;  Sorry , The serial is incorect !
0042FB2B  |.  A1 480A4300   MOV EAX,DWORD PTR DS:[0x430A48]
0042FB30  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]


可以看到怎么会这么简单,正好有个JNZ跳转,爆破嘛,当然是直接NOP掉喽

0042FB03      90            NOP
0042FB04      90            NOP
0042FB05  |.  6A 00         PUSH 0x0
0042FB07  |.  B9 CCFB4200   MOV ECX,Acid_bur.0042FBCC                ;  Congratz !!
0042FB0C  |.  BA D8FB4200   MOV EDX,Acid_bur.0042FBD8                ;  Good job dude =)
0042FB11  |.  A1 480A4300   MOV EAX,DWORD PTR DS:[0x430A48]
0042FB16  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
0042FB18  |.  E8 53A6FFFF   CALL Acid_bur.0042A170
0042FB1D  |.  EB 18         JMP SHORT Acid_bur.0042FB37
0042FB1F  |>  6A 00         PUSH 0x0
0042FB21  |.  B9 74FB4200   MOV ECX,Acid_bur.0042FB74                ;  Try Again!
0042FB26  |.  BA 80FB4200   MOV EDX,Acid_bur.0042FB80                ;  Sorry , The serial is incorect !
0042FB2B  |.  A1 480A4300   MOV EAX,DWORD PTR DS:[0x430A48]
0042FB30  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]


然后第一个步就搞定了

第二步

  • 破解serial

同样的搜索字符串,找到如下代码:

0042F4D5     /75 1A         JNZ SHORT Acid_bur.0042F4F1
0042F4D7  |. |6A 00         PUSH 0x0
0042F4D9  |. |B9 64F54200   MOV ECX,Acid_bur.0042F564                ;  Congratz!
0042F4DE  |. |BA 70F54200   MOV EDX,Acid_bur.0042F570                ;  God Job dude !! =)
0042F4E3  |. |A1 480A4300   MOV EAX,DWORD PTR DS:[0x430A48]
0042F4E8  |. |8B00          MOV EAX,DWORD PTR DS:[EAX]
0042F4EA  |. |E8 81ACFFFF   CALL Acid_bur.0042A170
0042F4EF  |. |EB 18         JMP SHORT Acid_bur.0042F509
0042F4F1  |> \6A 00         PUSH 0x0
0042F4F3  |.  B9 84F54200   MOV ECX,Acid_bur.0042F584                ;  Failed!
0042F4F8  |.  BA 8CF54200   MOV EDX,Acid_bur.0042F58C                ;  Try Again!!
0042F4FD  |.  A1 480A4300   MOV EAX,DWORD PTR DS:[0x430A48]
0042F502  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]


NOP 掉JNZ跳转

0042F4D5      90            NOP
0042F4D6      90            NOP
0042F4D7  |.  6A 00         PUSH 0x0
0042F4D9  |.  B9 64F54200   MOV ECX,Acid_bur.0042F564                ;  Congratz!
0042F4DE  |.  BA 70F54200   MOV EDX,Acid_bur.0042F570                ;  God Job dude !! =)
0042F4E3  |.  A1 480A4300   MOV EAX,DWORD PTR DS:[0x430A48]
0042F4E8  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
0042F4EA  |.  E8 81ACFFFF   CALL Acid_bur.0042A170
0042F4EF  |.  EB 18         JMP SHORT Acid_bur.0042F509
0042F4F1  |>  6A 00         PUSH 0x0
0042F4F3  |.  B9 84F54200   MOV ECX,Acid_bur.0042F584                ;  Failed!
0042F4F8  |.  BA 8CF54200   MOV EDX,Acid_bur.0042F58C                ;  Try Again!!
0042F4FD  |.  A1 480A4300   MOV EAX,DWORD PTR DS:[0x430A48]
0042F502  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]

然后就结束了QAQ

The post 160个CrackMe之001 Acid burn appeared first on cole.

http://ift.tt/2jCxxAb reverse engineering, reverse December 01, 2017 at 07:44PM

评论

此博客中的热门博文

反Hook 之自己实现GetProcAddress和LoadLibraryA(c++ version)

http://ift.tt/2AocAD0 // 课上练习.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> //要实现的功能: /* 自己实现GerProcAddress LoadLibraryA */ //思路: /* GerProcAddress和LoadLibraryA都是在Kernel32.dll中的 首要的任务就是找到Kernel32.dll,然后遍历IAT就能找到这两个函数 现在首要的难点就是如何找到kernel32.dll() 通过dll的加载顺序可以找到,而且虽然需要使用未文档化的API,但是好在windgb可以直接看,而且用到的也并不是很多 懒得去晚上搜了,直接自己实现一个得了,作为演示,能用就行(最好还是搜一个正规的结构体) */ /* 0: kd> dt _TEB /a nt!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID +0x028 ActiveRpcHandle : Ptr32 Void +0x02c ThreadLocalStoragePointer : Ptr32 Void +0x030 ProcessEnvironmentBlock : Ptr32 _PEB //首先实现部分TEB结构体,因为只需要用的PEB的部分,所以实现到这就ok了 */ //构建 TEB typedef struct _TEB { //保证0x30是peb的结构体就ok了 struct _tem { DWORD a1; DWORD a2; DWORD a3; DWORD a4; DWORD a5; DWORD a6; DWORD a7; DWORD a8; DWORD a9; DWORD a10; ...

IDA动态调试ELF中遇到的问题(1)

https://ift.tt/2Gxnf2F 遇到 got SIGCHLD singal(child status has changed)...这种提示 singal fork了子进程 直接点yes,然后继续单步执行,出来提示 pass to application就行了 内存查看 用od习惯了之后,凡事都想右键看一下内存,但是IDA中好像没有那么如意, 目前只是在栈中右键发现有查看hex的选项 动态调试的时候的nop ida保存动态调试的时候修改的数据 方法一:在程序运行的时候保存 The post IDA动态调试ELF中遇到的问题(1) appeared first on cole . https://ift.tt/2q9Qf5g WHATEVER April 05, 2018 at 09:44AM

手工加壳Demo- C++Version

http://ift.tt/2AAEutK // 手动加壳demo.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> #include <string.h> typedef struct _StubConf { IMAGE_NT_HEADERS ntheader; }STUBCONF; class PeFile { public: PeFile(); ~PeFile(); bool OpenFile(const char*FilePath); bool InitHdrs(); PIMAGE_SECTION_HEADER addSection(const char * secName, DWORD dwSecSzie); PIMAGE_SECTION_HEADER getSection(const char* secName); DWORD Size2ALi(DWORD dwSize, DWORD dwALi); void peclose(); void setOpe(DWORD newOep); LPVOID peGetProcAddress(const char* szFnName); DWORD RVATOOFFSET(DWORD rva); ULONG_PTR getfileBuff(); PIMAGE_NT_HEADERS getNtHeader(); PIMAGE_OPTIONAL_HEADER getOptionHeader(); void fixStubReloc(DWORD oldImageBase, DWORD newImageBase, DWORD oldSectionRva, DWORD newSectionRva); void setSecData(IMAGE_SECTION_HEADER* pScn, void* pSectionData, DWORD dwSectionSize); bool savea...