曾梦想仗剑走天涯,看一看世界的繁华


“六一”儿童节 - []

偶小时候最担心的事情就是,将来没有了“六一”儿童节怎么办。


Posted by monkeycz at 12:54 | Read more | Comments (2) | Trackback (0) | Edit |

北漂流水帐 - []

1。昨天去燕园散步,发现南门的风入松书店不错,好书多多。买了一本摩罗的新书《大地上的悲悯》。

没有什么新的文章,只是原先文章的选集。应该是他的思想历程的一次系统化整理。

不知道摩罗先生现在是否还在黄村?不知道是否还能买到《耻辱者手记》?希望能见摩罗先生一面。

2。刚才去skykiwi,发现我的user ID终于被系统注销掉了。早知道会有这样一天,只是没有想到会这么

快。懒得重新注册了,反正以后去的机会只会更少了。

3。昨天懒得骑车,坐公交车代步。结果回去的时候坐错了车次,被拉到了荒无人烟的远郊。结果只好跑

回去。幸而赶上了末班的公交。

4。吃了一周的拉面,不能再这样继续下去了。否则连我都会变成拉面的。

5。终于买了一个简易的衣柜,结果发现没有什么衣服可以挂进去。得陇望蜀,正在谋划搞一个椅子和桌子。


Posted by monkeycz at 14:39 | Read more | Comments (0) | Trackback (0) | Edit |

分数 - []
终于查到了期待已久的分数,136。 一切都结束了; 除非,发生奇迹…………
Posted by monkeycz at 19:43 | Read more | Comments (0) | Trackback (0) | Edit |

palm程序QED的注册算法分析 - []

palm程序QED的注册算法分析

palm玩了这么久,用的大部分xx软件基本上都是别人搞定的,偶连palm上的程序也只写过"hello world",更不要提破解了。前一段时间心血来潮,想研究一下palm系统的程序,于是找了个注册机制看起来比较简单的程序QED(柿子只捡软的捏:)),决定将其肢解而后快。

palm os 5.0以下配置的主机使用的是MOTOROLA公司出品的龙珠68000处理器作为核心。具体资料参见MOTOROLA公司提供的《M68000 8-/16-/32-Bit Microprocessors User’s Manual》。将被肢解的程序是QED,palm上级负盛名的文本编辑器。偶用的是猪哥汉化修改的QED XP版本,去tompda(玩palm的都知道)搜一下就能找到。

开始动手吧。肢解这种程序最好的工具自然是偶们大名鼎鼎的IDA。打开IDA,载入QED,选择处理器的时候选68000,然后稍等片刻,分析结果就出来了。仔细看了片刻,得出了一个结论——不懂*_*大家不要急着扔臭鸡蛋阿,给你满屏幕68k的汇编代码你也会头晕的。现在只好临阵磨枪了。去MOTOROLA和palmone的网站搜罗一通,找了几本书和SDK下来,恶补了一阵子,结果什么也没有看下去,只好硬着头皮继续上。

打开PALM的模拟器,载入QED,选择注册,随便输入试炼码,将弹出一个对话框告诉你“输入无效”。看来就从这里下手了。在SDK中扒了半天,从sdk40-doc.zip中找到《Palm OS Programmer’s API Reference》。经过与鸟文的一番搏斗,终于在找到了这样的一个函数:FrmCustomAlert。原型是:UInt16 FrmCustomAlert (UInt16 alertId, const Char *s1, const Char *s2, const Char *s3)。介绍说:Create a modal dialog from an alert resource and display the dialog until the user taps a button in the alert dialog.看来就是它了。为了保险起见,用OnBoard C写了个“hello world”验证,结果样式和“输入无效”一样。然后祭出秘密武器RsrcEdit,发现了痕迹——Talt 1000——这就是那个无情的“输入无效”。

在IDA中查找FrmCustomAlert,经过几次定位,找到了一处可疑的地方:
code0001:00001D4E loc_2E0E:                               ; CODE XREF: sub_2D72+88j
code0001:00001D4E                 move.l  a0,-(sp)
code0001:00001D50                 move.w  #$3E8,-(sp)
code0001:00001D54                 systrap FrmCustomAlert()
这里调用的就是资源号为1000的对话框。向上看:
code0001:00001D2A                 lea     byte_2D50,a0
code0001:00001D2E                 move.l  a0,-(sp)
code0001:00001D30                 lea     dword_2D52,a0
code0001:00001D34                 move.l  a0,-(sp)
code0001:00001D36                 lea     dword_2D57,a0
code0001:00001D3A                 bra     loc_2E0E
code0001:00001D3E ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
code0001:00001D3E
code0001:00001D3E loc_2DFE:                               ; CODE XREF: sub_2D72+68j
code0001:00001D3E                 lea     off_2D5B+3,a0
code0001:00001D42                 move.l  a0,-(sp)
code0001:00001D44                 lea     dword_2D65,a0
code0001:00001D48                 move.l  a0,-(sp)
code0001:00001D4A                 lea     dword_2D6A,a0
这些地址对应的字符串分别是:“感谢您”和“输入无效”,看来就是这个地方了。

全部复制上来:
code0001:00001CB2 ; 圹圹圹圹圹圹圹?S U B R O U T I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹?
code0001:00001CB2
code0001:00001CB2 ; Attributes: bp-based frame
code0001:00001CB2
code0001:00001CB2 proc            sub_2D72()              ; DATA XREF: sub_137A:loc_14C4o
code0001:00001CB2
code0001:00001CB2 var_54          = -$54
code0001:00001CB2 var_40          = -$40
code0001:00001CB2 var_32          = -$32
code0001:00001CB2 arg_0           =  8
code0001:00001CB2
code0001:00001CB2                 link    a6,#-$34
code0001:00001CB6                 movem.l d3-d4/a2,-(sp)
code0001:00001CBA                 movea.l arg_0(a6),a2
code0001:00001CBE                 clr.b   d3
code0001:00001CC0                 systrap FrmGetActiveForm()
code0001:00001CC4                 move.l  a0,d4
code0001:00001CC6                 move.w  (a2),d0
code0001:00001CC8                 cmpi.w  #$18,d0
code0001:00001CCC                 beq     loc_2E4C
code0001:00001CD0                 bhi.s   loc_2D9C
code0001:00001CD2                 cmpi.w  #9,d0
code0001:00001CD6                 beq.s   loc_2DA8
code0001:00001CD8                 bra     loc_2F2C
code0001:00001CDC ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
code0001:00001CDC
code0001:00001CDC loc_2D9C:                               ; CODE XREF: sub_2D72+1Ej
code0001:00001CDC                 cmpi.w  #$1C,d0
code0001:00001CE0                 beq     loc_2E26
code0001:00001CE4                 bra     loc_2F2C
code0001:00001CE8 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
code0001:00001CE8
code0001:00001CE8 loc_2DA8:                               ; CODE XREF: sub_2D72+24j
code0001:00001CE8                 cmpi.w  #$646,8(a2)
code0001:00001CEE                 bne.s   loc_2E26    ;或取试炼码
code0001:00001CF0                 moveq   #-$28,d3
code0001:00001CF2                 add.l   a6,d3
code0001:00001CF4                 move.l  d3,-(sp)
code0001:00001CF6                 bsr     sub_576C    ;获取系统当中的用户名
code0001:00001CFA                 move.l  d3,-(sp)
code0001:00001CFC                 bsr     sub_57AE    ;以用户名为参数,计算注册码
code0001:00001D00                 move.w  d0,d3      ;真正的注册码出现了
code0001:00001D02                 move.l  dword_82AC-A5BASE(a5),-(sp)
code0001:00001D06                 systrap MemHandleLock()
code0001:00001D0A                 move.l  a0,-(sp)
code0001:00001D0C                 systrap StrAToI()    ;把试炼码转换为数字
code0001:00001D10                 clr.l   d1
code0001:00001D12                 move.w  d3,d1
code0001:00001D14                 lea     $50+var_40(sp),sp
code0001:00001D18                 cmp.l   d0,d1      ;关键的比较,随便修改一下,比如cmp.l d0,d0即可实现爆破
code0001:00001D1A                 bne.s   loc_2DFE    ;转跳意味着失败
code0001:00001D1C                 lea     unk_82D4-A5BASE(a5),a0
code0001:00001D20                 move.w  d3,$42(a0)
code0001:00001D24                 move.b  #1,byte_8290-A5BASE(a5)
code0001:00001D2A                 lea     byte_2D50,a0
code0001:00001D2E                 move.l  a0,-(sp)
code0001:00001D30                 lea     dword_2D52,a0
code0001:00001D34                 move.l  a0,-(sp)
code0001:00001D36                 lea     dword_2D57,a0
code0001:00001D3A                 bra     loc_2E0E
code0001:00001D3E ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
code0001:00001D3E
code0001:00001D3E loc_2DFE:                               ; CODE XREF: sub_2D72+68j
code0001:00001D3E                 lea     off_2D5B+3,a0
code0001:00001D42                 move.l  a0,-(sp)
code0001:00001D44                 lea     dword_2D65,a0
code0001:00001D48                 move.l  a0,-(sp)
code0001:00001D4A                 lea     dword_2D6A,a0
code0001:00001D4E
code0001:00001D4E loc_2E0E:                               ; CODE XREF: sub_2D72+88j
code0001:00001D4E                 move.l  a0,-(sp)
code0001:00001D50                 move.w  #$3E8,-(sp)    ;对话框编号1000
code0001:00001D54                 systrap FrmCustomAlert()  ;决定命运的对话框

跟进sub_57AE,看看注册算法如何:

code0001:000046EE ; 圹圹圹圹圹圹圹?S U B R O U T I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹?
code0001:000046EE
code0001:000046EE ; Attributes: bp-based frame      ;注册算法
code0001:000046EE
code0001:000046EE proc            sub_57AE()              ; CODE XREF: sub_2D72+4Ap
code0001:000046EE                                         ; sub_399E+42p
code0001:000046EE
code0001:000046EE var_C           = -$C
code0001:000046EE arg_0           =  8
code0001:000046EE
code0001:000046EE                 link    a6,#0
code0001:000046F2                 movem.l d3-d4/a2,-(sp)
code0001:000046F6                 movea.l arg_0(a6),a2
code0001:000046FA                 clr.w   d3                    ;d3放的是最终的注册码,先清空
code0001:000046FC                 move.l  a2,-(sp)
code0001:000046FE                 move.l  a2,-(sp)
code0001:00004700                 systrap StrToLower()    ;全部字符转换为小写
code0001:00004704                 suba.l  a0,a0                 ;偏移计数器
code0001:00004706                 move.b  (a2),d1               ;取用户名的第一个字符
code0001:00004708                 bra     loc_580A              ;好戏开始了:)
code0001:0000470C ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
code0001:0000470C
code0001:0000470C loc_57CC:                               ; CODE XREF: sub_57AE+5Ej
code0001:0000470C                 move.w  d1,d0
code0001:0000470E                 addi.w  #-$61,d0        ;ascll码转换
code0001:00004712                 cmpi.w  #$19,d0         ;是否是26个字母中的一个
code0001:00004716                 bhi.s   loc_5804        ;非法字符,跳过(是否大于#$19)
code0001:00004718                 clr.w   d4              ;清空循环计数器
code0001:0000471A
code0001:0000471A loc_57DA:                               ; CODE XREF: sub_57AE+54j
code0001:0000471A                 move.w  d3,d2           ;备份已经计算好的注册码
code0001:0000471C                 moveq   #$F,d0
code0001:0000471E                 lsr.w   d0,d2           ;d2>>#$0F->d2
code0001:00004720                 lsl.w   #1,d3           ;d3<<#$01->d3
code0001:00004722                 tst.b   d1
code0001:00004724                 bge.s   loc_57EA
code0001:00004726                 ori.w   #1,d3           ;d3|#$1->d3
code0001:0000472A
code0001:0000472A loc_57EA:                               ; CODE XREF: sub_57AE+36j
code0001:0000472A                 move.w  d1,d0
code0001:0000472C                 andi.w  #$7F,d0 ; ''
code0001:00004730                 move.w  d0,d1           ;待计算的字符加上#$7F->d1
code0001:00004732                 lsl.w   #1,d1           ;d1<<#$01->d1
code0001:00004734                 tst.b   d2
code0001:00004736                 beq.s   loc_57FC        ;if(d2==0) goto
code0001:00004738                 eori.w  #$1021,d3       ;d3^#$1021->d3
code0001:0000473C
code0001:0000473C loc_57FC:                               ; CODE XREF: sub_57AE+48j
code0001:0000473C                 addq.w  #1,d4           ;循环计数器加1
code0001:0000473E                 cmpi.w  #7,d4           ;循环7次
code0001:00004742                 ble.s   loc_57DA        ;是否结束循环
code0001:00004744
code0001:00004744 loc_5804:                               ; CODE XREF: sub_57AE+28j
code0001:00004744                 addq.w  #1,a0           ;偏移计数器加1,继续下一个
code0001:00004746                 move.b  (a2,a0.w),d1    ;(a2+a0)->d1,取偏移计数器指向的字符
code0001:0000474A
code0001:0000474A loc_580A:                               ; CODE XREF: sub_57AE+1Aj
code0001:0000474A                 ext.w   d1              ;结束了么?
code0001:0000474C                 bne.s   loc_57CC        ;没有结束就继续处理
code0001:0000474E                 tst.w   d3              ;是否成功的计算出注册码
code0001:00004750                 bne.s   loc_5816        ;通向光明大道
code0001:00004752                 move.w  #$27BB,d3       ;嘿嘿,看到没有,#$27BB,万能注册码呃。不过使用的前提是你得有个非法

的用户名
code0001:00004756
code0001:00004756 loc_5816:                               ; CODE XREF: sub_57AE+62j
code0001:00004756                 move.w  d3,d0           ;d0中就是正确的注册码
code0001:00004758                 movem.l var_C(a6),d3-d4/a2
code0001:0000475E                 unlk    a6
code0001:00004760                 rts                     ;回去喽
code0001:00004760 ; End of function sub_57AE

分析到此结束。我们现在有三种方法搞定这个软件了。
1。爆破:修改00001D18处的代码为cmp.l d0,d0或者修改00001D1A处的转跳即可。
2。后门:构造一个非法的用户名,然后用10171作为注册码试试看:)不过非法的用户名可不是随便就可以构造出来的,最简单的实验方法就是,打开模拟器,不要修改默认的用户名,然后填入10171,自己看结果吧。
3。注册机:根据上面的分析,也基本上可以写出注册机了。现在QED的注册机满天飞,这里我也就不献丑了。

这次分析搞了很长时间(主要是偶太懒,而且每次看见鸟文就头晕,继而犯困,继而会周公,继而周而复始 :) ),结果犯了大忌,心浮气躁,分析只得草草结束。虽有虎头蛇尾之嫌,不过幸而没有中断,总算是搞完了。
第一次搞PALM程序,加上偶临阵磨枪的68k汇编,不免错误百出,不当之处望大虾指正。


今天是伟大的五四运动八十六周年纪念日,向八十六年前那些“真的勇士”们致敬!



monkeycz
2005年05月04日(纪念伟大的五四运动)


Posted by monkeycz at 18:57 | Read more | Comments (0) | Trackback (0) | Edit |

文曲星NC1020的文件系统结构 - []

文曲星NC1020的文件系统结构

这几天整理各种资料,居然从一份镜像中翻到了四年前写的这篇文章。这篇最早完成的分析笔记我早已经认为丢掉了,很是可惜了一阵子,现在失而复得的心情自然难以言表。兴奋之下,决定放到坛子上挨臭鸡蛋。不过由于这已经是四年前的笔记了,不免年久失修。而且以前搞的东西现在基本上完全忘掉了,想修订也力不从心了。所以这篇文章仅供纪念用。

感谢
====================
感谢xunhonghai发现并修改了这篇文章中的多处技术错误,没有你的指点和NCTOOLS,我是很难完成这篇文章的。
感谢sun、曾半仙和众多无私帮助过我的朋友,同时还要感谢sun延续了数个平台数个版本的神奇工具WQXHEX和曾半仙天马行空的思想。
感谢lee和他开发的更加神奇的PCTools,相信很多搞WQX的朋友都是从这个工具开始接触WQX开发的。其中的反编译功能和行编译器(记得是另一位大虾在PCTools的基础上二次开发的,不过记不得这位大虾的名字了,在此一并感谢)使我受益匪浅。

序言
====================
文曲星NC1020是金远见公司于2001年开发一款电子词典。以6502芯片为核心,配置16K RAM作为主存,512K FLASHROM作为辅存。除正常的电子词典功能外,可以执行二进制可执行文档(bin),解释执行BASIC程序(bas),浏览文本格式电子书(txt)。

正文
====================
1.簇
NC1020中的文件是保存在FLASH ROM里,以4k为一个文件读写单位,即一簇的大小为4k.

2.标记定位表
在nc中,标记一簇是否被占用和占用的文件的具体定位的信息是存在闪存中的一个表中,我把这个表称为标记定位表.目前还不清楚系统是怎样查找的这个表的,也许是用穷举搜索,或是有一个标志字节,就和cc800的类似.但我认为前一种的可能性更大,即利用标记定位表的标志字穷举搜索.标记定位表是占用的任一非系统占用簇.在它所占用的簇的开头的$00$0f偏移处是它的标志字,即WQXFlashSX......就是了.遍历所有的簇并判断$00$0f偏移是否为WQXFlashSX......即可找到此表的位置.
标记定位表从偏移$10处即是正式的内容.从偏移$10开始每4个字节为一项.在NC1020中总共有128项.分别标记闪存的0040000FBFFF512K的内容.
从第一项开始往后,分别以这样的顺序标记了每一簇闪存004000,005000,006000......0F8000,0F9000,0FA000,0FB000.即项数8为此项标记的闪存页码数,n=(项数 Mod 8)为其所标记页的第n簇.
再说一下每一项的具体含义
FF5FFF01--是标志系统占用
FF5FFF03--是标志本标记定位表所占用
XX5E0006--目录表占用
XX5E0004--文件表占用
XX5EYYC2--一般文件占用
FFFFFFFF--空占用
NN1ENNNN--空占用(N为任意值)
XX5EYY18--重要事项占用
XX5EYY0C--记事占用
XX5EYY10--笔记便笺占用
XX5EYY0A--行程占用
XX5EYY08--名片占用
以上,XX表示的是一个定位符,和目录表或文件表中的定位符相对应,表示某一目录项或文件项在闪存中的位置.若文件表或目录表的定位符与那一标记定位表中的项的定位符一致,就表示此目录或文件就在此标记项所标记的簇中.具体定位符在目录表或文件表中的偏移,下文会提到.
YY表示文件块的顺序.因为文件在保存中并非一定不是线性的,而是以每簇为一块,成块保存的.这时就需要一个值标记,这一簇是这一定位符所标记文件的第几块.YY就是这个作用.从00开始按顺序排列.

3.目录表和文件表
每一目录表和文件表都和标记定位表一样,要占用一簇.
从$20偏移开始是正式内容.每1F字节为一项.
偏移$00--C0表示这是一个正常目录表,C8表示这是一个正常文件表,00表示此项以被删除,
偏移$01--FF表示这一项处于正常状态,F7表示此目录或文件不可删除,FB表示此目录或文件不可视
偏移$02-$31--是目录或文件名,结束用20表示,必须填充满.
偏移$32-$34--是此目录或文件的建立日期
偏移$35-$37--FFFFFF(作用未知)
偏移$38-$3C--标记定位符
$38-$3A--是文件长度,需和实际文件的文件头中的文件长度相一致
$3B--就是上文所说的定位符了,它和哪一项标记定位表项的定位符一致,那么此目录表所标志的目录或此文件表所标志的文件就在那一项标记定位表象所标记的簇中储存.根据此值和标记定位表,我们可以找到任一文件的地址
$3C--00(作用未知)
$3D-$3F--FFFFFF(作用未知)

4.文件结构
NC1020系统中默认支持若干种文件格式,其中比较重要的有bin(可执行文档),BAS(GVBASIC的源代码文件),txt(文本文档)。

(1).bin文件
nc1020的bin文件在pc端是被加密的.在下载到nc1020的过程中,首先被解密,然后再传输到NC1020. (加解密算法参见sun的程例)
nc1020的bin的执行方法有两种,一是当文件小于等于8k时的方法,二是当文件大于8k时的方法.现在分类的来说.
当bin文件小于等于8k时,bin文件被装入ram的$2000开始的地址,到$3fff为止,总共是8k长度.然后从$2007开始执行.但如果文件大于8k,就没办法装入ram了,所以就只能在flashrom里执行.开始地址是$4007.但是这样的话就出了一点问题了.bin在下载到nc里的时候,不一定是线性的,即使是线性的,也不一定每一个bin都能占据到$4000开始的地方.对于小于等于8kbin来说,这还没有什么,反正都是要装入$2000开始执行的,也没有绝对寻址错误的问题.但大于8k的bin就不行了,可以说按这种情况,这样的bin就没有办法绝对寻址,因为bin被保存到哪一簇是未知的.但是还记得当一个大于8k的bin在第一次被执行的时候的情况么有一个装入中...的进度条出现.这个的作用就是解决绝对寻址错误的问题.在这时,系统要把这个bin按顺序转移到一个$4000开头的地方,也就是说每一个大于8k的bin都是从$4000开始的.所以nc也只能装入12个大于8k的bin(有4页是系统占用).这样的话,每次从$4007开始执行,就没有绝对寻址的错误了.
再说一下bin的文件结构.
偏移00-02
如果是=8k,就是AAA55A
如果是8K,就是AEEEEA
偏移03-05就是上文所说的所说的那个文件长度了.必须和文件表中对应项的文件长度相一致.
偏移0620(作用不明)
偏移07-09从这里开始.一般都是一个JMP转跳.
偏移0A-0F是BIN文件的版本号,一般必须是以下内容
70031003FFFF
或者
70033103FFFF
以后的就是正式内容了,上面的0F字节便是文件头.

(2).BAS文件
和PC1000的BAS文件结构一样,装入RAM的$2000后调用GVBASIC进行解释执行,所以也不能超过8K.

(3).TXT文件
偏移00-05000000000001(作用不明)
偏移06-0900180000(作用不明)
偏移0A-0C文件长度
偏移0D-0E0000(作用不明)
偏移0F-17重复06-0E的内容
以后就是正文部分.


monkeycz
于2005年04月30日修订


Posted by monkeycz at 10:45 | Read more | Comments (0) | Trackback (0) | Edit |

大病中 - []

大病中,记得去年大病也是愚人节的前后,不过今年的似乎更严重些,而且是外伤。还好现在已经从医院出来休养了。

3月23日晚,被一群喝醉酒的小流氓打伤住进医院,头部缝了四针,左侧锁骨似乎也断掉了。

3月26日晚,突然发高烧,长期不退热,持续4、5天。

4月1日,在我的强烈要求下,医生终于给办了出院手续。于是出院修养。同时每天两次跑到医院去点滴青霉素。

是以记。


Posted by monkeycz at 12:11 | Read more | Comments (2) | Trackback (0) | Edit |

偈语 - []

偈语

参佛从戒非本要

一切但向空中寻


Posted by monkeycz at 09:14 | Read more | Comments (0) | Trackback (0) | Edit |

我们是无知 - []

我们是无知

我走在未知终点的旅途中
与千万人作伴
他们之间
没有太阳的马和王冠
没有小丑和英雄
甚至不是为了尊严和爱情

不是宿命
使我们在这路上踟蹰而行
像孩子般的快乐和哭泣
对于命运和结局
我们是无知


2005年03月08日


Posted by monkeycz at 17:23 | Read more | Comments (1) | Trackback (0) | Edit |

EcE应用实例-脱壳篇 - []

EcE应用实例-脱壳篇

E-Code Explorer(EcE)的新版本终于赶在年前完成了,感谢支持偶的兄弟,没有你们的帮助和支持,EcE早就停止开发了。偶要在这新年之际向你们说一声:“多谢”。本来计划中的易语言反编译功能没有在这个版本中加入,因为着手后才发现工作量比原先的预计要大得多(幸而偶从来没有许诺过要在哪一个EcE版本中加入这个功能,嘿嘿,怎么听起来像是前年在谈论DOOM3~~~~~~~)。如果顺利的话,希望能在后两个版本内初步完成这个东东,呵呵……

说了这么多废话了,该进入正题了,免得浪费大家大年夜的时间来看偶的废话连篇。偶以前写过一篇关于易语言生成的程序脱壳的文章(拙作见http://monkeycz.blogbus.com,《易格式可执行文件脱壳方法一则》)。文章里面用到的一个主要工具就是偶的拙作EcE。当时的EcE还是0.54版,刚完成不久,所以使用起来可能还很不顺手,需要很多第三方软件来辅助脱壳。现在这种情况略有了一些改善——就是对付大多数的壳,只需要使用EcE经过几个简单的步骤就可以完成了。其实细心的朋友也许会发现,EcE的最近几次升级的功能多数都是和脱壳相关的,可能是偶脱壳的水平实在是太烂了,所以总想尽快把壳给搞掉。嘿嘿,又扯远了。下面我们就用一个例子来做一下示范。

在EcE0.70版的Example目录下有几个示例文件,其中有一个文件名是“ASProtect加壳后的示例程序.exe”的(下面就把它简称为1.exe),偶们就拿它下手(插播广告:如果您手边还没有最新版本的EcE的话,请到EcE的发布网站http://monkeycz.china3t.com下载。广告完毕。)。虽然偶的ASProtect好久没有升级了,也不比最近的若干猛壳那么生猛,但是只是个例子阿,将就先用吧:)

首先运行1.exe(如果你的机器上没有易语言支持库导致程序错误,请把1.exe复制到Example目录得上级目录,在运行即可),会弹出一个简陋得不能再简陋的界面,毕竟是示例程序,大家不要bs偶阿。不用管它,启动EcE,操刀并肩子上阿。由于1.exe已经被加壳(这不是废话么),所以直接载入分析肯定会报错的(记得有人告诉我说这是个BUG,偶也搞不清楚究竟算不算),所以需要提前设置EcE的分析参数。

在“设置”菜单中选择“分析设置”,“分析对象类型”中选择“其他包含易格式的文件”。这时候就可以启动这次的主角了——易格式捕捉者。这个功能可以从待分析的文件中根据特征码自动找到所有的疑似易格式代码。选择“启动易格式捕捉者”,特征码部分一般不需要修改。这样前期的准备工作就做完了。

下一步选择“文件”-〉“打开文件”,从弹出的“选择打开对象”面板中选择“进程中的程序”,我们就可以看到进程列表了。从中找到刚才我们运行的1.exe,选择“载入分析”。

接下来会询问你是否要使用多线程分析,如果你的机器不错的话,就不必选择多线程了,否则会更慢的。如果第一步设置正确的话,这时候你将看到“易格式捕捉者”的窗口出来冒泡了。现在把注意力集中在左边的疑似基址列表中,如果列出了疑似地址,基本上已经成功了一半。如果提示没有捕捉到易格式,也不要灰心,偶会建议你手脱的,毕竟手脱才是高手之道:)

从疑似列表中选择一项载入分析,如果有多个疑似地址的话,一般很可能第一个就是。在这个例子中,只会出现一个地址,不用犹豫直接载入好了。经过一段时间的等待(视机器的配置而定),如果EcE的信息栏中提示成功,就可以进入下一步了。

这时候偶们已经把易格式从乌龟壳中提取出来了,但是还有很关键的一步需要做,否则dump出来的程序也是无法运行的,这就是重定位修复。为什么要进行这一步,偶在《易格式可执行文件脱壳方法一则》中已经基本上说明白了,这里就不赘述了。先把易格式保存到磁盘上,“工具”-〉“导出易格式原体”,起个名字保存,这里用的是1.ecf。

下面我们需要再设置一次EcE。“设置”-〉“分析设置”中,先关闭掉“易格式捕捉者”,“分析对象类型”选择“易格式原体”。然后偶们就可以载入刚才dump出的那个易格式原体文件1.ecf了。“文件”-〉“打开文件”-〉“磁盘中的程序”,找到1.ecf载入。下面开始修复重定位信息。“工具”-〉“易格式从定位信息修复”,这个时候会询问重定位的基址,这个需要根据载入的疑似地址+PE的ImageBase来确定,不过一般上面默认的地址就可以,不需要自己修改。确认后,等(还是和机器的配置有关),最后应该会提示你“修复成功”。

现在的dump出易格式已经算是正常了,不过单独的易格式原体还不能运行,偶们需要给他找一个新骨骼(每当这个时候,偶总想到《忍者神龟》中的史莱德,真像~~~~~~~~~~~~)。先“文件”-〉“关闭文件”(不是映射阿)。“工具”-〉“易格式植入PE骨骼”,选择修复好重定位信息的1.ecf,然后输入保存到的文件名,这里偶用的是1.exe。确认后,稍等片刻(偶们有充足的理由等待,因为马上就要完成了,等吧~~~~~~~~),就弹出来了令人振奋的“已经将易格式原体植入PE骨骼中”。

好了,到此为止基本上偶们的脱壳大业已经完成,当然不要高兴得太早,还有最最重要的一步没有做呢——去测试一下脱壳后的程序是否运行正常吧。如果不出意外的话,偶们就可以躲在屏幕另一边偷偷露出阴险的笑容了,嘿嘿……




monkeycz
2005年02月09日02:45(农历新年的第一天阿,就是大年初一啦)




ps:其实这篇文章在大年夜就开始构思了,结果为了看央视春节联欢晚会,只好拖到大年初一的凌晨来完成了。其实偶最pf的节目就是那个“千手观音”的舞蹈,pf那些聋哑人,他们在无声的世界中依然活得很精彩,他们是就是强者(叔本华大叔打起精神来吧,让偶们一起向尼采的“乌云之上的闪电”致敬——人,是应该被超越的!)。这篇文章没有什么技术含量,很抱歉让你花了这么多时间来看这个。如果你发现文章中有什么错误或者有好的建议,请与我联系:coffin13@183.ha.cn。不敬之处望高手谅解。



Posted by monkeycz at 03:06 | Read more | Comments (2) | Trackback (0) | Edit |

EcE升级了 - []

升级更新:

1。加入了从进程中载入程序分析。同时可以查看到详细的进程信息。
2。加入了“易格式捕捉者”功能,可以通过特征码字自动从当前文件(或进程)中捕捉到易格式数据,供用户有选择的载入分析。
3。加入了“选择打开对象”面板,通过面板选择从何处(文件或进程)载入程序。
4。在“内容观察”窗口,加入了“显示中文”功能。可以使显示的字符在英文和中文之间切换。
5。修改了“内容观察”窗口的布局,使之更加合理。
6。修改了“树型视图”面板,加入了图标对项目进行修饰。改进了m_szLibString部分的显示方式。
7。修改了“分析设置”窗口的布局,使之支持“易格式捕捉者”功能。
8。对软件的界面作了小幅度的修改,去掉了原先的“载入文件栏”,加入了菜单和工具条。同时对部分控件的显示样式进行了修改。
9。加入了对文件拖放的支持。
10。加入了对命令行的支持。

下载地点为:http://monkeycz.china3t.com

PS:其实昨天就完成了,本来说晚上传过来,结果太困,睡着了,就拖到了今天。

又PS:这一条是关于技术上的。这次的EcE所有的组件都加壳了(具体是什么壳自己去查吧,反正都是由历史的东西了)。原因一是因为杀毒软件的误报问题还没有解决;原因二就是这次的升级文件尺寸远大于前一次,没有加壳前接近3M了,只好加壳压缩一下,结果还不错,1.23M。


Posted by monkeycz at 10:19 | Read more | Comments (0) | Trackback (0) | Edit |


Page共14页 第一页 上一页 5 6 7 8 9 10 11 12 13 14 下一页 最后一页
© Powered by BlogBus.Com. 2002-, All Rights Reserved.