无壳的实例

目标:去除软件功能限制

工具:OD

安装好这款软件打开如图:

甲鱼游戏Python 甲鱼软件_Group

这款软件有诸多功能限制,如:

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_02

当我们选择Add Group,提示没有注册只能创建3个Group:

甲鱼游戏Python 甲鱼软件_搜索_03

选择Add,提示没有注册只能添加4个联系人:

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_04

甲鱼游戏Python 甲鱼软件_搜索_05

我们打开About PixtopianBook,弹出未注册版本信息。

我们将其载入OD(建议下载一个原版OD#www.ollydbg.de#,我们尝试手动配置忽略异常)如图:

甲鱼游戏Python 甲鱼软件_消息框_06

点击运行后,并没有出现程序界面,而是抛出了异常:

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_07

我们手动开启忽略异常:

甲鱼游戏Python 甲鱼软件_消息框_08

打开后选择 exception:

甲鱼游戏Python 甲鱼软件_Group_09

勾选如上,再点击Add lase exception。

甲鱼游戏Python 甲鱼软件_消息框_10

配置完成后点击OK。

甲鱼游戏Python 甲鱼软件_消息框_11

配置完成后重新载入程序,点击运行,成功打开了程序。

甲鱼游戏Python 甲鱼软件_消息框_12

 

 

 

正式开始!

 

1、Group

将软件载入OD,点击Add Group。

甲鱼游戏Python 甲鱼软件_Group_13

我们在其弹出消息框后暂停OD。

此时状态栏显示:暂停,我们此时需要返回到程序领空,快捷键Alt+F9。

甲鱼游戏Python 甲鱼软件_搜索_14

然后点击消息框 确定 此时状态栏显示:返回到用户

甲鱼游戏Python 甲鱼软件_搜索_15

我们成功返回到程序领空,向上翻。

甲鱼游戏Python 甲鱼软件_Group_16

看到了一个MessageBox,这就是我们刚才确定的那个消息框。

向下我们将

甲鱼游戏Python 甲鱼软件_消息框_17

这个命令将带我们返回到调用CALL处。所以我们继续向下执行。

甲鱼游戏Python 甲鱼软件_消息框_18

进行retn:

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_19

我们跳出了call,返回到了调用处、

我们看到:

1.这个Call就是我们刚才进入的Call,加入我们能跳过这个call,就能避免跳出消息框。

2.查看这个ascii码,正是消息框的标题和内容,在这里被压入栈,等待调用。

3.这里有一个cmp,比较eax与3大小(即Group是否等于3),如果小于就跳转到(JL)00408B34,如果已经有3个Group了,就执行call弹出未注册消息框。

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_20

你一定已经知道我们将要干什么了!

甲鱼游戏Python 甲鱼软件_消息框_21

将JL(小于则跳转)改为jmp(强制跳转)。

这样我们就成功跳过了GROUP验证。

我们将其保存:

甲鱼游戏Python 甲鱼软件_Group_22

测试一下:

甲鱼游戏Python 甲鱼软件_搜索_23

哈哈,已经可以自由添加Group了!!是不是很有成就感啊!学习逆向成就感很重要哦。

 

 

2、联系人

 

甲鱼游戏Python 甲鱼软件_消息框_24

默认未注册用户只能添加四个联系人,我们采取同样方法:

1、弹出消息框后暂停

2、Alt+F9执行到用户代码

3、点击确定

甲鱼游戏Python 甲鱼软件_Group_25

跳转到这个位置,我们向上翻,看到同样的MessageBox,如下:

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_26

通过retn跳出call,回到调用处,向上翻:

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_27

1、这个call调用了MessageBox,弹出了消息框;

2、这句话同我们看到的一样,确定程序在这里将其压入栈;

3、比较eax与4的大小(联系人是否已经有4个),如果小于等于(JL)4个,那就跳过消息框,否则弹出未注册消息框。

我们同样修改jl为jmp,强制其跳转:

甲鱼游戏Python 甲鱼软件_搜索_28

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_29

保存后测试一下:

甲鱼游戏Python 甲鱼软件_搜索_30

我们又成功搞定了一个功能!这个阉割版已经成了注册版,不过还有一些美中不足的地方。比如:

甲鱼游戏Python 甲鱼软件_Group_31

甲鱼游戏Python 甲鱼软件_Group_32

那我们就开始让它从里到外都是注册版!

 

3、更改版本信息

甲鱼游戏Python 甲鱼软件_消息框_33

标题,版本文字在代码区是找不到的,我们直接在内存中找

甲鱼游戏Python 甲鱼软件_消息框_34

甲鱼游戏Python 甲鱼软件_Group_35

输入查找关键字UNREGISTERED:

甲鱼游戏Python 甲鱼软件_搜索_36

如果ASCII没有搜索到就用UNICODE

(这里ASCII也可以搜索到,不过不是版本信息,UNICODE下搜索到版本信息,点击确定):

甲鱼游戏Python 甲鱼软件_消息框_37

记录下004D4830,在dump面板跳转:

甲鱼游戏Python 甲鱼软件_Group_38

跳转之后成功找到需要修改的内容:

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_39

我们选择要修改的内容,右键编辑:

甲鱼游戏Python 甲鱼软件_消息框_40

编辑为自己想写的字符,如下:

甲鱼游戏Python 甲鱼软件_Group_41

 

 

4、DIY标题

甲鱼游戏Python 甲鱼软件_消息框_42

同样是在内存中查找,在弹出的搜索框里输入关键字:(UNREGISTERED VER

(一般情况下是不知道要搜索的文字是ascii还是unicode,我们会都尝试搜索一次。

甲鱼游戏Python 甲鱼软件_消息框_43

甲鱼游戏Python 甲鱼软件_消息框_44

记下004E4BE6,在dump窗口跟随:

甲鱼游戏Python 甲鱼软件_消息框_45

找到需要修改的字符然后编辑:

甲鱼游戏Python 甲鱼软件_搜索_46

确定后如下图所示:

甲鱼游戏Python 甲鱼软件_Group_47

 

 

5、更改提示注册文字

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_48

同理,我们在内存中搜索:

甲鱼游戏Python 甲鱼软件_搜索_49

首先尝试UNICODE,没有搜索到结果。

再尝试ASCII搜索:

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_50

成功搜到了字符串:

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_51

记录下位置48F974,并跳转到该处:

甲鱼游戏Python 甲鱼软件_搜索_52

用同样的方法编辑ASCII码:

甲鱼游戏Python 甲鱼软件_搜索_53

编辑完成后如下:

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_54

在所有工作做完之后,不要忘记保存:

甲鱼游戏Python 甲鱼软件_Group_55

甲鱼游戏Python 甲鱼软件_消息框_56

保存后我们查看效果:

甲鱼游戏Python 甲鱼软件_消息框_57

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_58

 

 

6、结尾

我们仍发现了一些美中不足的地方。

在进入程序时,首先是欢迎信息:

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_59

几秒后变为:

甲鱼游戏Python 甲鱼软件_Group_60

我们想让它更加简洁,一直显示welcome信息,该怎么操作呢?

那我们开始进行最后一步!!

通过上面的操作我们已经知道了注册文字在48F974处,在dump(数据窗口)窗口右键跳转到48F974

甲鱼游戏Python 甲鱼软件_搜索_61

我们需要知道程序哪一段调用了这段字符串。

我们右键选择查找参考(Ctrl+R)(个人觉得做汉化翻译得有点问题,这个命令的英文是Find references,意思应该是查找引用,参考这个词不太合适):

甲鱼游戏Python 甲鱼软件_Group_62

找到一处引用,我们双击进入:

甲鱼游戏Python 甲鱼软件_Group_63

我们来到如图所示的代码位置:

甲鱼游戏Python 甲鱼软件_甲鱼游戏Python_64

发现上面有一处cmp和jnz(cmp与jnz组合代表:如果不相等,则跳转),如果ebp等于907,则将这串字符压入栈(可以猜测,907代表未注册),我们根据跳转向上翻:

甲鱼游戏Python 甲鱼软件_Group_65

向上翻到这里:

甲鱼游戏Python 甲鱼软件_搜索_66

又有一处cmp和jnz,意思是如果ebp不等于906,就要跳转回0040C22F处。

(我们可以猜测,906代表注册过)

这个程序我们已经完全弄清楚了,我们直接在0040C235的jnz处进行强制跳转,让其不会将这串字符压入栈:

甲鱼游戏Python 甲鱼软件_消息框_67

修改后,我们最后一次保存:

甲鱼游戏Python 甲鱼软件_消息框_68

打开:

甲鱼游戏Python 甲鱼软件_消息框_69

整款软件已经没有限制。。。。。