首页
社区
课程
招聘
[求助]只能说这是死的东西啦`themida 1.0.0.5超级版
发表于: 2007-1-13 22:47 5153

[求助]只能说这是死的东西啦`themida 1.0.0.5超级版

2007-1-13 22:47
5153
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这次的主壳是themida 1.0.0.5,自带驱动型的。一用调试器就会弄得系统重新启动。要脱它的壳需要把OD也用themida 1.0.0.5加壳,以壳克壳,才能对它进行调试。大家知道风雪破解吧?它是用调试器弄过了的,所有和脱机同时运行时会有冲突而重新启动计算机。而现在没几个人能轻轻松松把themida 1.0.0.5脱掉,你把网站搜索个遍也找不到几篇关于themida 1.0.0.5脱壳的文章。。。。。所以这次这脱机想破解是难难难~~~~~~本人能力非常有限,但是也把所看到的所知道的东西拿出来共享,希望对高手们能有点用处:
1。软件破解常用汇编指令

  cmp   a,b   // 比较a与b
  mov   a,b   // 把b值送给a值,使a=b
  ret         // 返回主程序
  nop         // 无作用,英文(no operation)简写,意思“do nothing”(机器码90)
                (ultraedit打开编辑exe文件看到90相当汇编语句的nop)
  call       // 调用子程序,子程序以ret结尾
  je或jz       // 相等则跳(机器码是74或84)
  jne或jnz     // 不相等则跳(机器码是75或85)
  jmp         // 无条件跳(机器码是EB)
  jb         // 若小于则跳
  ja         // 若大于则跳
  jg         // 若大于则跳
  jge         // 若大于等于则跳
  jl         // 若小于则跳
  pop xxx     // xxx出栈
  push xxx     // xxx压栈

                  爆破无敌口诀

            一条(跳)就死,九筒(90)就胡
            (对应上面的2--修改为nop)
            一条(跳)就胡,一饼(EB)伺候
            (对应上面的1--修改为jmp)
                (74) 变(75)
                (84) 变 (85)
2。带壳软件直接打补丁
要实现带壳软件直接打补丁,需要一些技巧和运气,虽然这看起来是很不容易实现的,其实并不象大家想的那么难,下面听我慢慢道来。
要实现这种带壳补丁的目的,当然你需要作充分的前提条件:
过硬的软件跟踪与分析能力,因为你没有软件作者的源码,一切都要靠自己动手;
简单代码编写能力,当然是汇编代码,可以借调试软件帮忙;
必备工具:PEiD、OllyDbg、W32DasM、文本编辑器(WinHex或UltraEdit或其它)、文件增肥工具(如:ZeroAdd)等;
任一编程平台,编写补丁程序用(与使用汉化补丁类似);
最简单的加、减法运算(Icefire:这也算一条?)。
作为练习,下面以 LS定时器为例,看看如何带壳编写破解补丁。这个软件提供如下功能:它可以根据你的设定在你需要的时候提醒你,防止你忘记重要的事情;它可以根据你的设定在你需要的时候运行制定程序;各种提示都是可以是重复的,它可以每分钟、每小时、每日、每天、每周、每月、每年的重复决不会怕麻烦;在某一时间,例如:2004年1月1日20点30分关机;倒计时一定时间,例如:在2小时30分以后关机;当键盘和鼠标没有*作一定时间,例如:在你离开电脑30分钟后关机。
该软件未注册时只能使用30天,30天过后只能注册后才能使用。初步准备
首先使用PEiD探测得知,软件使用了ASPack 2.12->Alexey Solodovnikov加的壳。这种壳脱壳也较为容易,特征标志比较明显。加了这种壳的软件运行时,壳先自行释放被加壳的软件,然后将再运行被加壳的软件。我们只要找出释放后、运行前的位置,在这个位置跳到我们的补丁代码处进行补丁行动,补丁完成后返回,接着继续软件就完事了。
使用OllyDbg载入程序,不用运行。向下滚动代码区,直到找到如下代码:
006083AF 61 POPAD
006083B0 75 08 JNZ SHORT LsDown.006083BA
006083B2 B8 01000000 MOV EAX,1
006083B7 C2 0C00 RETN 0C
006083BA 68 00000000 PUSH 0
006083BF C3 RETN
复制出来备用。在OllyDbg代码区按住右边的滚动条向下拖动,直到底部的全0区域。在全0区域的前部,选一个偏移好记的位置。在代码区双击,在弹出的编辑框中输入任意一条汇编指令,如:RETN。确定后的结果在OllyDbg中选择这段代码,点右键,在弹出的菜单中执行“复制到可执行文件――选择部分(不同版本的OD这个菜单略有不同)”,在跳出的代码框中点右键,并在弹出的菜单中执行“保存文件”,另起一个名称,保存备用(为简化计算,此过程必需)。

深入跟踪
这里是个高强度的工作,你需要有足够耐力和观察分析判断力。你没有注册,又过了试用期。所以你必须找到所有的判断注册与否的关键跳转,并记录下相关的代码部分(该软件使用的非可逆注册算法,只能爆破)。通过寻找,会得到如下关键代码处:
1、005131FA SETE AL
2、0051321E JNZ SHORT LsDown.00513227
3、00533C89 JE SHORT LsDown.00533C91
通过分析和试验,发现需要将它们分别更改成为:
1、005131FA MOV AL,1
NOP
2、0051321E JE SHORT LsDown.00513227
3、00533C89 JNZ SHORT LsDown.00533C91
则软件可以使用并且没有任何限制。

制作模拟补丁
因为这里所说的补丁制作不是在软件里直接完成,而是另用编程软件制作,所以需要取得补丁的汇编级机器码。又因为上述需要修改的汇编代码的机器码为:
MOV AL,1-->B0 01
NOP -->90
JE SHORT LsDown.00513227-->74 07
JNZ SHORT LsDown.00533C91-->75 06
其偏移地址分别为:
005131FA
0051321E
00533C89
所以模拟补丁形如:
MOV WORD PTR SS:[5131FA],1B0
MOV BYTE PTR DS:[5131FC],90
MOV BYTE PTR DS:[51321E],74
MOV BYTE PTR DS:[533C89],75
JMP LsDown.006083BA ;补丁完成后的返回
NOP
NOP
再在OllyDbg中下面的代码区的全0区域的任意位置输入上述汇编代码,然后复制出对应的汇编机器码备用。在返回到偏移006083B0处,将JNZ SHORT LsDown.006083BA改为形如JMP 0060A310(你选定的位置),复制出机器码备用。到此,模拟补丁代码获取工作完成。

编写补丁程序
众所周知,反汇编后的代码位置的偏移与软件经过编译后的物理偏移是不一样的,要在壳外植入补丁需要取得对应位置的物理偏移。我们这里需要两处物理偏移,一处是对应于JNZ SHORT LsDown.006083BA的,一处是补丁部分的起始位置,这就要借助于文本编辑器进行。
用UltraEdit(或其它文本编辑器)打开前面保存的修改过的更名文件,使用查找功能查找hex:75 08 B8 01(对应于JNZ SHORT LsDown.006083BA)。得到首地址为:000935B0h,记下备用,然后拉到文件的最后,查找添加的代码位置(对应RETN),得到首地址为:00095510h(视你选择的位置不同而不同),记下备用,至此全部准备工作完成。
做好上述准备工作后,你就可以使用任一编程软件来编写你的补丁用程序了。
请注意我们所要做的工作:修改006083B0处的跳转;植入动态补丁代码和设置返回跳转,其余还应该考虑版本检测、原文件备份、提示帮助等问题。以下是我用 VB 编写的主要部分代码:
Open Fname For Binary As fhandle
'再次检验
'=============================================
'寻找软件版本的关键标志
'VB中Get命令读数据指针从1开始,注意与hex编辑器中的地址
'的区别。即 偏移+1。
Get fhandle, &H935B0, data1 '为保险读取四个字节,也可多读
Get fhandle, &H935B1, data2
Get fhandle, &H935B2, data3
Get fhandle, &H935B3, data4
'=============================================
If (data1 <> &H61) And (data2 <> &H75) And (data3 <> &H8) _
And (data4 <> &HB8) Then MsgBox "请核对软件版本!", _
vbCritical + vbOKOnly, "文件错误:": Close fhandle: Exit Sub
'修改全部要补丁的数据
'==========================
'壳的出口部分的修改
Put fhandle, &H935B1, &HE9
Put fhandle, &H935B2, &H5B
Put fhandle, &H935B3, &H1F
Put fhandle, &H935B4, &H0
Put fhandle, &H935B5, &H0
Put fhandle, &H935B6, &H90
Put fhandle, &H935B7, &H90
'增加动态修改用代码
Put fhandle, &H95511, &H66
Put fhandle, &H95512, &H36
Put fhandle, &H95513, &HC7
Put fhandle, &H95514, &H5
Put fhandle, &H95515, &HFA
Put fhandle, &H95516, &H31
Put fhandle, &H95517, &H51
Put fhandle, &H95518, &H0
Put fhandle, &H95519, &HB0
Put fhandle, &H9551A, &H1
Put fhandle, &H9551B, &HC6
Put fhandle, &H9551C, &H5
Put fhandle, &H9551D, &HFC
Put fhandle, &H9551E, &H31
Put fhandle, &H9551F, &H51
Put fhandle, &H95520, &H0
Put fhandle, &H95521, &H90
Put fhandle, &H95522, &HC6
Put fhandle, &H95523, &H5
Put fhandle, &H95524, &H1E
Put fhandle, &H95525, &H32
Put fhandle, &H95526, &H52
Put fhandle, &H95527, &H0
Put fhandle, &H95528, &H74
Put fhandle, &H95529, &HC6
Put fhandle, &H9552A, &H5
Put fhandle, &H9552B, &H89
Put fhandle, &H9552C, &H3C
Put fhandle, &H9552D, &H53
Put fhandle, &H9552E, &H0
Put fhandle, &H9552F, &H75
Put fhandle, &H95530, &HE9
Put fhandle, &H95531, &H86
Put fhandle, &H95532, &HE0
Put fhandle, &H95533, &HFF
Put fhandle, &H95534, &HFF
Put fhandle, &H95535, &H90
Put fhandle, &H95536, &H90
Put fhandle, &H95537, &H90
'完成写入,关闭它
Close fhandle

Icefire:细心的读者可能注意到,这两段代码中所使用的首地址比我们记录的首地址多1,这是因为VB的最小指针单位是1而不是0,而文本编辑器等的最小指针单位是0,所以在不同编程平台上编程时要多加注意。

编好补丁代码后,将其编译为可执行程序,然后试试你的东西,看能否将带壳的软件打补丁而且正常工作!我编好的补丁软件界面如果一切正常,那你就大功告成了。

后记
有时,你可能想到要别出心裁的在软件中添加点属于自己有个性的东西,比如警示框等等。那也不难,只要你知道弹出对话框需要什么条件、用到哪些代码就可以做到的。例如:现在我想在软件启动前弹出一个对话框,我们该如何做呢?这个问题当然要难一点。如果壳外有现成的对话框调用函数,就可以简单地进行调用。如果没有则需要添加较多的代码,这里就不讲了,免得有骗稿费之嫌。
总之,编写补丁如同编写一个软件,同样能实现自己的目的与愿望,展示自己的才华与智慧。个中乐趣只有亲自品尝之。
3。脱壳最简单的方法:
方法一:

1.用OD载入,不分析代码!

2.单步向下跟踪F8,是向下跳的让它实现

3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点――运行到所选)

4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!

5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,这样很快就能到程序的OEP

6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入

7.一般有很大的跳转,比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETE的一般很快就会到程序的OEP。

方法二:

ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)

1.开始就点F8,注意观察OD右上角的寄存器中ESP有没出现。

2.在命令行下:dd 0012FFA4(指在当前代码中的ESP地址),按回车!

3.选种下断的地址,下硬件访问WORD断点。

4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP,脱壳

方法三:

内存跟踪:

1:用OD打开软件!

2:点击选项――调试选项――异常,把里面的忽略全部√上!CTRL+F2重载下程序!

3:按ALT+M,DA 打开内存镜象,找到第一个.rsrc.按F2下断点,

然后按SHIFT+F9运行到断点,接着再按ALT+M,DA 打开内存镜象,找到.RSRC上面的CODE,按

F2下断点!然后按SHIFT+F9,直接到达程序OEP,脱壳!

方法四:

一步到达OEP(前辈们总结的经验)

1.开始按Ctrl+F,输入:popad(只适合少数壳,包括ASPACK壳),然后按下F2,F9运行到此处

2.来到大跳转处,点下F8,脱壳之!

方法五:

1:用OD打开软件!

2:点击选项――调试选项――异常,把里面的√全部去掉!CTRL+F2重载下程序!

3:一开是程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按F9到程序

运行的次数!

4:CTRL+F2重载程序,按SHIFT+F9(次数为程序运行的次数-1次

5:在OD的右下角我们看见有一个SE 句柄,这时我们按CTRL+G,输入SE 句柄前的地址!

6:按F2下断点!然后按SHIFT+F9来到断点处!

7:去掉断点,按F8慢慢向下走!

8:到达程序的OEP,脱壳!
2007-1-13 22:56
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
独乐乐`不如众乐乐`
2007-1-13 22:57
0
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
    传说中的火星帖
2007-1-13 23:08
0
雪    币: 208
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
二楼不知所云
火星帖
火星帖
火星帖
2007-1-14 01:08
0
雪    币: 12
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
按题目看通篇都是胡说八道.
2007-1-14 01:15
0
雪    币: 200
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
2007-1-14 10:47
0
游客
登录 | 注册 方可回帖
返回
//