 |
软件破解之“动态跟踪分析” |
|
|
| 软件破解之“动态跟踪分析” |
|
| 作者:未知 文章来源:赛迪网 点击数: 更新时间:2007-11-22 1:00:12 |
|
一、SOFTICE 配制 7Csv#a31 __W(/@ 虽然大部分 VB 程序仍调用 Win32 API 函数,但如想在 VB dll 运行库中设断的话,你就必须把 VB dll 运行库加入 SOFTICE 配制里去。 b-qd"} |O 1UC[HB%k 下例是在 win95/98 下你把相关的 VB DLL 运行库加入 winice.dat 配制文件里。 ( 部分 ) [['VF:L -@Y)*;M4 34{r0`wzD ; 注意分号后是描述语言,不被执行。每次只装载需要的一种 VB dll ,最好不要同时装载两个以上,把要装载那种 VB dll 那一行的分号去掉,重新启动即可。另外,判断软件是何种 VB dll 有几种方法,最直接一种用 WDasm89 查看,还有一种方法是用十六进制工具打开程序观察。或用 SOFTICE 跟进去(用 bpx hmemcpy) ,稍转一圈,你观察一下调试窗口领空处会出现何种 VB DLL 即可。 J.`C/Zha U&"qDb ; EXP=c:\windows\system\msvbvm60.dll ; Visual Basic 6 oIqm] ht ; EXP=c:\windows\system\msvbvm50.dll ; Visual Basic 5 @C:$X ; EXP=c:\windows\system\vb40032.dll ; Visual Basic 4(32-bit) Swr>1 ; EXP=c:\windows\system\vb40016.dll ;Visual Basic 4(16-bit) 较少见 ~3N""fc ; EXP=c:\windows\system\vbrun300.dll ; Visual Basic 3 0$8,/W= )F{)-vJ )Vwx1{Vj?9 B!w3{eyc.5 这样配制好后,重新启动,就可设 VB 运行库中各函数的断点了。 dn/,#; }H!,e><n -------------------------------------------------------------------------------- xM'.: U ouby]^ 二、VB dll 常用函数 /5d"$Az N4P|%SB 1 、字符处理函数 Dsbsux &O>V.R^GEj MultiByteToWideChar, rtcR8ValFromBstr, WideCharToMultiByte, __vbaStrCmp, __vbaStrComp, __vbaStrCopy, __vbaStrMove, __vbaVarTstNe . r.r|C %V< 注意:这些函数前的下划线 __ 是由两根短线 _ 组成的,不要弄错。 如果你是 crack VB6 程序,你应在断点前增加 msvbvm60! 。 如: bpx msvbvm60!__vbastrcomp bxt*sT]V =;V{Y!m qUWuGv 一些常用字符串函数: e 7rZ @37(eoS3~ Val() 转换字符串为数字 Rtrim$() 去除字符串左边空格 Pe*;< ^ Str$() 转换数字为字符串 Trim$() 去除字符串两边空格 ^N.|S ?kq Left$() 按要求从左取字符。例如: Left$(Theodolite, 4) = "Theo" Asc() 转换字符为 ANSI 编码 . 例如: Asc("A") = 65 注:65是ASCII码的十进制 6rj zS Ltrim$() 去除字符串左边空格例如: Ltrim$Content$nbsp;(" Hello ") = "Hello " Chr$() 转换 ANSI 编码为字符 . 例如 Chr$(65) = "A" S);Gx Right$() 按要求从右取字符 ? T}F{t *oE.~lI 几个常用函数简介: *bT"=V7& oMZ25y I 1、 __vbavartstne tv& S]*G0!U9 如是在VB5中CALL MSVBVM50!___vbavartstne D(4q(0tp -(z@@^x 进去后在0F04E351你将看到: cI])0Duz push dword ptr [ebp+0c] ;Push address *真* serial 的地址 2+wfA) push dword ptr [ebp+10] ;Push address 你输入的serial地址 ! }~6](n 3%d%;< 下命令:d ebp+0c (|gKR6Os 你将在数据窗口看到 4字节地址倒序排列,你再次D 地址(己纠正顺序的), 就可看到序列号了。 }%$V,fL \S< =K1G T{] >3"MU 2、 __vbaR8Str [Y7C_9rZ 5D? gFpFP 在 VB5中是如下情况: ipR1Ys^ Push ebp-20 ?o|leaI Call MSVBUM50.__vbaR8Str ;转换 string 到 Integer/Real t;Q):(Xqy fcomp qword ptr [00401028] ;数据比较 H"P%wt0Xt uQX #<A 在这行fcomp qword ptr [00401028] Type: DL 00401028 将看到*real* serial #. ,alk.:S&83 _Y*hbg'/T DL 是显示 Long/real 型,SOFTICE默认时是DB状态。 Xaqa3- {;gq5{M,=$ IPUDq! gm 3、 __vbastrcmp IO,S.j*OT 9ZAH_S8 例: Kq: rIz, } }0Q^D' 3GDh)ZO= :005BDC32 CALL [MSVBVM50!__VbaFreeVar] Ul2Wj!dA :005BDC38 MOV ESI,[EBP+08] >G\YD'&xJ :005BDC3B PUSH ESI lo}G1QF :005BDC3E CALL [ECX+00000790] <-- 值返回到 EDX. -8 6+)2/ :005BDC44 MOV EDX,[ESI+4C] <-- 输入的号码,但倒转 *0]z 7N" :005BDC47 MOV EAX,[005E0078] <-- 正确号码 %O#KU$ :005BDC4C PUSH EDX _5=N<>W :005BDC4D PUSH EAX <-- Push参数给 __vbaStrCmp. ro D9p8cR :005BDC4E CALL [MSVBVM50!__vbaStrCmp] <-- Visual Basic 字符串比较 |]s Gd[ :005BDC54 TEST EAX,EAX <-- 测试比较结果 q!~EsNF&+ :005BDC56 JNZ 005BDC64 <-- 不相等跳走 oZdl?D# JXLIM)} &VauyfG= 2 、警告窗口函数 }[v^gF C yq-J4tSG 1uL" J rtcBeep, rtcGetPresentDate (time API), rtcMsgBox mL3jN P-,x-j -------------------------------------------------------------------------------- x ~BKukD Rp&To=Yy6D 三、VB字串格式 M]Gna |=Z`TEH[L 在大部分 VB 程序中,我们能用 bpx Hmemcpy 命令设断,但是你将发现自己不久进入 VBRUNxxx.DLL 运行库,很快陷入 Vb dll 中,在大多数情况下,你很难到达其 EXE 文件中的真正比较核心。你通常是依靠字符串的线索来跟踪程序,你们还应记得 VB ( VB4 以上) 程序储存和比较字符是用 wide character 格式(本质是中在各字符间填 0x00)。 %G(V>o:g The MultiByteToWideChar( ) function maps a character string to a wide-character (Unicode) string. The character string mapped by this function is not necessarily from a multibyte character set. &4LA_-r b'ZxPJzYEI int MultiByteToWideChar( prn%j0P UINT CodePage, // code page thgF3\VN>A DWORD dwFlags, // character-type options |[w}G,X LPCSTR lpMultiByteStr, // string to map K[u|A int cbMultiByte, // number of bytes in string Y?]fM&k#x- LPWSTR lpWideCharStr, // wide-character buffer W#KU\" *l} int cchWideChar // size of buffer P.=~V7" ); | I@_@25p m@.@==O5 如: !%Iza+K> 0!vO(^C 'GipZ,<Z 原来字符串 : CRACKZ (43h 52h 41h 43h 4Bh 5Ah). :6IBW1 f 9B_ ^! Wide 字符串格式 : C R A C K Z (43h 00h 52h 00h 41h 00h 43h 00h 4Bh 00h 5Ah). ?=b * :T KB:|66f ]KIcv?O} 这时在 SOFTICE 下查看内存中的字符串时看到情况有可能是: C R A C K Z sMexM51 g_KEP$6 有些情况下应该用 DL (长实型)命令,才能看到正确数字序号。( SOFTICE 默认时为 DB (字节型)) mI'Jg01 Vc:UUU 在多数情况下,在 VB 中设置正确断点是较困难的。断点设置好后,尝试输入序列号,运行后,应返回 VBRUNxxx.DLL 里,现在查找寄存器 (EAX & EBX) 中的值,那里放有你输入字符串长度,如果没发现什么,你应按 ctrl+D 再次返回到 VB dll 中另一处 ,继续查看,一直重复。 5R~V* 2jK7n7cJH 一但当你在寄存器中发现字符串长度时,你应一步一步注意观察,如果你幸运的话,你会发现输入字符串躺在寄存器或其显示附近内存里。这时你在 SOFTICE 里的数据窗口中用 ALT+ 光标键滚动查找,说不定会发现正确序列号懒洋洋躺在那附近。 .GKF+GNc a;6&jIR5u -------------------------------------------------------------------------------- FPL{2V KeJ9G8x 四、oleaut32.dll简介 (作者:dr0) M22b;=% # O=eR_U;: 破解VB程序时,对vbrun*.dll(VB4、VB3版本)和msvbvm*.dll(VB5、VB6)强调得比较多,实际上VB程序的很多运算是在oleaut32.dll中完成的,这个dll提供了很多对VB中的Variant类型的变量进行操作的函数,主要是一系列VarXXX( ),其中有几个是用来比较字符串和数值的,如下: wz, o"SH X{Mz< P= Addr:77A11AAE Ord: 176 (00B0h) Name: VarCmp o+eIeLRa Addr:77A0E5D1 Ord: 311 (0137h) Name: VarCyCmp (Ya&gy WH Addr:77A0E5F8 Ord: 312 (0138h) Name: VarCyCmpR8 ]Z9N}5J}U Addr:77A129CD Ord: 314 (013Ah) Name: VarBstrCmp 1@lF|]eH Addr:77A12958 Ord: 316 (013Ch) Name: VarR4CmpR8 < s :Yp Addr:77A13697 Ord: 204 (00CCh) Name: VarDecCmp pxuxbcr Addr:77A1298B Ord: 298 (012Ah) Name: VarDecCmpR8 7mLbxO! j)T }WE# 这里有个小程序RAMQuota(www.stepnet.com.au),是用VB6写的,它使用上述函数中的VarBstrCmp( )比较注册码。该函数的关键指令如下: r7m"k3dO Q0 'j5;> :77A12A03 8B7D0C mov edi, dword ptr [ebp+0C] )h B }j%i :77A12A06 8B7508 mov esi, dword ptr [ebp+08] oq5[N` :77A12A09 8B4D10 mov ecx, dword ptr [ebp+10] <h$ n _^; :77A12A0C 33C0 xor eax, eax MwO<G/4>& :77A12A0E F3 repz *Ye8e[4Kt :77A12A0F 66A7 cmpsw Pr )6XN@ :77A12A11 7405 je 77A12A18 ,bT9oUji :77A12A13 1BC0 sbb eax, eax X3h"J^pd :77A12A15 83D8FF sbb eax, FFFFFFFF >3h ~iXYi :77A12A18 85C0 test eax, eax BL)}gvmop :77A12A1A 7F45 jg 77A12A61 xY`Z c|v`k :77A12A1C 7D16 jge 77A12A34 yvYkc+i0\ :77A12A1E 33C0 xor eax, eax fq|:/ S{H#n*4,r 看来有必要仔细看一下oleaut32.dll j+u.2Y- Il1_&%`N4u UNulnga8S 0F n`kBpM 五、Visual Basic 程序比较方法 4x~Ef67jr 3`5lyw+ 在 Visual Basic 里有 8 种以上的方法检测正确的序列号 / 密码。我这里将谈谈这 8 种方法,它们都是较容易并用得较多。首先是最普通的 3 种: |K/iuP %J6`%" 1) 串(string) 比较 m `9CIC 6|@zO&D\ 在这比较方法里,正确密码串如: "Correct Password" 和你输入的密码串如: "Entered Password" 比较。 _/2DbG e`WC7!\' 串是由相邻的字符按顺序排列组成,一个串包括字母、数字、空格和标点符号。一个固定长度的串可储存 0 到 63K 字符。如是动态的串其储存字符个数可达 20 亿字符。 VtmaiK =` tR+`k{X VB 串比较代码一般格式: ~LGETNBf h8{6Cd ++ f+["6+p: If "Correct Password" = "Entered Password" then <-- 直接比较两个串字符 `~.3>!7z' 0&:SU sTx GoTo Correct Message dB&a}-8v :2'HFLiq Else z6nXPP irMm!m4 GoTo Wrong Message *H <mi1=r N]E( t) End if {>Cum}cMV9 \,|THD) &%ti?# 5o_ 这是一种简单保护方案,如果程序者用这种函数保护,用 SOFTICE 很容易拦截。 `/cB2tRA3 (F]# z1/ VOR,;W8@ 可用到的断点: 4z7 [)! } @HZ5 i) __vbastrcomp or __vbastrcmp (下划线是两短线 _ 组成) <-- 串比较函数 x/pJozJ, RzqO2VS! 6KR zzf 注意:如果你是 crack VB6 程序,你应在两断点前增加 msvbvm60! 。 9/P(Ucf* kSzq/ 如: bpx msvbvm60!__vbastrcomp or bpx msvbvm60!__vbastrcmp 9$2Z"J o1 h0| P) wT k( R#n ii) 搜索特殊比较代码(具体参考下一节) nz&on"_ ~ip(D8y 如: 56,57,8b,7c,24,10,8b,74,24,0c,8b,4c,24,14,33,c0,f3,66,a7 5 QHR hnPvaS 'IQ N /ir\@; 2) 变量(Variant)比较 +LwRJu*=9 4I03iX.4X 在这方法中,两个变量(变量数据类型)互相比较。变量数据类型是一种特殊数据类型,包括数字、字符串或日期数据及一些用户定义的类型。这种类型储存数字长度是 16 字节或字符 22 字节(加上串长度)。 puW(=k En1E{Ed 84EK?v~EAW 一个范例代码: yiKx% +}% yhVJ 58N .sw8 Dim correct As Variant, entered As Variant <-- 定义 "correct" and "entered" 作为变量 (Is eE=F ?-pm3:4Rw correct = Correct Password <-- 设置 "correct" 放置 "Correct Password" Gce!g8T Q){jof*f14 entered = Text1.Text <-- 设置 "entered" 作为你输入密码 6L3ewynJlU {S}|axa$ If correct = entered Then <-- 用变量方法比较 lXRG|;8R Nfn q;K GoTo Correct Message GGhO" sH }n-$?|6 Else 6 cS]f Q)"@HHJ GoTo Wrong Message If]|Yyk &4H MdR7 End If LrO3oOS3 O|P(cucNS kbZ;CC.?X 在这方法里, 1 中的两个断点将不起作用,因为程序不再用 N BPIVNS X&A<>WSX __vbastrcomp 等 ... 4>v8%@Tf\ > Jr SY6|~ V?YQnh5o 有用断点 : ~Ys ~Y V x(r#eSd i) __vbavartsteq <-- 测试变量是否相等 %DL"C8[ e Ug W v&0 FN -aX] 注意:如果你是 crack VB6 程序,你应在两断点前增加 msvbvm60! 。 =/4q- Lfn;/*t9rY 例: bpx msvbvm60!__vbavartsteq UbV~,;]9 A@|6N:~f 3) 长整型( long) 比较 EjAO(.> }^5,J|1l 这也是一个普通的方法。两个变量(长整型)互相比较。 0fdpw/L;h Fg 5ZJyu+ long 型数据类型是 4 字节( 32 位)整数,其范围 -2,147,483,648 到 2,147,483,647 。因此该种方法存在只能比较数字的局限性。 t4{;/x4S 6y& QgS[ 一个此类型范例: [*O!Ffu ` -)7@a[%# E_nzf}XZJ Dim correct As Long, entered As Long <-- 定义 "correct" 和 "entered" 作为长整型 !0I^&,BTdl O'!|AHmm correct = 12345 <-- 设置 "correct" 为正确密码 2Fys2ty{j FaQ^^W entered = Text1.Text <-- 设置 "entered" 为输入密码 "njs6~^G 3+wU~X"_ If entered = correct Then <-- 用长整型方法比较 `6Mz'M.M 5l}H>@ GoTo Correct Message 5YS3 @T|X; <5(fXH>S{ Else DI#jfH :gDH/ GoTo Wrong Message D&"{QEnI ^d1\_9 End If e<6^|C3;A< HV'jQpew lF.T-8' 对这种类型没有专门的断点函数,因为其数据比较是在主程序里而不是在 VB dll 中。 H7'>2}>. F4yvX-JK & :@V`v21G +PFS,oz -------------------------------------------------------------------------------- YmZ|w'& MFXR1/l8: 另外还有其它的 5 种方法,如果下面的方法你听起来有点怪或不太可能,你可忽略它们,但记得 VB 保护方式不限于上述三种。 BJ%'Vg5 p">`mW&O <_L:uXl 4) 单精度实数(Single)比较 5 h>'WDH sKt%@$dBJ eK(1mIN+ j:NHR 5) 双精度(Double)比较 R2s: |Vk_ $M0[m #c4i< 6) 整型(Integer)比较 vzM{S8" J*;-*qQ|g4 rL9 vE}$ 7) 字节(Byte)比较 QD S%ra 0j6ce`2O J`e\jB:id 8) CURRENCY 型比较 heE9:1 { I=go&" #%')Mo}0Z 上述8个比较方式是不是意味着我们每次能中断在其单个某一类型的比较程序里?回答是否定的。这是因为程序有可能同时采用两种方法来比较,如Currency和String, Variant 和 Long 等... .zd3wfLj 0i*wq&6S 一些可能用上的断点 wzwzY^ [j pUTb i@GnvP]'7 d[}l{Fz` 1) 数据类型转换 9@QgU ,< I<m,4'y] i) 字符串( String )转换字节( Byte )或整型( Integer ) : __vbai2str .o(Unwn\ WuS^qjV_O ii) 字符串( String )转长型( Long ) : __vbai4str :sGC`v#] ~KIR^0s iii) 字符串( String )转换单精度型( Single ) : __vbar4str Ldy+xR [Hek gH iv) 字符串( String )转换双精度型( Double ) : __vbar8str ~2 WLlg} +27]8C> v) 字符串( String )转 Currency 型 : VarCyFromStr ( 适合 VB6. 你的 WINICE.DAT 必须有 OLEAUT32.DLL) x'4J4UI :"7_SaE vi) 整型( Integer )转字符串型( String ) : VarBstrFromI2 ( 适合 VB6. 你的 WINICE.DAT 必须 OLEAUT32.DLL) rLg"0i:' hw:8|'5O m<Cbl\u> 2) 移动数据 2JJ&<V6T H|1aE$Y. i) 字符串( String )到内存 : __vbaStrCopy 0}VQElG} z.hg2W? # ii) 变量( Variant )到内存 : __vbaVarCopy or __vbaVarMove >ZC\`uH @4UnX#C LY![L:' 3) 运算符 Hxk/-a,ih QH(jC: i) 加法 : __vbavaradd <-- 增加变量 YDv,k<` $h+9D7' ii) 减法 : __vbavarsub <-- 减去变量 S&DXb~` |{+ Nb iii) 乘法 : __vbavarmul <-- 乘以变量 L1Vq:N bA.? iv) 除法 : __vbavaridiv <--Dividing Variant to get answer in Integer +x#cx/X? 3C_J-,9O v) XOR: __vbavarxor <--XOR __$FY7U#= ,ds]a1)m2 :unp +E 4) 其它类 8^, P T9t9 6F\_ GVAG i) __vbavarfornext <--Used in codes where there is a For... Next... Statement (Loop) <5^OO['p /]*/wo ii) __vbafreestr U~yC?n9`n9 >!K7Iule! iii) __vbafreeobj U036F Xp0UAgd iv) __vbastrvarval <--Get the value from a specific location in a String mW<+hRF <=je?"{tp v) multibytetowidechar `;0]tTR?/D (+RxiQ 4 vi) rtcMsgBox +nS^$"S?c /Wk[c%BD vii) __vbavarcat <--Joining 2 Variants together ?c6?Pe5`3u d9M33LVCR viii) __vbafreevar P[Ot Nvzk yhT_ W ix) __vbaobjset
|
|
| 文章录入:郝丽 责任编辑:郝丽 |
|
|
上一篇文章: 警惕黑客控制PC重启 下一篇文章: 没有了 |
|
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
|
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
|
|
|
|
|