hahuhu190 发表于 2009-8-4 14:39:05

VB程序自校检怎么去除

我从别的论坛下载了一个VBcrackme,脱了壳后运行程序提示访问内存错误,作者说这是自校检,我弄来弄去还是弄不掉,有谁能帮帮,并说下思路

[ 本帖最后由 hahuhu190 于 2009-8-5 13:00 编辑 ]

daihu37 发表于 2009-8-4 14:47:40

f12堆栈试一试看看啊

hahuhu190 发表于 2009-8-4 16:52:40

试过了,在系统领空中徘徊···

老海 发表于 2009-8-5 09:03:27

你应该上传未脱壳的原程序才好帮你分析

hahuhu190 发表于 2009-8-5 12:57:50

原帖由 老海 于 2009-8-5 09:03 发表 https://www.chinapyg.com/images/common/back.gif
你应该上传未脱壳的原程序才好帮你分析
哦,知道了

sunkj201 发表于 2009-8-6 11:58:55

无可奈何ing

consult1026913 发表于 2009-9-14 10:42:48

没办法,那个00497b8b在OD里怎么定位啊?

hflywolf 发表于 2009-9-23 16:36:19

/:001 /:001 /:001
程序是VB P-Code编译 程序校验文件的大小
分三种情况
filelen=0x71000(用AspackDie141 脱壳后文件的大小) 大概的代码如下:

Private Sub Form_Load()
If FileLen(App.Path & "\" & App.EXEName & ".exe") = 462848 then'462848=0x71000
   tChr = "" & Chr(34) & ""
   exeName = CVar(App.Path & "\" & App.EXEName & ".exe")
   nLen = CLng(Len(exeName))
   nStr = CStr(nLen)
   For I = 1 to nLen   ' I as long
         If left(tStr,1) = "\" Then
            Exit for
         End If
         ntmp = Mid(exeName, CLng(nStr), I)
         tStr = CStr(ntmp)
         nStr = CStr((CDbl(nStr) - CDbl(1)))
   Next I' For循环的作用将文件路径名字符中最后一个"\"(保含"\")以后的字符截取
      tStr = CStr(Mid(tStr, 2, ntmp))   '取文件名
      MsgBox(CVar(tChr & "0x00498b7b" & tChr & "指令引用的" & tChr & "0x001c5204" & tChr & "内存。该内存不能为" & tChr & "read" & tChr) &(((((((("。" + Chr(13)) + " ") + Chr(13)) + "要终止程序,请单击“确定”") + Chr(10)) + " ") + Chr(13)) + "要调试程序,请单击“取消” "), 1+16, CVar(tStr & " - 应用程序错?"), helpfile, Context)
End If

filelen=0x78000(手脱后文件的大小) 大概的代码如下:

If FileLen(App.Path & "\" & App.EXEName & ".exe") = 491520 then'491520=0x78000
   tChr = "" & Chr(34) & ""
   exeName = CVar(App.Path & "\" & App.EXEName & ".exe")
   nLen = CLng(Len(exeName))
   nStr = CStr(nLen)
   For I = 1 to nLen   ' I as long
         If left(tStr,1) = "\" Then
            Exit for
         End If
         ntmp = Mid(exeName, CLng(nStr), I)
         tStr = CStr(ntmp)
         nStr = CStr((CDbl(nStr) - CDbl(1)))
   Next I' For循环的作用将文件路径名字符中最后一个"\"(保含"\")以后的字符截取
      tStr = CStr(Mid(tStr, 2, ntmp))   '取文件名
      MsgBox(CVar(tChr & "0x00498b7b" & tChr & "指令引用的" & tChr & "0x001c5204" & tChr & "内存。该内存不能为" & tChr & "read" & tChr) &(((((((("。" + Chr(13)) + " ") + Chr(13)) + "要终止程序,请单击“确定”") + Chr(10)) + " ") + Chr(13)) + "要调试程序,请单击“取消” "), 1+16, CVar(tStr & " - 应用程序错?"), helpfile, Context)
End If

filelen!=0x7C00(加壳文件的大小) 大概的代码如下:

If FileLen(App.Path & "\" & App.EXEName & ".exe") = 31744 then'31744=0x7C00
   tChr = "" & Chr(34) & ""
   exeName = CVar(App.Path & "\" & App.EXEName & ".exe")
   nLen = CLng(Len(exeName))
   nStr = CStr(nLen)
   For I = 1 to nLen   ' I as long
         If left(tStr,1) = "\" Then
            Exit for
         End If
         ntmp = Mid(exeName, CLng(nStr), I)
         tStr = CStr(ntmp)
         nStr = CStr((CDbl(nStr) - CDbl(1)))
   Next I' For循环的作用将文件路径名字符中最后一个"\"(保含"\")以后的字符截取
      tStr = CStr(Mid(tStr, 2, ntmp))   '取文件名
      MsgBox(CVar(tChr & "0x00498b7b" & tChr & "指令引用的" & tChr & "0x001c5204" & tChr & "内存。该内存不能为" & tChr & "read" & tChr) &(((((((("。" + Chr(13)) + " ") + Chr(13)) + "要终止程序,请单击“确定”") + Chr(10)) + " ") + Chr(13)) + "要调试程序,请单击“取消” "), 1+16, CVar(tStr & " - 应用程序错?"), helpfile, Context)
End If
End Sub

所以去除自校验方法:(这里要改三处)
第一处:

用十六进制工具打开脱壳的文件 将6D5E5H处的: 1C改成1E 或 如果脱壳后文件大小是0x71000(462848)那这里改成 1D 否则这里可以不用改


第二处:

先用十六进制工具打开脱壳的文件 将6D8DEH处的: 1C改成1E 或 如果脱壳后文件大小是0x78000(491520)那这里改成 1D 否则这里可以不用改



第三处:

先用十六进制工具打开脱壳的文件 将6DBD7H处的: 1C改成1E 或 改成 1D (必须改)


经过以上修改程序自校验即可去掉./:018

[ 本帖最后由 hflywolf 于 2009-9-23 19:36 编辑 ]

老万 发表于 2009-9-23 19:21:27

楼上的大侠真厉害,学习一下

hflywolf 发表于 2009-9-23 20:01:12

原帖由 老万 于 2009-9-23 19:21 发表 https://www.chinapyg.com/images/common/back.gif
楼上的大侠真厉害,学习一下
/:L 不是我厉害,是VB反编译工具太强大了!

把脱壳程序丢进VBDecompiler看一下Form_Load事件 我给出的代码就都出来了(我只是在理解的基础上把代码加工一下而已)
再把脱壳程序丢进VBExplorer   也是看一下Form_Load事件 伪代码也出来了。
接下根据VB P-CODE 的原理 结合VBDecompiler 反编译出来程序代码,改掉相应跳转的指令即可

Branch(无条件跳转 机器码是1E)
BranchF(堆栈值为0则跳,机器码是1C)
BranchT(堆栈值是-1则跳,机器码是1D)


[ 本帖最后由 hflywolf 于 2009-9-23 20:02 编辑 ]
页: [1] 2
查看完整版本: VB程序自校检怎么去除