VB程序的脱壳技巧

自己来解决吧,也许能搞出个自创的方法,叫什么Monster脱壳法。 在这里大家必须了解一引些小知识。 VB程序的启动方式:每个VB程序通常都会调用到许多的API,但是其中有一个API是雷 打不动的,这就是我们都知道的ThunRTMain函数。VB程序在运行时,都会首先调用 ThunRTMain函数,ThunRTMain函数将会为程序初始化进程,并获取进程ID等做一些 初始工作。 栈帧:每个任务(进程)都有一个栈,而在这个进程中的每个函数被调用时会分别从 这个栈中分出一段区域并占用它,这段区域我们称它为栈帧 函数调用:每一个函数独占自己的栈帧空间,当前正在运行的函数的栈帧总是在系统 栈的顶端,在程序运行时当遇到一个call指令,程序会自动跳到这个call指定所指的 的地址去执行指令,这时call所指向的地址处的指令的开头一般是这样的: push ebp ; 保存调用前的栈桢基址到堆栈 mov ebp,esp ; 把当前堆栈栈顶当做新栈桢基址 其实在做这个动作之前,call指令已经做了另一个动作,就是把call指令下面一条指 令的地址作为被调用函数的返回地址也一起压入了栈中,等到程序遇到retn指令时, 首先从栈中弹出返回地址,并跳到返回地址处执行指令。 现在,我们首先打开VB,做出一个简单的测试程序 接着我们再运行OD,把刚做出来的测试程序载入到OD中,这时我们就可以看到程序停 在了这里 大家看这里的代码: 00401128 > $ 68 9C124000 push 0040129C 0040112D . E8 F0FFFFFF call <jmp.&MSVBVM60.#100> 00401132 . 0000 add byte ptr [eax],al 对于一般来说,如果是用VB做的程序,那么它的的入口点基本都是这样的,我们再来 看看第二句的call,这里的call调用了一个函数<jmp.&MSVBVM60.#100>,但是这到 底是个什么样的函数呢?我们在OD中按Ctrl+N打开程序的输入表看看 第一行就是这个MSVBVM60.#100函数,我们选中这一行后按回车,然后代码就来到了 这里 嘿嘿,原来#100就是ThunRTMain函数啊。 我们来用OD跟踪一下程序,因为第二句就是一个call,所以我们要使用F7跟进这个 call,这时,我们只需要F7一下就好,现在,我们来注意一下OD堆栈窗口中的数据 堆栈窗口中的第一句就是“0012FFBC 00401132 返回到无壳.00401132来自 <jmp.&MSVBVM60.#100>”,这是的00401132是什么呢?从上面的图2中,我可以发现 ,这就是ThunRTMain函数的返回地址,但是00401128才是我们程序的入口点,从 ThunRTMain函数的返回地址和程序入口点的关系,我们可以得出这样一个公式: 程序入口点=ThunRTMain函数的返回地址-AH(AH就是十进制的10) 根据上面所得出的结论,我们现在可以进行脱壳了。 实战篇 现在我们给程序加个ASPack的外壳 把加了壳后的新文件载入OD,接着在OD的命令行窗口中输入BP ThunRTMain,回车, 给ThunRTMain函数下个断点 接着再按F9让程序在OD中运行起来,OD就会被断在 这时就要发挥我们明锐的洞察能力了,嘿嘿,现在我们再来看一下OD右下角的堆栈窗 口中的内容 我们看第一行,0012FFBC这里的数据,是00401132,后面的说明是“返回到加 壳.00401132来自加壳.00401122”,这里告诉我们的地址00401132就应该是 ThunRTMain函数的返回地址了,现在我们再回过头来看看上面的图2,00401132的确 就是ThunRTMain函数的返回地址,我们现在想对程序进行脱壳,就需要知道程序的入 口点,根据我们上面得出的那个公式我们来计算一下: 程序OEP=00401132-AH 00401132-AH=00401128 最后我们得出的程序的入口点就是00401128,现在我们知道了程序的入口点,我们只 要把他DUMP出来就可以了,但是因为现在我们的OD正处于msvbvm60的领空,现在我们 DUMP是不合适的,我们必须先返回到程序的领空,我们在OD中按Alt+F9就可以完成这 一步骤,等OD返回程序的领空后,我们在OD的反汇编窗口中点击鼠标右键选择“Dump debugger process” 接着在弹出的窗口中把Modify这一框中的内容改为程序的入口点地址 现在我们只要把程序从内在中给DUMP出来就可以了,用PEID 来检测一下我们DUMP 后 的文件 运行一下,脱壳成功。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")