首页
社区
课程
招聘
[原创]verypdf pdf stamp的挑战
发表于: 2007-5-13 09:26 9833

[原创]verypdf pdf stamp的挑战

2007-5-13 09:26
9833
解决verypdf pdf stamp
kflnig
最近手头的破解工作,半成品居多,今天拼了老命终于把它工作成了成品。Crack难,难于上青天!
首先我想的只是爆破。
Peid说:“我什么也没有查到。”在额外信息中我们可以知道它已经加壳了。我猜它不是加了个新壳就是某某某修改版的壳吧!用peid的脱壳插件试试,果然不行。管它呢,既然查不到,那么,我就手动吧。
踏入黑暗深渊的第一步:这里我就不说,我怎么怎么勇敢的脱了他的马甲。因为我差点被它给折腾死,最后依旧无功而返,不是说oep怎么难找,而是我的ImportRec无法找到它的输入表(我开始以为oep找错了,后来才知道并没有找错)。最后正当要放弃的时候,突然想到了还有一个不知从哪里攘来的脱壳实力极强的quick unpack 1.0 beta 3,竟然行了(不知道你的脱壳工具行不行),脱了!^_^(此时才知道我刚才oep并没有找错)
用OD载入它,现在这世上各种各样的od版本真的太多了,我先用的是OD原版(在这里这个有很大的关系),载入后,OD可能会有这样的一个对话框!如图一



没有关系,确定即可。进去之后发现不在它自己的领空,而在系统的ntdll模块中,也没有关系alt+F9就可以了。
踏入黑暗深渊的第二步。假如你现在在看这文章而且你的身边还有一台电脑的话,那么请你也试试看,啊!我的老聃!内存区域空空(其实这个不是大问题,随便来个d esp就出来了),本地调用的名称(ctrl+N)竟然也是空空的,查找字符串一如既往的空空。脱壳不完全啊(是吧?)!怎么办,如何下断?莫着急,我们还有一个极好的插件,就是传说中的命令输入框。F9(运行),出来一个讨厌的东西,叫你注册。回到OD,输入bp GetDlgItemTextA(注意函数的大小写也有关系)。随便输一点,比如123789。我喜欢这个数字。确定,断下来了,在user32的领空里,没有关系alt+F9就可以了(这个方法你记住了吗?)。回到它自己的领空,如图二所示



看到旁边的注释,你大概也知道,这些是什么意思了吧!待我看到到004085EC JE SHORT 复件_PDF.00408627时我感到这个跳转很可疑。所以F8到这里,他说我要跳了,我说你先别跳,在右边寄存器框里的Z上单击。然后F9(这招记住吧,很有用的)。然后这个软件就说:“谢谢。”好,太好了!
所以我们确定004085E2 E8 99F7FFFF CALL 复件_PDF.00407D80是关键call
004085D7取值,004085E2关键call,004085EC跳不得,004085FB注册成功。
看到这里,也许诸君就忍不住想去该那个跳不得的跳转了吧!试试,当然不行,每次启动它都这么输一遍多么讨厌啊!
下面IDA出场。为什么用IDA,因为这个东西,无论是w32AdSM也好,还是其它的也罢,都不行,惟有IDA可以傲慢的笑,载入有些慢,不要着急。好了吗?让我们开始,不要害怕大断大断的代码,爆破不需要每一句都懂,只要懂一个大概就可以了。
PS______:004085B2 loc_4085B2: ; CODE XREF: DialogFunc+5A j
……
PS______:004085F0 push offset asc_4B1A08 ; "感谢?
PS______:004085F5 push offset asc_4B19D8 ; "感谢?
PS______:004085FA push esi ; hWnd
PS______:004085FB call MessageBoxA
其实这里就是图二的一部分,但一个不同点就是IDA把“感谢”和hwnd(句柄)都识别出来了,更容易理解。让我们双击dialogfunc+5a↑j(这就是交叉参考),来到那个地方。这就说明OD中得下断(0040853A)的关键地方,这不用我讲相信大家也都知道了吧!
接下来,OD重新来一次,ctrl+g到0040853A,在此处下断(这时,OD说:“你真的要在这里断点吗?这里可是code段外啊!”,别管它,断!),然后F9,它在此处断下了,下面就要手动跟踪了(F8,步过)。F8一直下去,如果进入了USER32的领空内,那么,你告诉我怎么办?忘了就看前面,答案就是alt+F9!)。不要以为回到了老地方就是进入了软件作者为cracker特别设计的逻辑炸弹里面了,终于,在F8+(alt+F9)的帮助之下,我们又来到了如图三所示的地方



为什么,这个地方引起了我们的重视,看到了吗,enddialog,根据英文猜测:使“请求注册的对话框”消失?还有
call 地址
test 寄存器,寄存器
jnz 地址
太经典的对白了
这两点加在一起使我们想到,0040881A是一个和004085E2(前面图二中找找)具有同样功能的call,判断是否注册成功,假如在00408821的地方跳了,那么就是非常的不走运了。它阴魂不散的又来了!
好了,现在我们就可以把00408821,中的jnz改成jz了。其实更好的改法是把test eax,eax改成sub eax,eax。为什么这样改,因为下面是jnz,也就是说若eax<>0 那么我们就完了,所以eax一定要等于0,那么我们不如手动将它改一改,让eax自己清零,sub同时具有改变标志寄存器的作用,所以zf就被置为1了,下一行也就不会跳了。这样的好处是,在一般情况下,当我们输入了正确的序列号时,如果jnz->jz那么注册反而不成功,按照我的最优改法不会出现那样的情况(虽然这个软件在我们修改之后,注册的按钮会变成不可选)。
你用OD修改并保存好了吗?当然不可以,因为它在code段外,OD无法修改。
踏入黑暗深渊的第三步。
这有什么关系,我用Ultra Edit来修改好了,偏移=0040881F-400000,怎么不对了,机器码不对啊!偏移881F处怎么是19应该是85的啊!不要忘记,现在不在code段内,所以,IDA再次出马!什么,它早被你关了?重新打开。来到0040881f看IDA最下面,如图四所示



图四
所以实际上偏移应该是00007C1F,OD中先把test改成sub得知sub的机器码为2B。好了现在,我优哉游哉打开UE,来到00007C1F,把85改成2B。保存好了一切ok?截一张图片来纪念我们的产物,注册按钮变灰色了!



我也本以为一切Ok了!可是经过使用之后才发现,脱壳之后其实它就死掉了,无法正常使用了。何况修改过之后呢?
踏入黑暗深渊的第四步。
怎么办呢?当然现在让keymake出场,我想也许可以打一个内存补丁。
来到光明的天堂?当然没有它还是依旧跳出来,怎么办?
………………………………
光明的太阳在笑……
上了一个礼拜的学,我又回来了!
有时候爆破并不是最简单的!比如说,这个家伙就是……
这次我用的是fixdbg diy crack team,这个家伙好啊!载入的时候也有一个警告框,不管它,确定就可以了。好啊!现在ctrl+n,^_^,我不说了相信你也知道了,竟然都出现了,都是OD差距咋这么大呢。我想以后我就爱上它啦!还有它的脱壳版和不脱壳版的巨大区别就是在开始载入时的区别!但我们有我们的命令提示框插件,所以其实不脱壳的版本调试也是可以的,但以下我调试的是脱壳了的版本。
好了,爆破不行,现在我们来分析算法。虽然我在这个方面很烂,但是我想不得不!
先用PEID自己带来的插件kanal扫描一下,看到了吗?是这个插件!如图六



图六
查到如图七所示



图七
crc32肯定不是算法!也许是自校验。艾!该打,在爆破前为什么不先检查一下它有无自校验呢!MD5也许会是算法,但是这种算法在这里是不可怕的,如果是RSA或许我看到就跑掉了!
OD载入我们脱了壳的家伙,虽然软件注册后不能用了,但是算法还在,而且还可以被调试,不是天助我也那还会是什么呢,^_^!跳出一个框,输入伪码123789!
然后回到OD,用apibreak(一个插件)下一个万能断点,如图八所示



图八
懒惰的我啊!当然根据后面的代码及注释我们也可以看到下断点在GetDlgItemTextA或MessageBoxA都可以到达!然后回到软件界面,点击确定。
OD断下了。我们按alt+F9(返回到应用程序领空)。
还记得图二吗,好像在很前面是吧!就在那个地方断下了!
004085E2 E8 99F7FFFF CALL 复件_PDF.00407D80是关键call
进去看了看,我把伪码改成1234567898765432(一共16位,先不要问为什么,先看下去)关键代码有点长,但是都是如出一辙!
/*407D80*/ SUB ESP,18
/*407D83*/ PUSH EBX
/*407D84*/ PUSH EBP
/*407D85*/ PUSH ESI
/*407D86*/ MOV ESI,DWORD PTR SS:[ESP+28]//走到这里ESI的储存的地址就是伪码的地址
/*407D8A*/ LEA EDX,DWORD PTR SS:[ESP+C]
/*407D8E*/ PUSH EDI
/*407D8F*/ MOV AL,BYTE PTR DS:[ESI+E]//看到这句和下面一句我们就应该知道密码长度至少就是16位
/*407D92*/ MOV CL,BYTE PTR DS:[ESI+F]//上一句和这一句就是把第15位和第16位复制到al,和cl
/*407D95*/ MOV EDI,DWORD PTR DS:[<&msvcrt.atoi>]//其实这个东西真的很碍眼,因为下面call EDI,call的就是它啊!
/*407D9B*/ XOR BL,BL//BL清零
/*407D9D*/ PUSH EDX
/*407D9E*/ MOV BYTE PTR SS:[ESP+20],AL
/*407DA2*/ MOV BYTE PTR SS:[ESP+21],BL
/*407DA6*/ MOV BYTE PTR SS:[ESP+14],CL
/*407DAA*/ MOV BYTE PTR SS:[ESP+15],BL
/*407DAE*/ CALL EDI//经上面赋值,这里EDI的值已经不变了。所以EDI这个call好像是是关键中的关键。来到了MSVCRT,这个竟然是windows自己的东西,软件作者真的很有趣。我也不知道这个是在干什么,但是经过几轮动态分析之后就明白了。但是经过几轮试验之后发现更多的只是干扰我们的破解,把我们吓跑。对于它的作用,我在调戏它几次之后就了解了,并没有什么的。虽然“猜”这个方法应用比较狭窄,但是我们能够猜出来,有点巧合^_^!
/*407DB0*/ MOV EBP,EAX
/*407DB2*/ LEA EAX,DWORD PTR SS:[ESP+20]
/*407DB6*/ PUSH EAX
/*407DB7*/ CALL EDI
/*407DB9*/ ADD EBP,EAX//其实这里等价于第16位和15位相加的和(注意是等价于不是等于),/*407D8F*//*407D92*/的两句遥相呼应!^_^
/*407DBB*/ ADD ESP,8//这种语句都是为了保持堆栈平衡
/*407DBE*/ CMP EBP,8//比较16位和15位的和是否为8
/*407DC1*/ JE SHORT 复件_PDF.00407DCD//这边一定要跳,否则/*407DC6*/ XOR EAX,EAX之后eax变为0,再RETN(返回)那么又错了!
/*407DC3*/ POP EDI
/*407DC4*/ POP ESI
/*407DC5*/ POP EBP
/*407DC6*/ XOR EAX,EAX
/*407DC8*/ POP EBX
/*407DC9*/ ADD ESP,18
/*407DCC*/ RETN
/*407DCD*/ MOV CL,BYTE PTR DS:[ESI]//都和上面基本一样,没有什么花头!
/*407DCF*/ MOV DL,BYTE PTR DS:[ESI+1]
/*407DD2*/ LEA EAX,DWORD PTR SS:[ESP+10]
/*407DD6*/ MOV BYTE PTR SS:[ESP+1C],CL
/*407DDA*/ PUSH EAX
/*407DDB*/ MOV BYTE PTR SS:[ESP+21],BL
/*407DDF*/ MOV BYTE PTR SS:[ESP+14],DL
/*407DE3*/ MOV BYTE PTR SS:[ESP+15],BL
/*407DE7*/ CALL EDI
/*407DE9*/ LEA ECX,DWORD PTR SS:[ESP+20]
/*407DED*/ MOV EBX,EAX
/*407DEF*/ PUSH ECX
/*407DF0*/ CALL EDI
/*407DF2*/ ADD EBX,EAX//和上面差不多,等价于第一位和第二位的和,也和/*407DCD*//*407DCF*/呼应,^_^
/*407DF4*/ ADD ESP,8
/*407DF7*/ CMP EBX,9//比较第一位和第二位的和是否为9
/*407DFA*/ JE SHORT 复件_PDF.00407E06//还是得跳
/*407DFC*/ POP EDI
/*407DFD*/ POP ESI
/*407DFE*/ POP EBP
/*407DFF*/ XOR EAX,EAX
/*407E01*/ POP EBX
/*407E02*/ ADD ESP,18
/*407E05*/ RETN
/*407E06*/ CMP BYTE PTR DS:[ESI+C],48//更加简单了。因为这都是在ESI的基础上加的,所以第D位(也就是第13)的ascii码值是否为48(即H)
/*407E0A*/ JE SHORT 复件_PDF.00407E16//还是要走
/*407E0C*/ POP EDI
/*407E0D*/ POP ESI
/*407E0E*/ POP EBP
/*407E0F*/ XOR EAX,EAX
/*407E11*/ POP EBX
/*407E12*/ ADD ESP,18
/*407E15*/ RETN
/*407E16*/ CMP BYTE PTR DS:[ESI+9],4B//比较第10位是否为4B(K)
/*407E1A*/ JE SHORT 复件_PDF.00407E26//再跳
/*407E1C*/ POP EDI
/*407E1D*/ POP ESI
/*407E1E*/ POP EBP
/*407E1F*/ XOR EAX,EAX
/*407E21*/ POP EBX
/*407E22*/ ADD ESP,18
/*407E25*/ RETN
/*407E26*/ MOV CL,BYTE PTR DS:[ESI+5]
/*407E29*/ XOR EAX,EAX
/*407E2B*/ POP EDI
/*407E2C*/ CMP CL,4C//第6位是否为4c(L)
/*407E2F*/ POP ESI
/*407E30*/ POP EBP
/*407E31*/ SETE AL
/*407E34*/ POP EBX
/*407E35*/ ADD ESP,18
/*407E38*/ RETN
这个时候写注册机就很容易了,我不写了,最近正为Delphi 8.0都变成了微软.net计划的惨物,解释执行,看着就不爽,感到郁闷呢。注册后会在system32下生成一个叫winpdfstamp.dat的文件,里面有一些看不懂的东西。这个家伙:超级巡警【黑客手册专版】你手头有吗?以前的《手册》中有,开着它,它会对一些修改表示提示,说什么什么产生,什么什么被删除。这样在破解时还是比较好的,至少可以了解软件在注册表或其它动了什么手脚。
提供一组可用的注册码:63378L121K13H135
当然我们可以被脱壳掉的软件删除了,打开未脱壳的软件,输入序列号就可以了。最后截一张图来证明我们的成功,这当然是我给一份PDF文档打了一个戳记,然后打开的了。如图九



整个工作就完成了!
再说一句后话:在看CCDebuger的浅谈程序脱壳后的优化时发现,对比之后确定这个壳是WinUpack 0.39 final 。
浙江省绍兴县柯桥中学高二(3)班李宁

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 154
活跃值: (75)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
沙发,下载收藏
2007-5-13 09:35
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
鼓励一下
2007-5-13 09:55
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
为了浏览方便,顺便将word文档转帖出来了
2007-5-13 10:18
0
雪    币: 219
活跃值: (1634)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
5
厉害,鼓励!
2007-5-13 10:23
0
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
6
图文并茂,好文章
2007-5-13 10:32
0
雪    币: 122
活跃值: (43)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
学习中......
2007-5-13 14:13
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
8
好文,学习中。。。。。
2007-5-13 15:20
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
9
NET
解释执行 ?
脑袋进水了?
2007-5-13 22:16
0
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
10
文章标题把握吓了一大跳,我原以为是搞定了Adobe Acrobat Professional的注册机。
呵呵,不过本文也不错。
2007-5-14 10:43
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
建议楼主拿3D组号大师,或者汉语大辞典来练手.高中生了嘛.
2007-5-15 07:37
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
高中生有空干这个?真强!
2007-6-1 11:17
0
游客
登录 | 注册 方可回帖
返回
//