飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7941|回复: 12

[求助] VB程序自校检怎么去除

[复制链接]

该用户从未签到

发表于 2009-8-4 14:39:05 | 显示全部楼层 |阅读模式
我从别的论坛下载了一个VBcrackme,脱了壳后运行程序提示访问内存错误,作者说这是自校检,我弄来弄去还是弄不掉,有谁能帮帮,并说下思路

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入我们

x
PYG19周年生日快乐!

该用户从未签到

发表于 2009-8-4 14:47:40 | 显示全部楼层
f12堆栈试一试看看啊
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2009-8-4 16:52:40 | 显示全部楼层
试过了,在系统领空中徘徊···
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-5-9 01:01
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2009-8-5 09:03:27 | 显示全部楼层
    你应该上传未脱壳的原程序才好帮你分析
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2009-8-5 12:57:50 | 显示全部楼层
    原帖由 老海 于 2009-8-5 09:03 发表
    你应该上传未脱壳的原程序才好帮你分析

    哦,知道了
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-6-2 20:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-8-6 11:58:55 | 显示全部楼层
    无可奈何ing
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-11-24 21:15
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2009-9-14 10:42:48 | 显示全部楼层
    没办法,那个00497b8b在OD里怎么定位啊?
    PYG19周年生日快乐!

    该用户从未签到

    发表于 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 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2015-10-9 11:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-9-23 19:21:27 | 显示全部楼层
    楼上的大侠真厉害,学习一下
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-9-23 20:01:12 | 显示全部楼层
    原帖由 老万 于 2009-9-23 19:21 发表
    楼上的大侠真厉害,学习一下

    /: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 编辑 ]
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表