⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 foxtools.frm

📁 一款反编译VFP程序的代码的工具
💻 FRM
📖 第 1 页 / 共 5 页
字号:
    
    If CodeLen <> 0 Then
        On Error GoTo ne2
        RecNo = I
        CodeStartPos = GetMemoOffset(I, 12)
        CodeStartPos = CodeStartPos * BlockSize + 1 + 8
        
        ReDim FileData(1 To CodeLen) As Byte
        ObjNane = GetFieldValue(I, 7)
        CopyMemory FileData(1), FileDataSct(CodeStartPos), CodeLen
        form1.StatusBar1.Panels(1).Text = "正在分析文件:" + filename1 + " - 对象:" + ObjNane
       'scxlmt(i) = ObjNane
        methodtext = ""

        Dim cc As Integer
        Dim g1 As Long, g2 As Long, g3 As Long
        
        CopyMemory g1, FileData(10), 4
        CopyMemory g2, FileData(14), 4
        CopyMemory g3, FileData(18), 4
            
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' 检查是不是 foxtools 加密的文件,去掉此简单的检查就可以直接反编译 FoxTools 2 及以前的
        ' FoxTools 加密的文件了
        'If g1 - g2 = 1 Or g3 = 1 Then
        '   Close #1
        '   Close #2
        '   Exit Sub
        'End If
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        
        FileData(1) = 254
        FileData(2) = 242
        FileData(3) = 255
        FileData(4) = 32
        FileData(5) = 2
        Dim CodeMovOfs As Long
        CodeMovOfs = ScanFlag(FileData)
        
        If CodeMovOfs > 10 Then
           CodeMovOfs = 0
        End If
        
        cc = FileData(46)
        
        If FileData(46) = 54 Then
           FileData(46) = 37
        End If
        
        If CodeMovOfs <> 0 Then ' 存在着表单代码位移
           FileData(46) = 37 - CodeMovOfs
        End If
        
        sct_methods_length2 = ""
        sct_methods_length2 = decompobjcode()
        'scxcodext(i) = sct_methods_length2
        CurrentRecodNo = I
        If sct_methods_length2 <> "" Then
        RichTextBox1.Text = RichTextBox1.Text + sct_methods_length2
        End If
        If sct_methods_length2 <> "" And Left(sct_methods_length2, 3) <> "*!*" Then
            If Len(sct_methods_length2) > 16000 Then
                form1.Refresh
            Else
                form1.Refresh
            End If
            methodtext = sct_methods_length2
            MethodLen = strlen(sct_methods_length2)
            WriteMemoContents I, MethodLen, CurrentRecodNo, sct_methods_length2
                    
        Else
            '没有反编译出代码来, 用原有的表单代码偏移值再反编译一次
            FileData(46) = 37
            CurrentRecodNo = I
            sct_methods_length2 = ""
            sct_methods_length2 = decompobjcode()
            If sct_methods_length2 <> "" Then
        RichTextBox1.Text = RichTextBox1.Text + sct_methods_length2
        End If
            If sct_methods_length2 <> "" Then
                If Len(sct_methods_length2) > 16000 Then
                    form1.Refresh
                Else
                    form1.Refresh
                End If
                methodtext = sct_methods_length2
                MethodLen = strlen(sct_methods_length2)
                WriteMemoContents I, MethodLen, CurrentRecodNo, sct_methods_length2
            Else
                FileData(46) = cc
                sct_methods_length2 = ""
                sct_methods_length2 = decompobjcode()
                If sct_methods_length2 <> "" Then
        RichTextBox1.Text = RichTextBox1.Text + sct_methods_length2
        End If
                If sct_methods_length2 = "" Then ' 无代码?修复后再次反编译
                            
                    FileData(46) = cc
                    RepairEXE_APP FileData
                    CurrentRecodNo = I
                    sct_methods_length2 = ""
                    sct_methods_length2 = decompobjcode()
                    If sct_methods_length2 <> "" Then
        RichTextBox1.Text = RichTextBox1.Text + sct_methods_length2
        End If
                    If sct_methods_length2 = "" Then  ' 仍然没反出代码?????? 好吧,把 objcode 的内容保存为文件以供分析
                        Dim f As String, ff As String
                        f = GetFieldValue(I, 7)
                        'ff = App.path + "\" + "rec" + Trim(str(i)) + f + ".fxp"
                        If InStr(f, "\") <> 0 Or _
                           InStr(f, "/") <> 0 Or _
                           InStr(f, ":") <> 0 Or _
                           InStr(f, "*") <> 0 Or _
                           InStr(f, "?") <> 0 Or _
                           InStr(f, "<") <> 0 Or _
                           InStr(f, ",") <> 0 Or _
                           InStr(f, ">") <> 0 Or _
                           InStr(f, "|") Or f = "" Or Len(f) > 255 Then
                              ff = App.path + "\" + Trim(str(I)) + "recff" + ".fxp"
                         Else
                              ff = App.path + "\" + "rec" + Trim(str(I)) + f + ".fxp"
                         End If
                        'ff = App.path + "\" + "rec" + Trim(str(i)) + f + ".fxp"
                      
                        Open ff For Binary As #5
                        Put #5, , FileData()
                        Close #5
                    Else
                        methodtext = sct_methods_length2
                        MethodLen = strlen(sct_methods_length2)
                        WriteMemoContents I, MethodLen, CurrentRecodNo, sct_methods_length2
                    End If
                Else
                    methodtext = sct_methods_length2
                    MethodLen = strlen(sct_methods_length2)
                    WriteMemoContents I, MethodLen, CurrentRecodNo, sct_methods_length2
                End If
            End If
        End If
ne2:
    End If
Next

Close #10
Close #20
On Error GoTo Error 'sctvct
form1.StatusBar1.Panels(1).Text = "OK"
             ''''''''''''
           ' If RecNum > 0 Then
   '  ReDim scxcodex(1 To RecNum) '重新定义数据将生成的代码放到scxcodext数据中
'ReDim scxlm(1 To RecNum)
         '  Dim k As Integer
         '  k = 1
         '   For i = 1 To RecNum
         '  If scxlmt(i) <> "" Then
         '  scxlm(k) = scxlmt(i)
          ' scxcodex(k) = scxcodext(i)
          'List2.AddItem scxlm(k)
         ' 'RichTextBox1.Text = RichTextBox1.Text + scxcodex(k)
         ' k = k + 1
         '  End If
          '  Next
           ' End If
           ' RichTextBox1.Visible = True
           ' ReDim scxcodext(0) ' 释放数据
'ReDim scxlmt(0)
            On Error GoTo Error
            
            
            
            
           '''''''''''''''新代码结束
            Case Else
           On Error GoTo Error
             'List2.Clear
             RichTextBox1.Text = ""
           RichTextBox1.Visible = True
'           Image3.Visible = False
        'ListView2.ColumnHeaders.Clear
           'ListView2.Visible = False
          
           On Error GoTo Error
            End Select
            
Exit Sub
Error:
 'List2.Clear
             RichTextBox1.Text = ""
           RichTextBox1.Visible = True
'           Image3.Visible = False
        'ListView2.ColumnHeaders.Clear
           'ListView2.Visible = False
          
MsgBox "打开文件时发生错误", , "提示"
Exit Sub

End Sub
Private Sub form_unload(Cancel As Integer)
Reset
If apppath = "" Then Exit Sub
Dim DelFileOp As SHFILEOPSTRUCT
Dim result As Long

' 删除生成的临时文件
With DelFileOp
    .wFunc = fo_delete
    .pFrom = apppath + "~ft_tmp.*"
    .fFlags = fof_noconfirmation
End With
result = SHFileOperation(DelFileOp)
End Sub

Private Sub lstDetails_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
lstDetails.Sorted = True
Select Case Trim(ColumnHeader)
Case "文件名"
   lstDetails.SortKey = 0
Case "文件大小"
   lstDetails.SortKey = 1
End Select
Me.Refresh
End Sub
Private Sub lstdetails_dblclick()

' 双击 ListView 中的一个项时,打开此文件来查看其内容
If lstDetails.ListItems.Count = 0 Or appv < 30 Then Exit Sub

Reset

DeCompFilePath = ""

ReDim tmpfile(0) As Byte
Dim I As Integer
Dim j As Integer

For I = 1 To lstDetails.ListItems.Count
   If lstDetails.ListItems.Item(I).Selected = True Then
        Exit For
   End If
Next

Dim file2 As String
file2 = lstDetails.ListItems.Item(I).Default

If Len(file2) = 0 Then Exit Sub

file2 = Left(file2, Len(file2) - 1) + "T"

Dim itmFound As ListItem
Set itmFound = form1.ListView1.FindItem(file2, lvwText, , 0)

Dim beginpos As Long
Dim NFLEN As Long
Dim origdata() As Byte

If lstDetails.ListItems.Item(I).Default <> "" Then
    
    For j = strlen(selfile) To 1 Step -1
       If Mid(selfile, j, 1) = "\" Then
          apppath = Left(selfile, j)
          Exit For
       End If
    Next
    
    ReDim origdata(0 To UBound(ddata)) As Byte
    CopyMemory origdata(0), ddata(0), UBound(ddata) + 1
    fname = lstDetails.ListItems.Item(I).Default
    NFLEN = Val(lstDetails.ListItems.Item(I).ListSubItems(1).Default)
    
    If NFLEN = 0 Then
       Exit Sub
    End If
    
    beginpos = Val(lstDetails.ListItems.Item(I).ListSubItems(2).Default)

     Dim txtfile As String
     txtfile = UCase(Right(fname, 4)) '‘新增代码
     

    'If (Right(fname, 4) = ".FPW") Or (Right(fname, 2) = ".H") Or (Right(fname, 2) = ".C") Then
      '  If txtfile = ".PRG" Or txtfile = ".BAS" Or txtfile = ".INI" Or txtfile = ".TXT" Or txtfile = ".HTM" Or txtfile = ".CPP" Or txtfile = ".FPW" Or txtfile = ".MPR" Or txtfile = ".QPR" Or txtfile = ".SPR" Or txtfile = ".BAT" Or txtfile = ".LOG" Or txtfile = ".PRG" Or txtfile = ".ERR" Or txtfile = ".ASM" Or txtfile = ".URL" Or (Right(fname, 2) = ".H") Or (Right(fname, 2) = ".C") Then 'new code
      ' fname = apppath + "~ft_tmp.txt"
    'End If

    If (Right(fname, 4) = ".FXP") Or _
        (Right(fname, 4) = ".FOX") Or _
        (Right(fname, 4) = ".MPX") Or _
        (Right(fname, 4) = ".QPX") Then
        
        fname = apppath + "~ft_tmp" + Right(fname, 4)
        
        ReDim tmpfile(0 To NFLEN) As Byte
        CopyMemory tmpfile(0), ddata(beginpos), NFLEN
        Open fname For Binary As #2
        Put #2, , tmpfile()
        Close #2

        inpfile = fname
        SplitFxp = True
        Main "*", 0
        SplitFxp = False
        
        Select Case Right(fname, 4)
        Case ".FXP"
             fname = apppath + "~ft_tmp.prg"
        Case ".MPX"
             fname = apppath + "~ft_tmp.mpr"
        Case ".QPX"
             fname = apppath + "~ft_tmp.qpr"
        End Select
        EditFileName = fname
        frmNoteEdit.Show 1
        ReDim ddata(0 To UBound(origdata)) As Byte
        CopyMemory ddata(0), origdata(0), UBound(origdata) + 1
        Exit Sub
    ElseIf (Right(fname, 4) = ".VCX") Or _
        (Right(fname, 4) = ".SCX") Or _
        (Right(fname, 4) = ".DBF") Or _
        (Right(fname, 4) = ".FRX") And _
        (Right(fname, 1) <> "\") Then
        
         ReDim tmpfile(0 To NFLEN) As Byte
         CopyMemory tmpfile(0), ddata(beginpos), NFLEN
         Open "DBF" For Binary As #2
         Put #2, , tmpfile()
         Close #2
        
         form2.Show 1
         Exit Sub
    Else
        If (Right(fname, 4) <> ".VCX") And _
            (Right(fname, 4) <> ".VCT") And _
            (Right(fname, 4) <> ".SCX") And _
            (Right(fname, 4) <> ".SCT") And _
            (Right(fname, 4) <> ".DBF") And _
            (Right(fname, 4) <> ".FPT") And _
            (Right(fname, 4) <> ".CDX") And _
            (Right(fname, 4) <> ".FRX") And _
            (Right(fname, 1) <> "\") And _
            (Right(fname, 4) <> ".FRT") Then
            
                fname = apppath + "~ft_tmp" + Right(fname, 4)
                ReDim tmpfile(0 To NFLEN - 1) As Byte
                CopyMemory tmpfile(0), ddata(beginpos), NFLEN
                Open fname For Binary As #2
                Put #2, , tmpfile()
                Close #2
        Else
            Exit Sub
        End If

    End If
     If txtfile = ".INF" Or txtfile = ".PRG" Or txtfile = ".BAS" Or txtfile = ".INI" Or txtfile = ".TXT" Or txtfile = ".HTM" Or txtfile = ".CPP" Or txtfile = ".FPW" Or txtfile = ".MPR" Or txtfile = ".QPR" Or txtfile = ".SPR" Or txtfile = ".BAT" Or txtfile = ".LOG" Or txtfile = ".PRG" Or txtfile = ".ERR" Or txtfile = ".ASM" Or txtfile = ".URL" Or (Right(fname, 2) = ".H") Or (Right(fname, 2) = ".C") Then 'new code
  
    'If (Right(fname, 4) = ".TXT") Then
        EditFileName = fname
        frmNoteEdit.Show 1
        ReDim ddata(0 To UBound(origdata)) As Byte
        CopyMemory ddata(0), origdata(0), UBound(origdata) + 1
        Exit Sub
    End If

   ' Case ".BMP", ".JPG", ".GIF", ".ICO", ".CUR", ".EMF", ".WMF", ".DIB"
      If txtfile = ".BMP" Or txtfile = ".JPG" Or txtfile = ".GIF" Or txtfile = ".ICO" Or txtfile = ".CUR" Or txtfile = ".EMF" Or txtfile = ".WMF" Or txtfile = ".DIB" Then 'new code
  
    'If (Right(fname, 4) = ".TXT") Then
        EditFileName = fname
        Form3.Show 1
        ReDim ddata(0 To UBound(origdata)) As Byte
        CopyMemory ddata(0), origdata(0), UBound(origdata) + 1
        Exit Sub
    End If
    
    
    
    Dim r As Long, msg As String
    
    r = StartDoc(fname)

    If r <= 32 Then
        Select Case r
            Case SE_ERR_FNF
                msg = "文件未找到"
            Case SE_ERR_PNF
                msg = "路径未找到"
            Case SE_ERR_ACCESSDENIED
                msg = "访问拒绝"
            Case SE_ERR_OOM
                msg = "内存不足"
            Case SE_ERR_DLLNOTFOUND
                msg = "DLL 未找到"
            Case SE_ERR_SHARE
                msg = "发生共享冲突"
            Case SE_ERR_ASSOCINCOMPLETE
                msg = "不完整的或无效的文件扩展名"
            Case SE_ERR_DDETIMEOUT
                msg = "DDE 超时"
            Case SE_ERR_DDEFAIL
                msg = "DDE 传输失败"
            Case SE_ERR_DDEBUSY
                msg = "DDE 忙"
            Case SE_ERR_NOASSOC
                msg = "没有找到查看此类文件的程序"
            Case ERROR_BAD_FORMAT
                msg = "无效的 EXE 文件或 EXE 映象文件错误"
            Case Else
                msg = "未知的错误"
        End Select
        MsgBox msg
    End If
    ReDim ddata(0 To UBound(origdata)) As Byte
    CopyMemory ddata(0), origdata(0), UBound(origdata) + 1
End If
End Sub
Private Sub lstDetails_ItemCheck(ByVal Item As MSComctlLib.ListItem)
    Set ItemClicked = Item
    If ItemClicked.Checked = False Then
        getfoxfile.aChecked(ItemClicked.Index - 1) = True
    Else
        getfoxfile.aChecked(Ite

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -