今日又偶得一个CrackMe文件,这次这个过程非常愉快,反汇编和编写注册机过程让人非常的身心愉悦~

十分佩服该文件CODER的思维,居然..居然想到用机器码哈哈~

编写这个注册机的过程学习到很多,特别对程序在最后一步认证的时候的巧妙调用十分叹服!

序列号验证系列CrackMe中难得的一个佳作!

注册机编写出来后依然陶醉于作者的”点睛之笔”

若没一定的机器码基础最好别拿这练习逆向~~不然你会难过的!

一组可用key:

shadowkong

C365BF56

yous~唠叨完上注册机源码

http://dl.dbank.com/c0x8rbx382

今日又偶得一小C,PEID一看有壳…脱之

我们的目的是逆向和分析算法

脱壳后发现是PHI写的 PHI和ASCII C 或者MASM32写的区别是很大的~

例如不能在关键API断点拉(我对PHI编程一点不熟悉  估计人家也用不到WINDOWS API)

那就找呗~

附上原文件+注册机 同样注册机是一贯的汇编编写…

给一组可用注册码:

shadowkong
ADCM4-48444240445044444442-YEAH!

虽然这算法简单 但编写这算法的帅哥真帅..看这序列号多好看!

http://dl.dbank.com/c0hanhnnys

今日再偶得一CRACKME文件,乃出自当年ACG破解组织成员之手~

我们说过目的是逆向不是破解,这个注册机编写过程不对程序进行断点(去壳情况下)

不调试跟踪,不单步并入

一组可用的注册码是:

shadowkong

189456

原程序带有中断检测机制,带有注册失败次数检测等~

以下是原文件+注册机~

同样用的是汇编实现~

http://dl.dbank.com/c0zpz2tvfe

昨天用酷狗7听歌的时候越看那广告越不舒服…于是自作主张的把它去了~现在上传分享

由于酷狗7的反崩溃检测太恶心 以至于昨晚搞了好久~

之前的版本网上说能改外部文件实现 但是到现在最新版本的外外部文件已加密~变成了16进制文件~分析算法太麻烦

于是用了几个小方法..运行1小时后 还很坚挺~

一下是效果图:

最后是修改后的EXE:http://dl.dbank.com/c0gwjzdka2

之前看到一牛人把修改机器码而达到破解或者破软件硬性限制的目的,第一次听到突感此方法自叹不如,但研究了下发现,其实能通过修改反汇编代码而达到同样的目的. 汇编相对于机器码大家都知道,机器码要晦涩难懂得多,例如E8 EB 70XX 72XX之类的跳转指令,55 56 57等栈堆处理指定等,若没有长久的接触 谁能立马分辨出其对应的功能??在这并不是说修改机器码不OK,其实只要能达到目的而且不产生新的问题的话 修改啥都OK,

关键在与 修改机器码其实比修改汇编代码更能 产生附加BUG,当然读机器码就像读1234的人除外.

例如简单的修改一个跳转 JMP  DWORD PTR [4*EAX+040300H],这咋一看是一个动态跳转,如果我要在第一次跳转的时候让它不跳…修改机器码和汇编代码的差别就出来了…

用汇编写了个半成品(部分技术超越暂时..待V1.2以后版本那啥)

功能有:

(1)获取内存状态

(2)端口占用状态

(3)进程列表+进程管理

(4)清理系统垃圾(非外部调用,外部调用参见http://shadowkong.com/archives/133

首先上图~

比较悲剧的是端口监听功能上实现得太没进步了~还是外部调用…..

.

.

.

.

.

.

.

.

.

详解:

<1>获取内存状态

代码:

_GetMemInfo proc  uses ecx
local @stMemInfo:MEMORYSTATUS
local @szBuffer[1024]:byte
local @szBuffer1[50]:byte
.while F_STOP
mov @stMemInfo.dwLength,sizeof @stMemInfo
invoke GlobalMemoryStatus,addr @stMemInfo
invoke wsprintf,addr @szBuffer,addr szInfo,\
@stMemInfo.dwTotalPhys,@stMemInfo.dwAvailPhys,\
@stMemInfo.dwTotalPageFile,@stMemInfo.dwAvailPageFile,\
@stMemInfo.dwMemoryLoad,\
@stMemInfo.dwTotalVirtual,@stMemInfo.dwAvailVirtual
invoke SetDlgItemText,hWinMain,IDM_INFO,addr @szBuffer
invoke wsprintf,addr @szBuffer1,addr szInfo1,@stMemInfo.dwMemoryLoad
invoke SendMessage,hWinStatus,SB_SETTEXT,3,addr @szBuffer1
invoke Sleep,1000
.endw
ret
_GetMemInfo endp
;————————————————————————–
参考罗老师的子程序,创建线程把这个作为回调给它~这样获取内存就能自己一个人在那里工作了~
经过修改的回调函数具有更人性化的功能~
首先看红色代码句,判定停止工作的条件是一个全局变量
也就是通常人们所说的全局标志~
只要F_STOP不是ZERO 线程就一直运行下去~
再看绯红色代码句,在循环中让线程睡觉(挂起)1秒~
这主要考虑到在对文本框发送内存状态转换后的内容替换的闪烁问题…
经过挂起1秒 发现效果不明显..就像叫你工作然后只给你每次休息一秒你还是觉得累一样~
举个更贴切的例子就像我叫清风去捕鱼,然后没给他打电话不准停止捕鱼一样~但是他每打一次鱼都能休息1秒~
可是悲剧的是每次休息完他都喊累…哎
<2>清理垃圾
前面说到了外部调用.BAT文件..通过管道把文件运行返回的信息返回到程序缓存区..
今天在这里改进下,不需要外部调用直接…内部…原理是找到特征文件..然后invoke DeleteFile…
这里要知道几种特殊文件夹的路径等…例如怎么获取本机的临时文件夹拉 等等~
<3>进程列表+进程管理
遍历原理:
主要是调用CreateToolhelp32Snapshot
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
再通过
Process32First Process32Nex 遍历进程 +进程IP~
然后再写到列表框上…
结束进程原理:
通过OpenProcess获得选定进程的ID
然后调用TerminateProcess强制结束…这种方法虽然可以实现结束 但是..不是最好的方法..万一进程没保存啥重要东西那不是悲剧??
除此之外还在程序上加了各种控件和绘图等小技巧…算是对之前学习的一个总结归纳吧~
附上PE文件下载连接….
PS:内存状态子功能改写到书本例子~只不过加入了线程调用运行~