前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于shudepb的搜索

关于pb程序的破解(职称英语学习帮手)_个人主页_百度空间 相册 广场游戏 登录注册 关注此空间 个人主页聊吧 2007-05-24 12:19 关于pb程序的破解(职称英语学习帮手) 2007年6月30日要职称英语考试,找了个职称英语学习帮手,看了别人的破解文章,学习了一下,觉得比较不错,特意转过来,同时将职称英语学习帮手2007的2.92版和职称英语单词记忆帮手顺带破解了一下。仅仅为了记忆而已,没有什么其他目的。标 题: 【原创】pb程序调试初探作 者: lzqgj时 间: 2007-05-10,22:48链 接: http://bbs.pediy.com/showthread.php?t=44277软件名称:职称英语学习帮手(综合类)破解工具:OD,shudepb,pbkill,winhex破解目的:自用最近要考职称英语,下载了个职称英语的软件来学习。未注册的版本只能阅读每个部分第一篇,可惜我的银子不够,只好拿它开刀。打开程序目录,顿时傻眼:PB程序。关于PB程序的调试可以说网上几乎还没有,可见非常困难。没有反编译工具几乎是不可能完成的任务。而即使是反编译出来,如果编程功力不够,也很难看出注册方法和写注册机。而爆破关键跳转目前在网上我还没有搜到跳转的机器码是什么。调试过程的那个辛苦啊,我只想说:破解=运气+毅力。真的,运气可能是第一位的。先找工具反编译。试了pbkill,只得到一堆if...else...end if之类的,一句代码也没有出来(可能是pbkill试用版吧?)在网上又搜到另一个反编译工具shudepb,使用确实很好,支持全局搜索,大大方便找关键代码。全局搜索提示:"对不起,你尚未注册,只能阅读每一部分的第一篇文章!欢迎注册!",找到以下代码://Has been Shielded.index = PARENT.ddlb_text.finditem(PARENT.ddlb_text.text,1)index ++IF index > 1 AND gb_register = FALSE THEN //3 PARENT.ddlb_text.text = PARENT.is_etitle messagebox("提示","对不起,你尚未注册,只能阅读每一部分的第一篇文章!欢迎注册!") THIS.setfocus() RETURNEND IF //3ls_text = PARENT.ddlb_text.text(index)IF ls_text = "" THEN //10 index -- PARENT.ddlb_text.text = PARENT.ddlb_text.text(index) RETURNEND IF //10PARENT.ddlb_text.text = PARENT.ddlb_text.text(index)PARENT.ddlb_text.triggerevent(selectionchanged!)RETURN这个就是点击“下篇”按钮时的过程,判断是否大于第一题和是否未注册,两者条件都满足时跳出NAG。gb_register是个全局变量,是否注册的标志。再次搜索gb_register可以找到很多赋值语句,说明程序多处进行校验。注册过程就不贴了,感觉还是比较复杂,我没看明白,只好想到用爆破的方法。于是艰苦的调试过程开始了。众所周知,PB程序类似于VB的pcode,是解释执行的,调试时在pbvm80.dll中转,与pcode又有很大不同,你几乎找不到程序在什么地方进行比较,什么地方根据比较结果进行跳转(至少没有人公开过)。用OD载入程序,运行,点“下篇”弹出NAG,回到OD,F12暂停,Alt+F9运行,回到程序点确定,程序中断,不断F8单步执行(按住不放好了),最终发现程序在下面一段反复执行:10CEEB52 MOV ECX,DWORD PTR SS:[EBP-20]10CEEB55 XOR EAX,EAX10CEEB57 ADD ECX,EDX10CEEB59 MOV AX,WORD PTR DS:[ECX]10CEEB5C LEA EAX,DWORD PTR DS:[EAX+EAX*2]10CEEB5F SHL EAX,210CEEB62 MOV EBX,DWORD PTR DS:[EAX+10DF2B84]10CEEB68 LEA EDX,DWORD PTR DS:[EDX+EBX*2+2]10CEEB6C MOV DWORD PTR DS:[ESI+14],EDX10CEEB6F MOV EDX,DWORD PTR SS:[EBP-24]10CEEB72 PUSH EDX10CEEB73 LEA EDX,DWORD PTR SS:[EBP-E8]10CEEB79 PUSH EDX10CEEB7A PUSH EDI10CEEB7B PUSH ECX10CEEB7C PUSH ESI10CEEB7D CALL DWORD PTR DS:[EAX+10DF2B80] --->关键,程序解释入口10CEEB83 MOV DWORD PTR SS:[EBP-4],EAX10CEEB86 MOV EAX,DWORD PTR DS:[EDI+24C]10CEEB8C ADD ESP,1410CEEB8F TEST EAX,EAX10CEEB91 JE SHORT PBVM80.10CEEBAA10CEEB93 PUSH EDI10CEEB94 MOV DWORD PTR SS:[EBP-4],110CEEB9B CALL PBVM80.10CEE64010CEEBA0 ADD ESP,410CEEBA3 MOV DWORD PTR SS:[EBP-18],EAX10CEEBA6 TEST EAX,EAX10CEEBA8 JE SHORT PBVM80.10CEEBBF10CEEBAA MOV EAX,DWORD PTR DS:[ESI+38]10CEEBAD TEST EAX,EAX10CEEBAF JE SHORT PBVM80.10CEEBB810CEEBB1 MOV DWORD PTR SS:[EBP-4],010CEEBB8 MOV EAX,DWORD PTR DS:[ESI+18]10CEEBBB TEST EAX,EAX10CEEBBD JE SHORT PBVM80.10CEEB41根据对pcode的了解,猜测10CEEB7D CALL DWORD PTR DS:[EAX+10DF2B80]即是程序解释的入口。不断跟踪发现解释原理是这样的:根据EAX值的不同,程序call到不同位置执行不同任务,如读取程序的代码,然后解释执行程序等。猜测当EAX=2AC或0C或18时,会读取原程序代码,等于其它一些数值时会执行原程序。不能直接在10CEEB7D处下断,因为一返回程序就会中断。于是对“下篇”按钮下WM_lbuttonup消息断点,点击后中断,返回OD,在10CEEB7D处下断,F9运行。当EAX不等于2AC或0C或18时跟F7进去看看。经过n次(未统计,估计>200),终于在EAX=93C时找到了需要的代码,跟进去程序为:10D967B0 MOV ECX,DWORD PTR SS:[ESP+C]10D967B4 PUSH EBX10D967B5 PUSH ESI10D967B6 PUSH EDI10D967B7 MOV ESI,DWORD PTR DS:[ECX+10E]10D967BD XOR EBX,EBX10D967BF LEA EDX,DWORD PTR DS:[ESI-38]10D967C2 MOV DWORD PTR DS:[ECX+10E],EDX10D967C8 >MOV EDI,DWORD PTR DS:[ESI-1C]10D967CB MOV EAX,DWORD PTR DS:[EDX]10D967CD CMP EAX,EDI --->对应index > 1的比较10D967CF MOV EAX,110D967D4 SETG BL --->对应index > 1的比较10D967D7 MOV WORD PTR DS:[EDX],BX10D967DA MOV BL,BYTE PTR DS:[EDX+4]10D967DD TEST AL,BL10D967DF JNZ SHORT PBVM80.10D967EA10D967E1 TEST BYTE PTR DS:[ESI-18],AL10D967E4 JNZ SHORT PBVM80.10D967EA10D967E6 XOR EDX,EDX10D967E8 JMP SHORT PBVM80.10D967EC10D967EA MOV EDX,EAX10D967EC MOV ESI,DWORD PTR DS:[ECX+10E]10D967F2 OR DH,510D967F5 POP EDI10D967F6 MOV WORD PTR DS:[ESI+4],DX10D967FA MOV EDX,DWORD PTR DS:[ECX+10E]10D96800 POP ESI10D96801 POP EBX10D96802 MOV WORD PTR DS:[EDX+6],710D96808 MOV EDX,DWORD PTR DS:[ECX+10E]10D9680E MOV WORD PTR DS:[EDX+1A],010D96814 MOV EDX,DWORD PTR DS:[ECX+10E]10D9681A ADD EDX,1C10D9681D MOV DWORD PTR DS:[ECX+10E],EDX10D96823 RETN继续跟踪,当EAX=804时,跟进得到如下代码:10D95580 MOV ECX,DWORD PTR SS:[ESP+C]10D95584 PUSH EBX10D95585 PUSH ESI10D95586 XOR EBX,EBX10D95588 MOV ESI,DWORD PTR DS:[ECX+10E]10D9558E LEA EDX,DWORD PTR DS:[ESI-38]10D95591 MOV DWORD PTR DS:[ECX+10E],EDX10D95597 MOV AX,WORD PTR DS:[EDX]10D9559A >CMP AX,WORD PTR DS:[ESI-1C] --->对应gb_register = FALSE的比较10D9559E MOV EAX,110D955A3 SETE BL --->对应gb_register = FALSE的比较10D955A6 MOV WORD PTR DS:[EDX],BX10D955A9 MOV BL,BYTE PTR DS:[EDX+4]10D955AC TEST AL,BL10D955AE JNZ SHORT PBVM80.10D955B910D955B0 TEST BYTE PTR DS:[ESI-18],AL10D955B3 JNZ SHORT PBVM80.10D955B910D955B5 XOR EDX,EDX10D955B7 JMP SHORT PBVM80.10D955BB10D955B9 MOV EDX,EAX10D955BB MOV ESI,DWORD PTR DS:[ECX+10E]10D955C1 OR DH,510D955C4 MOV WORD PTR DS:[ESI+4],DX10D955C8 MOV EDX,DWORD PTR DS:[ECX+10E]10D955CE POP ESI10D955CF POP EBX10D955D0 MOV WORD PTR DS:[EDX+6],710D955D6 MOV EDX,DWORD PTR DS:[ECX+10E]10D955DC MOV WORD PTR DS:[EDX+1A],010D955E2 MOV EDX,DWORD PTR DS:[ECX+10E]10D955E8 ADD EDX,1C10D955EB MOV DWORD PTR DS:[ECX+10E],EDX10D955F1 RETN找到比较代码还是不能爆破的,因为这些代码是在pbvm80.dll中,程序的正确运行是需要它的。还要找到原程序的代码并修改。这个可没有现成经验。我的修改思路是将index > 1改成index > 99999(随便你修改),(gb_register是变量,不容易修改的)在10D967C8 >MOV EDI,DWORD PTR DS:[ESI-1C]处观察ESI-1C的值为A09420,对A09420下硬件写入断点,运行时会中断很多次,在最后中断在10D9559A >CMP AX,WORD PTR DS:[ESI-1C]的前一次看,得到程序读入1F30658处的值(即0),在数据窗口中显示为:01000000390001000300F40931000100000039000100010006,用Winhex打开程序,搜索,找到地址:0013AC27处,修改0100为FFFF,保存。再次运行程序,点下篇,没有NAG了吧?实际程序还没有爆破完全,但是功能限制已经取消了。小结一下:10CEEB7D CALL DWORD PTR DS:[EAX+10DF2B80] 是PB程序解释入口,EAX值不同代表不同功能我猜测EAX=93C时比较是否大于,EAX=804时比较逻辑值是否相等。其它的值代表的含义希望大家继续跟踪贴出来分享。调试程序好累,写文章更累。真的需要很好地耐心。休息一下,明天继续爆破注册。那个稍微容易点。 #破解 分享到: 举报 浏览(3088) 评论(13) 转载 你可能也喜欢 1994年野马汽车---工程车 2015 Mercedes-Benz S65 AMG 停车时需要掌握的四项技巧 《速度与激情6》特技驾驶幕后大揭秘 布加迪威龙Meo Costantini 特仕款亮相迪拜车展 1957宝马507 Loewy概念车 Windows 无人值守安装 本文最近访客 heiketian10 Jackbase Sound strongaq 评论 帮助中心 | 空间客服 | 投诉中心 | 空间协议©2014 Baidu