前往Shuct.Net首页

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

关于PBKILLER的搜索

如何破解PB6.5编译的程序(转)Mark备查 - chengg0769 来自四川,在东莞虚度十载 - 博客频道 - CSDN.NET chengg0769 来自四川,在东莞虚度十载 PB反编译_Powerbuilder DeCompiler_PB反编译器_PB混淆器_PB加密 目录视图 摘要视图 订阅 新年新气象------CSDN2014新版导航就要跟大家见面了 2014年1月微软MVP当选名单揭晓! 消灭0回答,赢下载分 “我的2013”年度征文活动火爆进行中! 专访何海涛:“不正经”程序员的进阶之路 如何破解PB6.5编译的程序(转)Mark备查 2009-07-26 16:51 799人阅读 评论(0) 收藏 举报 破解bytecintegerpowerbuilderdelphi 以下所有均针对PowerBuilder6.5编译的伪码程序(即带有PBD的文件执行)。PowerBuilder的伪码编译同VB伪码编译一样,同样是PB动态库(PBVM60.DLL),解释伪码执行。而PBVM60.DLL对取字符串、比较字符串、比较数值与我们常见到的c或汇编或delphi等等语言生成的执行文件不一样。为此,我用PB6.5生成一段代码,然后跟踪,摸出一些经验:我的Pb代码如下:(不要看有什么意思,纯粹为了研究)string ls_t1,ls_t2,ls_444long ll_l1,ll_l2,ll_l3ll_l1 = 12325ls_t1 = sle_1.text //看在PB中如何取字符串值。sle_1 是单行编辑框。ls_t2 = '12325'll_l2 = integer(ls_t1) //看此处会触发什么ll_l2 -= ll_l1if ls_t1 <> 'fdfggfh' Then //研究PB的字符比较会调用什么。=========重点ll_l2 = ll_l2 * 2elsell_l3 = integer('24354')end ifif ll_l2 <> 3107 Then //研究PB如何进行数值比较,我们如何截取。==========重点ls_444 = 'goto error'elseMessageBox('error','dddd') //PB的messagebox调用那个APIend ifMessageBox('error','dddd') //PB的messagebox调用那个APIls_444 = 'goto oookkk' //研究PB如何赋字符串值ll_l2 = integer(ls_t2)ll_l2 -= ll_l1if ll_l2 <> 0 ThenMessageBox('error','dddd')end if上面的代码很乱,仅仅是为了追踪研究。OK,现在用TRW2000加载执行,首先用bpx hmemcpy (即所谓的万能断点):结果不中断,却在我气愤的用鼠标点击单行编辑框时触发(真莫名其妙)。改用bpx getdlgitemtexta(getdlgitemtext)也不中断。用bpx Getwindowtexta结果,每输入一个字符就中断,真烦人。用bpx messageboxaOK,提示消息时,中断。说明PB的MessageBox时调用MessageBoxA的API。但这用处不大,PBD是解释伪码执行的,我几乎没有办法来找出那里是确定是否来弹出提示框。因为它一句一句的解释执行,弹出消息框的行与判断条件的行被PB隔的不知那里去了。再用用lstrcmpa:哈哈,比较字符串的地方被截取了,如下:KERNEL32!lstrcmpA017F:BFF77304 PUSH EBX017F:BFF77305 PUSH ESI017F:BFF77306 PUSH EDI017F:BFF77307 PUSH EBP017F:BFF77308 PUSH DWORD 01F2017F:BFF7730D PUSH DWORD BFFA21CB017F:BFF77312 PUSH DWORD [FS:00]017F:BFF77319 MOV [FS:00],ESP017F:BFF77320 MOV EAX,ESP017F:BFF77322 PUSH DWORD [EAX+24]017F:BFF77325 PUSH DWORD [EAX+20]017F:BFF77328 CALL BFF71247017F:BFF7732D POP DWORD [FS:00]017F:BFF77334 ADD ESP,BYTE +08017F:BFF77337 POP EBP你试试 D EAX 和 D EDI 你看到了什么,哈哈,你输入的字符串和要比较的字符串,那现在你要做的是什么,去做吧,什么??,不知道!!,拿笔记下另外一个字符串!!那,是不是PB的字符串比较都是这个呢,我又写了乱七八糟的代码,然后同样可以这样获得。好了,现在字符串比较可以轻松搞定,那又如何截取到数值比较呢??这比较烦了,还要看别人写的程序如何了。你看到我写的代码了吗,用了不少integer函数,一般要比较数值时,它都会把你输入的字符串转为整型或者长整型数值,即一般会调用integer()或者long()函数。我们现在就现以integer来做。重新启动TRW2000,记住把PBVM60.DLL放到TRW2000的DLL目录,让TRW2000启动时读入PBVM60.DLL,这样我们就可以以PBVM60里的函数来设定断点了。打入:bpx fninteger =====》PB的Integer()函数执行。被中断PBVM60!fnInteger017F:10BB8180 MOV EAX,[ESP+04]017F:10BB8184 SUB ESP,BYTE +70017F:10BB8187 PUSH EBX017F:10BB8188 PUSH EBP017F:10BB8189 PUSH ESI017F:10BB818A MOV ESI,[EAX]017F:10BB818C PUSH EDI017F:10BB818D PUSH ESI017F:10BB818E XOR EBX,EBX017F:10BB8190 CALL `PBVM60!ot_get_next_evaled_arg`017F:10BB8195 MOV CL,[EAX+04]017F:10BB8198 AND ECX,BYTE +01017F:10BB819B MOV EBP,ECX017F:10BB819D JNZ NEAR 10BB8269017F:10BB81A3 XOR ECX,ECX017F:10BB81A5 MOV CX,[EAX+06]017F:10BB81A9 LEA EDI,[ECX-01]017F:10BB81AC CMP EDI,BYTE +0A017F:10BB81AF JA NEAR 10BB8262017F:10BB81B5 XOR EDX,EDX017F:10BB81B7 MOV DL,[EDI+10BB82B8]017F:10BB81BD JMP NEAR [EDX*4+10BB82A4]017F:10BB81C4 PUSH EAX017F:10BB81C5 PUSH ESI017F:10BB81C6 CALL `PBVM60!ot_get_valptr`017F:10BB81CB MOV ESI,EAX017F:10BB81CD TEST ESI,ESI017F:10BB81CF JZ NEAR 10BB8269按5下F12,然后按F10,会来到下面一段代码:........017F:10C8F62D CALL NEAR [EAX+10D48328]017F:10C8F633 MOV [EBP-04],EAX017F:10C8F636 MOV EAX,[ESI+34]017F:10C8F639 ADD ESP,BYTE +14017F:10C8F63C TEST EAX,EAX017F:10C8F63E JZ 10C8F647017F:10C8F640 MOV DWORD [EBP-04],00017F:10C8F647 MOV EAX,[ESI+14]017F:10C8F64A TEST EAX,EAX017F:10C8F64C JZ 10C8F5F1........再U 017F:10C8F5EE 会看到如下代码:017F:10C8F5EE MOV EDI,[EBP-18]017F:10C8F5F1 MOV EAX,[EBP+10]017F:10C8F5F4 MOV EDX,[ESI+10]017F:10C8F5F7 CMP EDX,[EAX+16]017F:10C8F5FA JNC 10C8F64E017F:10C8F5FC CMP DWORD [EBP-04],BYTE +01017F:10C8F600 JNZ 10C8F64E017F:10C8F602 MOV ECX,[EBP-20]017F:10C8F605 XOR EAX,EAX017F:10C8F607 ADD ECX,EDX017F:10C8F609 PUSH EDI017F:10C8F60A MOV AX,[ECX]017F:10C8F60D LEA EAX,[EAX+EAX*2]017F:10C8F610 SHL EAX,02017F:10C8F613 MOV EBX,[EAX+10D4832C]017F:10C8F619 LEA EDX,[EDX+EBX*2+02]017F:10C8F61D MOV [ESI+10],EDX017F:10C8F620 LEA EDX,[EBP+FFFFFF28]017F:10C8F626 PUSH EDX017F:10C8F627 MOV EDX,[EBP-14]017F:10C8F62A PUSH EDX017F:10C8F62B PUSH ECX017F:10C8F62C PUSH ESI017F:10C8F62D CALL NEAR [EAX+10D48328]看到了吗,这一句017F:10C8F62D CALL NEAR [EAX+10D48328]是重点。所有的伪码都要通过这一句进入执行。我们再来看看一般一句代码执行完后,再进入CALL NEAR [EAX+10D48328]几次,才执行下一句。我们就研究这一段:ll_l2 = integer(ls_t1) //看此处会触发什么ll_l2 -= ll_l1if ls_t1 <> 'fdfggfh' Then //研究PB的字符比较会调用什么。=========重点ll_l2 = ll_l2 * 2elsell_l3 = integer('24354')end ifif ll_l2 <> 3107 Then //研究PB如何进行数值比较,我们如何截取。==========重点ls_444 = 'goto error'elseMessageBox('error','dddd') //PB的messagebox调用那个APIend if首先是在l_l2 = integer(ls_t1) 调用integer时中断,5个F12,1个F10到CALL NEAR [EAX+10D48328]我们现在开始记录每一次进入CALL NEAR [EAX+10D48328]一直到if ll_l2 <> 3107 Then 这条比较语句。第一次进入:017F:10D01170 MOV EAX,[ESP+08] =========》 017F:10D01170017F:10D01174 XOR ECX,ECX 好像处理返回参数017F:10D01176 PUSH ESI017F:10D01177 PUSH EDI017F:10D01178 MOV CX,[EAX+02]017F:10D0117C MOV EAX,[ESP+14]017F:10D01180 TEST ECX,ECX017F:10D01182 JNG 10D0119A017F:10D01184 MOV EDX,FFFFFFE6017F:10D01189 MOV EDI,[EAX+010A]017F:10D0118F ADD EDI,EDX017F:10D01191 DEC ECX017F:10D01192 MOV [EAX+010A],EDI017F:10D01198 JNZ 10D01189017F:10D0119A MOV ESI,[ESP+18]017F:10D0119E MOV EDI,[EAX+010A]第二次进入:017F:10CFC0D0 MOV ECX,[ESP+08] ========》 017F:10CFC0D0017F:10CFC0D4 XOR EAX,EAX 好像处理返回参数017F:10CFC0D6 MOV AX,[ECX+02]017F:10CFC0DA LEA EDX,[EAX+EAX*2]017F:10CFC0DD LEA EAX,[EAX+EDX*4]017F:10CFC0E0 MOV EDX,[ESP+0C]017F:10CFC0E4 SHL EAX,1017F:10CFC0E6 MOV ECX,EAX017F:10CFC0E8 MOV EAX,[EDX+010A]017F:10CFC0EE SUB EAX,ECX017F:10CFC0F0 MOV DL,[EAX+04]017F:10CFC0F3 MOV WORD [EAX+06],02017F:10CFC0F9 MOVSX ECX,WORD [EAX]017F:10CFC0FC AND EDX,BYTE +01017F:10CFC0FF MOV [EAX],ECX第三次进入:017F:10D09C60 PUSH EBX ============》 017F:10D09C60 017F:10D09C61 PUSH ESI 好像处理返回参数017F:10D09C62 MOV ESI,[ESP+14]017F:10D09C66 MOV EBX,[ESP+10]017F:10D09C6A PUSH EDI017F:10D09C6B MOV EDX,[ESI+010A]017F:10D09C71 ADD EDX,BYTE -1A017F:10D09C74 MOV EAX,EDX017F:10D09C76 MOV [ESI+010A],EDX017F:10D09C7C CMP WORD [EBX+02],BYTE +00017F:10D09C81 LEA ECX,[EAX-1A]017F:10D09C84 MOV [ESI+010A],ECX017F:10D09C8A JNA 10D09CD6017F:10D09C8C MOV EDI,[ECX]017F:10D09C8E MOV CL,[EAX+04]第四次进入:017F:10CFB8C0 MOV ECX,[ESP+08] ==============> 017F:10CFB8C0017F:10CFB8C4 PUSH ESI017F:10CFB8C5 MOV ESI,[ESP+10] 好像处理返回参数017F:10CFB8C9 PUSH EDI017F:10CFB8CA MOV EAX,[ESI+C2]017F:10CFB8D0 MOV [ESP+14],EAX017F:10CFB8D4 XOR EAX,EAX017F:10CFB8D6 MOV AX,[ECX+02]017F:10CFB8DA MOV ECX,[ESI+52]017F:10CFB8DD CMP ECX,BYTE +03017F:10CFB8E0 JNZ 10CFB918017F:10CFB8E2 LEA EDX,[ESP+14]017F:10CFB8E6 PUSH EAX017F:10CFB8E7 PUSH EDX017F:10CFB8E8 PUSH ESI017F:10CFB8E9 CALL 10C329B0017F:10CFB8EE ADD ESP,BYTE +0C第五次进入:017F:10CF9670 MOV ECX,[ESP+08] ==================> 017F:10CF9670017F:10CF9674 PUSH ESI 好像准备下一条语句执行017F:10CF9675 MOV ESI,[ESP+10] 017F:10CF9679 PUSH EDI017F:10CF967A MOV EAX,[ESI+C2]017F:10CF9680 MOV [ESP+14],EAX017F:10CF9684 MOV AX,[ECX+02]017F:10CF9688 CMP DWORD [ESI+52],BYTE +03017F:10CF968C JNZ 10CF96C2017F:10CF968E LEA EDX,[ESP+14]017F:10CF9692 PUSH EAX017F:10CF9693 PUSH EDX017F:10CF9694 PUSH ESI017F:10CF9695 CALL 10C329B0017F:10CF969A ADD ESP,BYTE +0C017F:10CF969D TEST EAX,EAX017F:10CF969F JNZ 10CF96A4第六次进入:017F:10D0B130 PUSH EBX ==================> 017F:10D0B130017F:10D0B131 PUSH EBP 执行了语句ll_l2 -= ll_l1017F:10D0B132 PUSH ESI017F:10D0B133 MOV ESI,[ESP+18]017F:10D0B137 MOV EAX,[ESP+14]017F:10D0B13B PUSH EDI017F:10D0B13C MOV EBX,[ESI+010A]017F:10D0B142 ADD EBX,BYTE -1A017F:10D0B145 MOV [ESI+010A],EBX017F:10D0B14B MOV DL,[EBX+04]017F:10D0B14E AND EDX,BYTE +01017F:10D0B151 CMP WORD [EAX+02],BYTE +00017F:10D0B156 LEA EAX,[EBX-1A]017F:10D0B159 MOV [ESP+1C],EDX017F:10D0B15D MOV [ESI+010A],EAX第七次进入:017F:10CF9670 MOV ECX,[ESP+08] ==============> 017F:10CF9670017F:10CF9674 PUSH ESI017F:10CF9675 MOV ESI,[ESP+10] 好像准备下一条语句执行017F:10CF9679 PUSH EDI017F:10CF967A MOV EAX,[ESI+C2]017F:10CF9680 MOV [ESP+14],EAX017F:10CF9684 MOV AX,[ECX+02]017F:10CF9688 CMP DWORD [ESI+52],BYTE +03017F:10CF968C JNZ 10CF96C2017F:10CF968E LEA EDX,[ESP+14]017F:10CF9692 PUSH EAX017F:10CF9693 PUSH EDX017F:10CF9694 PUSH ESI017F:10CF9695 CALL 10C329B0017F:10CF969A ADD ESP,BYTE +0C017F:10CF969D TEST EAX,EAX017F:10CF969F JNZ 10CF96A4第八次进入:017F:10CFB7C0 MOV EAX,[ESP+08] ===================> 017F:10CFB7C0 017F:10CFB7C4 XOR ECX,ECX017F:10CFB7C6 XOR EDX,EDX 好像现设置要比较的字符串017F:10CFB7C8 PUSH ESI 先取出来017F:10CFB7C9 MOV CX,[EAX+04]017F:10CFB7CD MOV DX,[EAX+02]017F:10CFB7D1 MOV ESI,[ESP+10]017F:10CFB7D5 SHL ECX,10017F:10CFB7D8 MOV EAX,[ESI+C2]017F:10CFB7DE OR ECX,EDX017F:10CFB7E0 PUSH ECX017F:10CFB7E1 PUSH EAX017F:10CFB7E2 PUSH ESI017F:10CFB7E3 CALL `PBVM60!ob_get_const`017F:10CFB7E8 MOV ECX,[ESI+010A]017F:10CFB7EE MOV [ECX],EAX第九次进入:017F:10D05EB0 PUSH EBX ======》 此段代码进行字符串比较,调用lstrcmpA017F:10D05EB1 PUSH EBP if ls_t1 <> 'fdfggfh' Then 017F:10D05EB2 PUSH ESI 此处代码未全部拷贝。017F:10D05EB3 MOV ESI,[ESP+18]017F:10D05EB7 PUSH EDI017F:10D05EB8 MOV EAX,[ESI+010A]017F:10D05EBE LEA EBX,[EAX-1A]017F:10D05EC1 LEA EBP,[EBX-1A]017F:10D05EC4 MOV [ESI+010A],EBP017F:10D05ECA TEST BYTE [EBP+04],01017F:10D05ECE JNZ 10D05EDE017F:10D05ED0 TEST BYTE [EBX+04],01017F:10D05ED4 JNZ 10D05EDE017F:10D05ED6 XOR EAX,EAX017F:10D05ED8 MOV [ESP+1C],EAX017F:10D05EDC JMP SHORT 10D05EEA017F:10D05EDE MOV DWORD [ESP+1C],01第十次进入:017F:10D0A560 MOV EAX,[ESP+0C] =========================> 017F:10D0A560017F:10D0A564 MOV EDX,[EAX+010A] 好像处理if then017F:10D0A56A ADD EDX,BYTE -1A017F:10D0A56D MOV [EAX+010A],EDX017F:10D0A573 MOV EAX,EDX017F:10D0A575 TEST BYTE [EAX+04],01017F:10D0A579 JNZ 10D0A581017F:10D0A57B CMP WORD [EAX],BYTE +00017F:10D0A57F JNZ 10D0A592017F:10D0A581 MOV ECX,[ESP+08]017F:10D0A585 MOV EDX,[ESP+04]017F:10D0A589 XOR EAX,EAX017F:10D0A58B MOV AX,[ECX+02]017F:10D0A58F MOV [EDX+10],EAX第十一次进入:017F:10CFB8C0 MOV ECX,[ESP+08] =================> 017F:10CFB8C0 017F:10CFB8C4 PUSH ESI017F:10CFB8C5 MOV ESI,[ESP+10] 好像处理if then017F:10CFB8C9 PUSH EDI017F:10CFB8CA MOV EAX,[ESI+C2]017F:10CFB8D0 MOV [ESP+14],EAX017F:10CFB8D4 XOR EAX,EAX017F:10CFB8D6 MOV AX,[ECX+02]017F:10CFB8DA MOV ECX,[ESI+52]017F:10CFB8DD CMP ECX,BYTE +03017F:10CFB8E0 JNZ 10CFB918017F:10CFB8E2 LEA EDX,[ESP+14]017F:10CFB8E6 PUSH EAX017F:10CFB8E7 PUSH EDX017F:10CFB8E8 PUSH ESI017F:10CFB8E9 CALL 10C329B0017F:10CFB8EE ADD ESP,BYTE +0C第十二次进入:017F:10CF9670 MOV ECX,[ESP+08] ========================> 017F:10CF9670017F:10CF9674 PUSH ESI017F:10CF9675 MOV ESI,[ESP+10] 好像准备下一条语句执行017F:10CF9679 PUSH EDI017F:10CF967A MOV EAX,[ESI+C2]017F:10CF9680 MOV [ESP+14],EAX017F:10CF9684 MOV AX,[ECX+02]017F:10CF9688 CMP DWORD [ESI+52],BYTE +03017F:10CF968C JNZ 10CF96C2017F:10CF968E LEA EDX,[ESP+14]017F:10CF9692 PUSH EAX017F:10CF9693 PUSH EDX017F:10CF9694 PUSH ESI017F:10CF9695 CALL 10C329B0017F:10CF969A ADD ESP,BYTE +0C017F:10CF969D TEST EAX,EAX017F:10CF969F JNZ 10CF96A4第十三次进入:017F:10CFB510 MOV ECX,[ESP+08] =========================> 017F:10CFB510 017F:10CFB514 MOV EAX,[ESP+0C] 这段代码好像设置乘数 2017F:10CFB518 PUSH ESI017F:10CFB519 XOR ESI,ESI017F:10CFB51B MOV SI,[ECX+04]017F:10CFB51F XOR EDX,EDX017F:10CFB521 MOV DX,[ECX+02]017F:10CFB525 MOV ECX,[EAX+010A]017F:10CFB52B SHL ESI,10017F:10CFB52E OR EDX,ESI017F:10CFB530 POP ESI017F:10CFB531 MOV [ECX],EDX017F:10CFB533 MOV EDX,[EAX+010A]017F:10CFB539 MOV WORD [EDX+04],1D00017F:10CFB53F MOV ECX,[EAX+010A]第十四次进入:017F:10D08AF0 MOV EDX,[ESP+0C] ===================> 017F:10D08AF0017F:10D08AF4 PUSH EBX017F:10D08AF5 PUSH ESI017F:10D08AF6 MOV ESI,[EDX+010A]017F:10D08AFC LEA ECX,[ESI-34]017F:10D08AFF MOV [EDX+010A],ECX017F:10D08B05 MOV EAX,[ESI-1A]017F:10D08B08 IMUL EAX,[ECX] =====> 这里执行 ll_l2 * 2 EAX=2017F:10D08B0B MOV [ECX],EAX017F:10D08B0D MOV BL,[ECX+04]017F:10D08B10 MOV EAX,01017F:10D08B15 TEST AL,BL017F:10D08B17 JNZ 10D08B22017F:10D08B19 TEST [ESI-16],AL017F:10D08B1C JNZ 10D08B22017F:10D08B1E XOR ECX,ECX第十五次进入:017F:10D09C60 PUSH EBX ======================> 017F:10D09C60017F:10D09C61 PUSH ESI017F:10D09C62 MOV ESI,[ESP+14] 处理if then017F:10D09C66 MOV EBX,[ESP+10]017F:10D09C6A PUSH EDI017F:10D09C6B MOV EDX,[ESI+010A]017F:10D09C71 ADD EDX,BYTE -1A017F:10D09C74 MOV EAX,EDX017F:10D09C76 MOV [ESI+010A],EDX017F:10D09C7C CMP WORD [EBX+02],BYTE +00017F:10D09C81 LEA ECX,[EAX-1A]017F:10D09C84 MOV [ESI+010A],ECX017F:10D09C8A JNA 10D09CD6017F:10D09C8C MOV EDI,[ECX]017F:10D09C8E MOV CL,[EAX+04]第十六次进入:017F:10D0A540 MOV ECX,[ESP+08] =======================> 017F:10D0A540017F:10D0A544 MOV EDX,[ESP+04] 处理if then017F:10D0A548 XOR EAX,EAX017F:10D0A54A MOV AX,[ECX+02]017F:10D0A54E MOV [EDX+10],EAX017F:10D0A551 MOV EAX,01017F:10D0A556 RET 017F:10D0A557 NOP 017F:10D0A558 NOP 017F:10D0A559 NOP 017F:10D0A55A NOP 017F:10D0A55B NOP 017F:10D0A55C NOP 017F:10D0A55D NOP 017F:10D0A55E NOP 017F:10D0A55F NOP 017F:10D0A560 MOV EAX,[ESP+0C]017F:10D0A564 MOV EDX,[EAX+010A]017F:10D0A56A ADD EDX,BYTE -1A017F:10D0A56D MOV [EAX+010A],EDX第十七次进入:017F:10CF9670 MOV ECX,[ESP+08] =====================> 017F:10CF9670017F:10CF9674 PUSH ESI017F:10CF9675 MOV ESI,[ESP+10] 好像准备下一条语句执行017F:10CF9679 PUSH EDI017F:10CF967A MOV EAX,[ESI+C2] 017F:10CF9680 MOV [ESP+14],EAX017F:10CF9684 MOV AX,[ECX+02]017F:10CF9688 CMP DWORD [ESI+52],BYTE +03017F:10CF968C JNZ 10CF96C2017F:10CF968E LEA EDX,[ESP+14]017F:10CF9692 PUSH EAX017F:10CF9693 PUSH EDX017F:10CF9694 PUSH ESI017F:10CF9695 CALL 10C329B0017F:10CF969A ADD ESP,BYTE +0C017F:10CF969D TEST EAX,EAX017F:10CF969F JNZ 10CF96A4第十八次进入:017F:10CFB510 MOV ECX,[ESP+08] ========================> 017F:10CFB510017F:10CFB514 MOV EAX,[ESP+0C]017F:10CFB518 PUSH ESI017F:10CFB519 XOR ESI,ESI 好像设置要比较的一个数值3107017F:10CFB51B MOV SI,[ECX+04]017F:10CFB51F XOR EDX,EDX017F:10CFB521 MOV DX,[ECX+02]017F:10CFB525 MOV ECX,[EAX+010A]017F:10CFB52B SHL ESI,10017F:10CFB52E OR EDX,ESI017F:10CFB530 POP ESI017F:10CFB531 MOV [ECX],EDX017F:10CFB533 MOV EDX,[EAX+010A]017F:10CFB539 MOV WORD [EDX+04],1D00017F:10CFB53F MOV ECX,[EAX+010A]第十九次进入:017F:10D05C40 MOV EDX,[ESP+0C] =====================> 017F:10D05C40017F:10D05C44 PUSH EBX 进行 if ll_l2 <> 3107 Then017F:10D05C45 PUSH ESI017F:10D05C46 PUSH EDI017F:10D05C47 MOV ESI,[EDX+010A]017F:10D05C4D XOR EBX,EBX017F:10D05C4F LEA ECX,[ESI-34]017F:10D05C52 MOV [EDX+010A],ECX017F:10D05C58 MOV EDI,[ESI-1A]017F:10D05C5B MOV EAX,[ECX]017F:10D05C5D CMP EAX,EDI =======》EDI处存放了3107017F:10D05C5F MOV EAX,01 EAX是ll_l2的值。017F:10D05C64 SETNZ BL017F:10D05C67 MOV [ECX],BX017F:10D05C6A MOV BL,[ECX+04]017F:10D05C6D TEST AL,BL017F:10D05C6F JNZ 10D05C7AOK,现在我们总结一下:XXXX:10C8F62D CALL NEAR [EAX+10D48328]该处是PBVM60解释入口处,可以直接在次设定断点。此处地址10C8F62D 是不变的。一般算法代码:(除法还进一步研究)减法:017F:10D0B1F6 MOV ECX,[EAX]017F:10D0B1F8 MOV AX,[ECX+04]017F:10D0B1FC MOV ESI,EAX017F:10D0B1FE AND EAX,FFFE017F:10D0B203 AND ESI,BYTE +01017F:10D0B206 OR EDX,ESI017F:10D0B208 OR EAX,EDX017F:10D0B20A MOV [ECX+04],AX017F:10D0B20E MOV EDX,[EBX]017F:10D0B210 SUB [ECX],EDX ===========》 EDX 处存放减数017F:10D0B212 POP EDI017F:10D0B213 POP ESI017F:10D0B214 POP EBP017F:10D0B215 MOV EAX,01017F:10D0B21A POP EBX017F:10D0B21B RET 加法:017F:10D08310 MOV EDX,[ESP+0C]017F:10D08314 PUSH EBX017F:10D08315 PUSH ESI017F:10D08316 MOV ESI,[EDX+010A]017F:10D0831C LEA ECX,[ESI-34]017F:10D0831F MOV [EDX+010A],ECX017F:10D08325 MOV EAX,[ESI-1A]017F:10D08328 ADD EAX,[ECX] ==========》 EAX 为加数017F:10D0832A MOV [ECX],EAX017F:10D0832C MOV BL,[ECX+04]017F:10D0832F MOV EAX,01017F:10D08334 TEST AL,BL017F:10D08336 JNZ 10D08341017F:10D08338 TEST [ESI-16],AL017F:10D0833B JNZ 10D08341017F:10D0833D XOR ECX,ECX017F:10D0833F JMP SHORT 10D08343017F:10D08341 MOV ECX,EAX017F:10D08343 MOV ESI,[EDX+010A]017F:10D08349 OR CH,1D017F:10D0834C MOV [ESI+04],CX017F:10D08350 MOV ECX,[EDX+010A]017F:10D08356 POP ESI017F:10D08357 POP EBX017F:10D08358 MOV WORD [ECX+06],02017F:10D0835E MOV ECX,[EDX+010A]乘法:017F:10D08AF0 MOV EDX,[ESP+0C]017F:10D08AF4 PUSH EBX017F:10D08AF5 PUSH ESI017F:10D08AF6 MOV ESI,[EDX+010A]017F:10D08AFC LEA ECX,[ESI-34]017F:10D08AFF MOV [EDX+010A],ECX017F:10D08B05 MOV EAX,[ESI-1A]017F:10D08B08 IMUL EAX,[ECX] =========》 EAX 乘数017F:10D08B0B MOV [ECX],EAX017F:10D08B0D MOV BL,[ECX+04]017F:10D08B10 MOV EAX,01017F:10D08B15 TEST AL,BL017F:10D08B17 JNZ 10D08B22017F:10D08B19 TEST [ESI-16],AL017F:10D08B1C JNZ 10D08B22017F:10D08B1E XOR ECX,ECX017F:10D08B20 JMP SHORT 10D08B24017F:10D08B22 MOV ECX,EAX017F:10D08B24 MOV ESI,[EDX+010A]017F:10D08B2A OR CH,1D017F:10D08B2D MOV [ESI+04],CX017F:10D08B31 MOV ECX,[EDX+010A]017F:10D08B37 POP ESI017F:10D08B38 POP EBX017F:10D08B39 MOV WORD [ECX+06],02017F:10D08B3F MOV ECX,[EDX+010A]字符串比较:017F:10D05EEE PUSH EBP017F:10D05EEF PUSH ESI017F:10D05EF0 CALL `PBVM60!ot_get_valptr`017F:10D05EF5 PUSH EBX017F:10D05EF6 PUSH ESI017F:10D05EF7 MOV EDI,EAX017F:10D05EF9 CALL `PBVM60!ot_get_valptr`017F:10D05EFE PUSH EAX017F:10D05EFF PUSH EDI017F:10D05F00 CALL `KERNEL32!lstrcmpA` =========》EAX 和 EDI 存放的017F:10D05F06 MOV EDI,EAX 字符串比较017F:10D05F08 MOV EAX,[ESP+1C]017F:10D05F0C NEG EDI017F:10D05F0E SBB EDI,EDI017F:10D05F10 NEG EDI ========》 OK则EDI 为 0,否则 1017F:10D05F12 JMP SHORT 10D05F18017F:10D05F14 MOV EDI,[ESP+18]017F:10D05F18 MOV ECX,[ESP+18]017F:10D05F1C CMP WORD [ECX+02],BYTE +00017F:10D05F21 JZ 10D05F2E017F:10D05F23 PUSH EBX017F:10D05F24 PUSH ESI017F:10D05F25 CALL `PBVM60!ot_free_val_ptr`017F:10D05F2A MOV EAX,[ESP+1C]017F:10D05F2E MOV EDX,[ESP+18]017F:10D05F32 CMP WORD [EDX+04],BYTE +00017F:10D05F37 JZ 10D05F44017F:10D05F39 PUSH EBP017F:10D05F3A PUSH ESI017F:10D05F3B CALL `PBVM60!ot_free_val_ptr`数值比较:017F:10D05C58 MOV EDI,[ESI-1A]017F:10D05C5B MOV EAX,[ECX]017F:10D05C5D CMP EAX,EDI =========》 执行比较,EDI 比较数017F:10D05C5F MOV EAX,01017F:10D05C64 SETNZ BL017F:10D05C67 MOV [ECX],BX017F:10D05C6A MOV BL,[ECX+04]017F:10D05C6D TEST AL,BL017F:10D05C6F JNZ 10D05C7A017F:10D05C71 TEST [ESI-16],AL017F:10D05C74 JNZ 10D05C7A017F:10D05C76 XOR ECX,ECX017F:10D05C78 JMP SHORT 10D05C7C017F:10D05C7A MOV ECX,EAX017F:10D05C7C MOV ESI,[EDX+010A]017F:10D05C82 OR CH,05017F:10D05C85 POP EDI017F:10D05C86 MOV [ESI+04],CX017F:10D05C8A MOV ECX,[EDX+010A]017F:10D05C90 POP ESI017F:10D05C91 POP EBX017F:10D05C92 MOV WORD [ECX+06],07017F:10D05C98 MOV ECX,[EDX+010A]017F:10D05C9E ADD ECX,BYTE +1A017F:10D05CA1 MOV [EDX+010A],ECX017F:10D05CA7 RET PB7.0基本上与PB6.5相同,只不过入口不同而已,它的解释入口是:XXXX:1135BEEE CALL NEAR [EAX+11450E28],即入口地址是XXXX:1135BEEE 更多 上一篇:powerbuilder防止反编译: PBKILLER无法解析的部分公布 下一篇:保护软件源代码的“最安全”措施--源码与文档加密后随软件一起发行 查看评论 * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 核心技术类目 全部主题 Java VPN Android iOS ERP IE10 Eclipse CRM JavaScript Ubuntu NFC WAP jQuery 数据库 BI HTML5 Spring Apache Hadoop .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP Spark HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap 个人资料 chengg0769 访问:515726次 积分:8551分 排名:第420名 原创:267篇 转载:211篇 译文:0篇 评论:348条 文章搜索 文章分类 PB反编译与加密(12) IOS和安卓(9) PB与数据库(9) 网络相关(1) 搜索相关(0) 闲话扯起耍(1) 其他语言(4) 文章存档 2013年12月(2)2013年11月(2)2013年09月(1)2013年02月(1)2012年11月(1)2012年09月(1)2012年08月(6)2012年07月(1)2012年05月(3)2012年03月(4)2011年12月(2)2011年11月(2)2011年10月(9)2011年09月(6)2011年08月(11)2011年07月(2)2011年06月(4)2011年04月(3)2010年12月(1)2010年10月(2)2010年09月(8)2010年08月(1)2010年07月(8)2010年06月(17)2010年05月(2)2010年04月(2)2010年03月(4)2010年01月(1)2009年09月(8)2009年08月(5)2009年07月(8)2009年06月(8)2009年05月(16)2009年03月(2)2009年02月(7)2008年12月(2)2008年11月(4)2008年10月(5)2008年08月(1)2008年07月(2)2008年01月(12)2007年12月(29)2007年11月(7)2007年10月(4)2007年09月(20)2007年08月(55)2007年07月(176) 阅读排行 搜索引擎学习资源(作者:dongdonglang)(14656) 做代理网站最有效的4种宣传方法(admin9.com)(12007) 再谈powerbuilder程序防止破解的办法(终结篇,以后不再写这个问题)(8064) 程序员的SEO总结(7459) 浅谈Powerbuilder的未来和Powerbuilder使用者的未来(5999) 在一台联想3000G430 T1600笔记本上安装黑苹果(东皇v10.6.3)成功(5948) PowerBuilder DeCompiler(PB DeCompiler) Demo download(PB反编译,支持5-12)(5887) PB11.5,PB12 web项目初探(5635) 文件夹加密原理 [转](5627) powerbuilder反编译器开发-第一步:pbd结构分析和PBKILLER分析(5473) 评论排行 浅谈Powerbuilder的未来和Powerbuilder使用者的未来(49) 程序员的SEO总结(32) 有关Powerbuilder的悲观论和乐观论(由郭贴引发的300多贴争辩想到的,也是很久就想秉明的一个观点)(22) Powerbuilder混淆,加密(powerbuilder防止反编译,pb混淆器,PB加壳,支持5-12) obfuscator for PowerBuilder(20) 戏说DataWindow的“移植”和“临摹”(19) 因为垄断形成,数据库市场将出现更多开源数据库(19) 免费软件模式之随想(18) 软件提交到国外的下载站的几点操作和想法(15) PB11.5,PB12 web项目初探(15) 关于对pbd反编译器的期待(11) 推荐文章 最新评论 安装两个BCB6控件SynEdit、mwEdit 0.92a的过程总结 jiduxiaozhang12345: 请问BCB6的第三方控件在哪下载啊?急求 Powershield一个疑似的BUG zhj149: 高手啊,看你的文章,感觉你玩pb已经到了极致的境界了,我自认为pb还不错,和你比起来,还是差了太多了 软件提交到国外的下载站的几点操作和想法 u012353953: 楼主在吗?有个问题请教,看到请加我QQ,谢谢。17493589 Lucene(Nutch)距离商业文本搜索引擎还有多远?(转载) koubi1986: 你好!请教一些问题:请问一下1。你是如何把nutch抓取到的二进制内容,在项目中读取的。2。nutc... 看一个商业共享软件是如何在下载站刷下载量来作弊的! u011506701: 您的判断是有误的,像我研究的刷量算法你就根本看不出来,出现的曲线图跟正常的一模一样的,附:刷量是最好... 垂直搜索引擎蜘蛛的基本解决方案(编程实例:所以推荐) gis101989: 你好,我正在写面向主题搜索引擎结合地理信息的论文,很多地方不懂,能加个扣扣吗?非常感谢你的帮助,我的... 浅谈Powerbuilder的未来和Powerbuilder使用者的未来 hosthelp: PB的最大缺点就是:(其实很简单)过时了。 服装过时就没人穿了, 电器过时就没人买了, 明星过时(过... 三岁小孩开发搜索引擎,搜索引擎白热化[原创] rongzi1987: 顶一个。先顶再看 再谈powerbuilder程序防止破解的办法(终结篇,以后不再写这个问题) hua2000: 顶顶更健康正在研究反向工程 有个傻B说破解了我的软件—哈哈!黄金屋手机MP3.MP4.3GP.电影.下载系统 ljx811216: 真有这事,看看 我的未来方向 pconline/asp.net周金桥老师的aspnet 友人Blog 旧博客在sina Bluesen的语音卡开发平台 JackXu的开源语音卡框架 经验丰富的好友:杨光的专栏 蓝星际语音平台,Koodoo语言 Lucene改造者-yuetiantian 西部.阿呆's blog manesking:全文检索c/c fullfocus研究lucene,nutch 黄国酬的博客 把“天轰穿”的asp.net 雨松.安卓