CN102012858A - 一种模拟软件运行的方法 - Google Patents

一种模拟软件运行的方法 Download PDF

Info

Publication number
CN102012858A
CN102012858A CN 201010214123 CN201010214123A CN102012858A CN 102012858 A CN102012858 A CN 102012858A CN 201010214123 CN201010214123 CN 201010214123 CN 201010214123 A CN201010214123 A CN 201010214123A CN 102012858 A CN102012858 A CN 102012858A
Authority
CN
China
Prior art keywords
instruction sequence
packer
dry run
simulation softward
specially
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN 201010214123
Other languages
English (en)
Other versions
CN102012858B (zh
Inventor
陆舟
于华章
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Jianshi Chengxin Technologies Co., Ltd.
Original Assignee
Beijing Feitian Technologies Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Feitian Technologies Co Ltd filed Critical Beijing Feitian Technologies Co Ltd
Priority to CN 201010214123 priority Critical patent/CN102012858B/zh
Publication of CN102012858A publication Critical patent/CN102012858A/zh
Application granted granted Critical
Publication of CN102012858B publication Critical patent/CN102012858B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Storage Device Security (AREA)

Abstract

本发明公开了一种模拟软件运行的方法,属于软件保护领域,所述方法包括:外壳工具对被加壳程序进行分析,查找出满足条件的指令序列,记录下所述指令序列在所述被加壳程序中的具体位置,在被加壳程序的副本的所述具体位置上插入相关语句,启动并运行所述插入相关语句后的被加壳程序的副本,进行模拟运行,并且相关语句在执行时记录模拟运行信息,读取模拟运行信息,进行分析和比较,查看模拟运行效果,选择保护方案。通过本发明提供的方法可以预先模拟各种保护方案,并自动分析模拟得到的相关数据,提供评定保护效果,并且在模拟过程中可预先处理保护信息,提升最终真正保护软件的效率,节约了资源,方便直观得选择最合适的保护方案。

Description

一种模拟软件运行的方法
技术领域
本发明涉及软件保护领域,特别涉及一种模拟软件运行的方法。
背景技术
R7.Net外壳工具的保护原理是将被加壳程序中符合条件的(能够在加密锁中运行的指令)、连续的指令序列提取出来,将这部分指令序列移植到加密锁中去运行,以达到保护算法的目的。
但是,当我们将一个被加壳程序中的若干指令序列移植到加密锁中以后,等我们运行这个加壳后的程序时,无法知道移植到加密锁中的指令序列的运行情况,而现有技术中,一般会有下面三种情况:
1)某些指令序列没有被执行,起不到保护作用,因为这部分指令序列没有被执行,所以不会影响到程序的正常运行;
2)某些指令序列过于频繁的被执行,严重影响效率,由于访问加密锁需要耗时,所以如果过于频繁访问加密锁,有可能导致加壳后的程序无法正常运行;
3)某些指令序列适当的被执行,在程序执行的某些关键步骤被执行,既起到了保护算法的作用,又不会影响程序的正常执行。
很明显,我们在为一个程序加壳时,应尽量选择符合第3种情况的指令序列,放弃第1、2种情况的指令序列。
并且,目前软件保护的可选择方案比较多,但经常在一个软件保护中为平衡安全与效率,可能会选择其中的一种或多种方案进行软件保护,但通常这种平衡需要在保护完成后才能去判断,并且判断的过程通常也不是很直观,特别是浪费资源和时间等。
发明内容
为了解决现有技术中的不足,本发明提供了一种模拟软件运行的方法,所述方法包括:
对被加壳程序进行分析,查找出满足条件的指令序列,记录下所述指令序列在所述被加壳程序中的具体位置;
在被加壳程序的副本的所述具体位置上插入相关语句;
启动并运行所述插入相关语句后的被加壳程序的副本,进行模拟运行,并且相关语句在执行时记录模拟运行信息;
读取模拟运行信息,进行分析和比较,查看模拟运行效果,选择保护方案。
本发明的有益效果在于:本发明提供了一种模拟软件运行的方法,通过该方法预先模拟各种保护方案,并自动分析模拟得到的相关数据,提供评定保护效果,并且在模拟过程中可预先处理保护信息,提升最终真正保护软件的效率,进一步实现了透明的软件保护,提高了效率,节约了资源,方便直观得选择最合适的保护方案。
附图说明
图1为本实施例提供的一种模拟软件运行功能的方法的流程图;
图2为本实施例提供的另一种模拟软件运行功能的方法的流程图;
图3为本实施例提供的又一种模拟软件运行功能的方法的流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式做进一步地详细描述。
实施例1
本实施例提供了一种模拟软件运行功能的方法。
参见图1,一种模拟软件运行功能的方法,具体实现步骤如下:
步骤101:外壳工具接收用户输入的对被加壳程序进行分析的信息,调用入口函数准备对被加壳程序进行分析;
在本实施例中,入口函数具体为OnAppOperateAnalyseIl()。
步骤102:判断上述被加壳程序中是否存在连续的指令序列,若不存在,则提示出错,若存在,则执行步骤103;
其中,指令序列具体可以为运算指令序列、常量加载指令序列、局部变量加载指令序列和局部变量存储指令序列;
在实施例步骤102中,外壳工具一次性从被加壳程序中查找出所有的连续的指令序列,再判断上述所有的连续的指令序列是否满足步骤103到步骤105所说的条件,最后步骤105得到的连续的指令序列则为满足所有条件的指令序列;
具体地,在本实施例中,以如下被加壳程序为例进行说明,被加壳程序如下:
    .method assembly instance void DrawIsoMap(class
[System.Drawing]System.Drawing.Graphics A_1,
                                      uint16A_2,
                                      uint16A_3)cil
managed
      {
      .locals init(int16V_0,
                   int16V_1,
                   uint16V_2,
                   uint16V_3,
                   uint16V_4,
                   uint16V_5,
                   uint8V_6,
                   uint8V_7,
                   uint8V_8,
                   uint8V_9,
                   int16V_10,
                   int16V_11,
                   int16V_12,
                   int16V_13,
                   int16V_14,
                   int16V_15,
             int16V_16,
             int16V_17,
             int32V_18,
             int32V_19,
             int32V_20,
             int32V_21,
             int32V_22,
             int32V_23,
             int32V_24,
             int32V_25,
             int32V_26,
             uint16V_27)
IL_0000:ldc.i4.0
IL_0001:stloc.s    V_6
……
IL_0035:ldarg.3
IL_0036:ldc.i4.s   15
IL_0038:and
IL_0039:stloc.s    V_15
IL_003b:ldloc.s    V_14
IL_003d:conv.i4
IL_003e:ldloc.s    V_15
IL_0040:conv.i4
IL_0041:sub
IL_0042:conv.i2
IL_0043:stloc.s    V_16
IL_0045:ldloc.s    V_14
IL_0047:conv.i4
IL_0048:ldc.i4.1
IL_0049:shr.un
IL_004a:ldloc.s    V_15
IL_004c:conv.i4
IL_004d:ldc.i4.1
IL_004e:shr.un
IL_004f:add
IL_0050:conv.i2
IL_0051:stloc.s    V_17
IL_0053:ldc.i40xff
IL_0058:stloc.s    V_8
IL_005a:ldloc.s    V_10
IL_005c:stloc.s    V_12
IL_005e:ldloc.s    V_11
IL_0060:stloc.s    V_13
IL_0062:ldc.i4.8
IL_0063:ldloc.s    V_17
IL_0065:conv.i4
IL_0066:sub
IL_0067:stloc.s    V_19
IL_0069:ldc.i4.0
IL_006a:stloc.s    V_4
IL_006c:ldloc.s    V_12
IL_006e:stloc.0
IL_006f:ldloc.s    V_13
IL_0071:stloc.1
IL_0072:ldc.i4.s   16
IL_0074:ldloc.s    V_16
IL_0076:conv.i4
IL_0077:sub
IL_0078:stloc.s    V_18
IL_007a:ldc.i4.s   24
IL_007c:stloc.s    V_20
IL_007e:ldloc.s    V_4
IL_0080:conv.u4
IL_0081:ldc.i4.1
IL_0082:and
IL_0083:brfalse.s  IL_0092
IL_0085:ldloc.s    V_20
……
IL_0160:ldarg.0
IL_0161:ldfld      int16Ma in.TIsoForm::FSpriteY
IL_0166:ldc.i4.s   15
IL_0168:and
IL_0169:stloc.s    V_15
IL_016b:ldloc.s    V_14
IL_016d:conv.i4
IL_016e:ldloc.s    V_15
IL_0170:conv.i4
IL_0171:sub
IL_0172:stloc.s    V_25
IL_0174:ldloc.s    V_14
IL_0176:conv.i4
IL_0177:ldc.i4.1
IL_0178:shr.un
IL_0179:ldloc.s    V_15
IL_017b:conv.i4
IL_017c:ldc.i4.1
IL_017d:shr.un
IL_017e:add
    IL_017f:stloc.s    V_26
    IL_0181:ldarg.1
    ……
    IL_02cd:ble.un    IL_0053
    IL_02d2:ret
}
经过判断之后可以得到上述被加壳程序中存在两段连续的指令序列,分别如下:
IL_0038:and
IL_0039:stloc.s    V_15
IL_003b:ldloc.s    V_14
IL_003d:conv.i4
IL_003e:ldloc.s    V_15
IL_0040:conv.i4
IL_0041:sub
IL_0042:conv.i2
IL_0043:stloc.s    V_16
IL_0045:ldloc.s    V_14
IL_0047:conv.i4
IL_0048:ldc.i4.1
IL_0049:shr.un
IL_004a:ldloc.s    V_15
IL_004c:conv.i4
IL_004d:ldc.i4.1
IL_004e:shr.un
IL_004f:add
IL_0050:conv.i2
IL_0051:stloc.s    V_17
IL_0053:ldc.i4     0xff
IL_0058:stloc.s    V_8
IL_005a:ldloc.s    V_10
IL_005c:stloc.s    V_12
IL_005e:ldloc.s    V_11
IL_0060:stloc.s    V_13
IL_0062:ldc.i4.8
IL_0063:ldloc.s    V_17
IL_0065:conv.i4
IL_0066:sub
IL_0067:stloc.s    V_19
IL_0069:ldc.i4.0
IL_006a:stloc.s    V_4
IL_006c:ldloc.s    V_12
IL_006e:stloc.0
IL_006f:ldloc.s    V_13
IL_0071:stloc.1
IL_0072:ldc.i4.s   16
IL_0074:ldloc.s    V_16
IL_0076:conv.i4
IL_0077:sub
IL_0078:stloc.s    V_18
IL_007a:ldc.i4.s   24
IL_007c:stloc.s    V_20
IL_007e:ldloc.s    V_4
IL_0080:conv.u4
IL_0081:ldc.i4.1
IL_0082:and
IL_0168:and
IL_0169:stloc.s    V_15
IL_016b:ldloc.s    V_14
IL_016d:conv.i4
IL_016e:ldloc.s    V_15
IL_0170:conv.i4
IL_0171:sub
IL_0172:stloc.s    V_25
IL_0174:ldloc.s    V_14
IL_0176:conv.i4
IL_0177:ldc.i4.1
IL_0178:shr.un
IL_0179:ldloc.s    V_15
IL_017b:conv.i4
IL_017c:ldc.i4.1
IL_017d:shr.un
IL_017e:add
IL_017f:stloc.s    V_26
具体地,在实际操作中从被加壳程序中得到的连续的指令序列可能为两个以上的多个,而本实施例具体以两个连续的指令序列为例进行说明。
步骤103:判断步骤102得到的连续的指令序列中是否存在其所访问的局部变量的类型为卡片中所支持类型的连续的指令序列,若否,则提示出错,若是,则执行步骤104;
在本实施例中,根据方法头中的信息可以知道上述两段连续的指令序列所访问的局部变量的类型具体为uint16、uint 8、int16和int32,并且局部变量的类型uint16、uint8、int16和int32均是卡片所支持的类型,因此上述两段连续的指令序列均满足条件,执行步骤104。
步骤104:判断将上述连续的指令序列分别组装成卡内服务后得到的堆栈中是否存在平衡的堆栈,若否,则提示出错,若是,则执行步骤105;
在本实施例中,将上述两段连续的指令序列组装成卡内服务后,第一段连续的指令序列得到的堆栈不为0,不是平衡的,第二段连续的指令序列得到的堆栈为0,是平衡的,因此第二段连续的指令序列满足步骤104所说的条件,继续执行步骤105。
步骤105:判断堆栈平衡的连续指令序列是否为其他指令的跳转目的地,若是,则提示出错信息,若否,则执行步骤106;
在本实施例中,对上述被加壳程度中的所有指令逐行进行分析,没有发现有跳转指令的目的地址,因此可以知道上述堆栈平衡的连续指令序列也不是其他指令的跳转目的地,继续执行步骤106;
并且本实施例中的步骤102-步骤105具体为被加壳程序进行分析的步骤,通过上述步骤就可以分析出满足条件的指令序列,并且步骤102-步骤105的4个步骤之间的执行可以是没有顺序的,可以是先执行步骤102,再执行步骤105,然后执行步骤103和步骤104等等,本实施例中为了提高对加壳程序的分析的效率,选择了顺序执行步骤102-步骤105,但不以此执行顺序为限制;
进一步地,本实施例中对被加壳程序进行分析的方法还可以为:从被加壳程序中查找连续的指令序列,每查找到一个指令序列就判断该指令序列是否满足步骤103至步骤105所说的条件,如果不满足,则继续查找下一个连续的指令序列,并对该指令序列进行判断,若满足,则记录下该指令序列的具体位置,并判断是否已查找完上述被加壳程序,若否,则继续查找下一个连续的指令序列,并进行判断,若是,则执行步骤107;
具体地,在实际操作中经过分析满足上述条件的连续的指令序列一般要大于一个,而本实施例具体以一个满足条件的连续的指令序列为例进行说明。
步骤106:记录下满足条件的连续指令序列的具体位置;
其中,具体位置可以是上述满足条件的指令序列的起始位置,也可以是上述指令序列的终止位置。
步骤107:生成被加壳程序的副本,在被加壳程序的副本的上述具体位置上插入对本地动态库的调用语句;
在本实施例中,可以在步骤107生成被加壳程序的副本,也可以在步骤102判断被加壳程序中是否存在连续的指令序列之前生成被加壳程序的副本,相应地,步骤102至步骤105也可以是对被加壳程序的副本进行分析;
由于具体位置可以是分析得到的指令序列的起始位置或终止位置,因此可以是在指令序列的起始位置插入对本地动态库的调用语句,也可以是在指令序列的终止位置插入对本地动态库的调用语句;
其中插入的对本地动态库的调用语句具体为:call Fun2();
具体地,当分析得到有多个连续的指令序列都满足条件时,则步骤106中会相应地记录下多个具体位置,因此本步骤中外壳工具根据用户的选择在被加壳程序的副本的相应的具体位置上插入对本地动态库的调用语句,其中用户可以选择一个具体位置,也可以选择多个具体位置;
进一步地,在本实施例中,本地动态库是通过对如下的源代码进行编译来实现的,是一个标准的Win32动态库文件,源代码具体如下:
    //
    //动态库入口函数
    //
    int WINAPI DllMain(HINSTANCE hInstance,DWORD dwReason,VOID*
pReserved)
    {
  g_hModule=hInstance;
  switch(dwReason)
  {
  case DLL_PROCESS_ATTACH://动态链接库被加载
    Attach();
    break;
  case DLL_PROCESS_DETACH://动态链接库被卸载
    Detach();
    break;
  case DLL_THREAD_ATTACH://宿主程序中创建了一个新的线程
    break;
  case DLL_THREAD_DETACH://宿主程序中结束了一个线程
    break;
  }
  hMutex=CreateMutex(NULL,FALSE,NULL);
  return TRUE;
}
//
//创建共享内存
//
extern″C″void__declspec(dllexport)Fun2(int methodSerial)
    {
         //打开或创建指定名称的共享内存
      g_hSimulantFile=::OpenFileMapping(FILE_MAP_READ|
FILE_MAP_WRITE,0,″R7_Simulant_Share″);
      if(!g_hSimulantFile)
      {
         g_hSimulantFile=::CreateFileMapping((HANDLE)-1,NULL,
PAGE_READWRITE,0,1024,″R7_Simulant_Share″);
         if(!g_hSimulantFile)
         {
            return;
         }
   }
         //获取共享内存基址
      g_pSimulantMemory=::MapViewOfFile(g_hSimulantFile,
FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
      if(!g_pSimulantMemory)
      {
         return;
       }
          //记录相应函数被调用的次数
    *(DWORD*)((DWORD*)g_pSimulantMemory+methodSerial)+=1;
具体地,在动态库中包括一个固定的方法,每次动态库被调用时都是调用该方法,该方法中有具体的参数,通过对参数的设置可以将该方法模拟为具体地将连续的指令序列组装成锁内服务后的方法,因此通过将该方法中设置不同参数就可以表示将不同的连续的指令序列组装成锁内服务后的方法,这样通过对动态库的调用就可以模拟为对加密锁内的组装成卡内服务的方法的调用,而不用实际的将连续的指令序列放入加密锁中,再访问加密锁就可以预先知道相应的效果;
进一步地,当上述动态库被调用时,动态库中的Fun2函数模块会判断是否存在预先约定名称的共享内存,若不存在,则创建一个预先约定名称的共享内存,若存在,则打开上述预先约定名称的共享内存,其中共享内存用来与外壳工具之间进行传递有关模拟运行信息,具体地也可以用文件来替代共享内存,用文件来记录有关模拟运行信息;
在本实施例中,共享内存的具体格式是一个DWORD数组,具体如下所示,每一项中存储了一个数值,该数值代表了不同参数的方法被调用的次数,因此当上述被加壳程序模拟运行完成后,外壳工具就可以从该共享内存中读取并分析出来的连续的指令序列组装成完整锁内服务的方法后被调用的次数。
  第1个方法的运行次数
  第2个方法的运行次数
  第3个方法的运行次数
  …
  …
  …
  …
  第n个方法的运行次数
步骤108:外壳工具启动并运行上述插入对本地动态库的调用语句之后的被加壳程序副本,进行模拟运行,并且在运行时调用上述本地动态库;
在本实施例中,当上述本地动态库被调用时,本地动态库中的函数会判断是否存在预先约定名称的共享内存,若不存在,则创建一个预先约定名称的共享内存,并在共享内存中记录下模拟运行信息;若存在,则打开预先约定名称的共享内存,在共享内存中记录下模拟运行信息;
具体地,本实施例中,由于在步骤107中已经建立约定名称的共享内存,本地动态库中的函数直接打开预先约定名称的共享内存,并在动态库中的方法每被调用一次时,根据该方法中的参数查找该方法在共享内存中的对应位置,并将对应位置的计数信息加1,表示设为该参数的方法再一次被调用。
步骤109:上述被加壳程序的副本运行结束后,外壳工具从共享内存中读取模拟运行信息并显示在界面上;
在本实施例中,模拟运行信息具体为计数信息。
步骤110:外壳工具删除上述用来模拟的被加壳程序的副本,不改变原有的被加壳程序;
步骤111:外壳工具对读取得到的多个模拟运行信息进行分析和比较,查看模拟运行效果,选择保护方案。
在本实施例中,对多个模拟运行信息进行分析和比较的操作具体为:由于模拟运行信息具体为计数信息,因此通过计数信息可以知道实际运行上述被加壳程序时各个被分析出来的连续代码段被调用的次数,从而可以明确模拟运行的效果,例如当某个连续代码段对应的计数信息为0时,则表示该连续代码段没有被调用,将该连续代码段放在加密锁内的作用不大,当某个连续代码段对应的计数信息达到1000时,则表示该连续代码段被调用的次数太多,将其放在加密锁内可以能影响效率,因此可以根据具体需求按照各个连续代码段的模拟运行信息来决定将哪个连续代码段放在加密锁内。
本实施例提供了一种模拟软件运行的方法,通过该方法预先模拟各种保护方案,并自动分析模拟得到的相关数据,提供评定保护效果,并且在模拟过程中可预先处理保护信息,提升最终真正保护软件的效率,进一步实现了透明的软件保护,提高了效率,节约了资源,方便直观得选择最合适的保护方案。
实施例2
本实施例提供了另一种模拟软件运行功能的方法,在本实施例中,通过在被加壳程序的副本中嵌入一段代码,并在被加壳程序的副本的特定位置插入跳转指令,直接跳转到嵌入的代码,通过执行嵌入的代码来实现模拟软件运行,其中该嵌入的代码段实现的功能与实施例1中的动态库实现的功能一样。
参见图2,另一种模拟软件运行功能的方法,具体实现如下:
步骤201:外壳工具接收用户输入的对被加壳程序进行分析的信息,调用入口函数准备对被加壳程序进行分析;
在本实施例中,入口函数具体为OnAppOperateAnalyseIl()。
步骤202:外壳工具在上述被加壳程序中查找连续的指令序列,若查找到连续的指令序列,则执行步骤203,否则提示出错;
其中,指令序列具体可以为运算指令序列、常量加载指令序列、局部变量加载指令序列和局部变量存储指令序列;
并且在本实施例中,外壳工具在被加壳程序中查找连续的指令序列时具体为:当外壳工具每查找到一个连续的指令序列时就判断该连续的指令序列是否满足步骤203至步骤205所说的条件,若该连续的指令序列不满足条件时,则返回步骤202继续在上述被加壳程序中查找下一个连续的指令序列,并进行判断,若该连续的指令序列满足条件时,则执行步骤206记录下该连续的指令序列的具体位置,并返回步骤202继续在上述被加壳程序中查找下一个连续的指令序列,并进行判断,如此反复,直到查找完该被加壳程序。
步骤203:判断查找到的该连续的指令序列所访问的局部变量的类型是否为卡片中所支持的类型,若否,则返回到步骤202继续在被加壳程序中查找下一个连续的指令序列,若是,则执行步骤204;
步骤204:判断将上述连续的指令序列组装成卡内服务后得到的堆栈是否平衡,若否,则返回到步骤202继续在被加壳程序中查找下一个连续的指令序列,若是,则执行步骤205;
步骤205:判断上述连续指令序列是否为其他指令的跳转目的地,若是,则返回到步骤202继续在被加壳程序中查找下一个连续的指令序列,若否,则执行步骤206;
在本实施例中,判断上述连续指令序列是否为其他指令的跳转目的地的方法具体为:对上述被加壳程度中的所有指令逐行进行分析,没有发现有跳转指令的目的地址,因此上述连续指令序列也不是其他指令的跳转目的地;
具体地,本实施例中的步骤202-步骤205具体为对被加壳程序进行分析的步骤,通过上述步骤就可以分析出满足条件的指令序列,并且步骤202-步骤205的4个步骤之间的执行可以是没有顺序的,可以是先执行步骤202,再执行步骤205,然后执行步骤203和步骤204等等,本实施例中为了提高对加壳程序的分析的效率,选择了顺序执行步骤202-步骤205,但不以此执行顺序为限制;
进一步地,本实施例中对被加壳程序进行分析的方法还可以如实施例1中所说的一样,即先从被加壳程序中查找到所有的连续的指令序列,再判断上述查找到的所有的指令序列所访问的局部变量的类型是否为卡片中所支持的类型,再判断满足上述条件的指令序列组装成卡内服务后得到的堆栈是否平衡,最后判断满足上述条件的指令序列是否为其他指令的跳转目的地,最后得到的指令序列则为满足所有条件的指令序列;
具体地,在实际操作中经过分析满足上述条件的连续的指令序列一般要大于一个。
步骤206:记录下上述连续的指令序列的具体位置;
在本实施例中,具体位置可以是上述指令序列的起始位置,也可以是上述指令序列的终止位置。
步骤207:判断是否查找完上述被加壳程序,若否,则返回到步骤202继续在被加壳程序中查找下一个连续的指令序列,若是,则执行步骤208;
步骤208:生成被加壳程序的副本,在被加壳程序的副本的上述具体位置上插入跳转语句;
在本实施例中,进一步地,在插入跳转语句的同时在上述被加壳程序的副本的后面嵌入代码段,其中代码段具体用于实现模拟软件运行,并且由于具体位置可以是分析得到的指令序列的起始位置或终止位置,因此可以是在指令序列的起始位置插入跳转语句,也可以是在指令序列的终止位置插入跳转语句;
其中插入的跳转语句具体为:jmp FLAG,具体用于跳转到嵌入的代码段;
具体地,当分析得到有多个连续的指令序列都满足条件时,则步骤206中会相应地记录下多个具体位置,因此本步骤中外壳工具根据用户的选择在被加壳程序的副本的相应的具体位置上插入跳转语句,其中用户可以选择一个具体位置,也可以选择多个具体位置;
并且本实施例中可以在步骤208生成被加壳程序的副本,也可以在步骤202判断被加壳程序中是否存在连续的指令序列之前生成被加壳程序的副本,相应地,步骤202至步骤205也可以是对被加壳程序的副本进行分析;
在本实施例中,在被加壳程序的副本中嵌入的代码段实现的功能与实施例1中的动态库实现的功能是一样的,并且嵌入的代码段中有一个固定的方法,每次该代码段执行时则执行该方法,该方法中有具体的参数,通过对参数的设置可以将该方法模拟为具体地将连续的指令序列组装成锁内服务后的方法,因此不同参数的上述方法就表示将不同的连续的指令序列组装成锁内服务后的方法,这样通过对上述代码段的执行就可以模拟为对加密锁内的组装成卡内服务的方法的执行,而不用实际的将连续的指令序列放入加密锁中,再访问加密锁就可以预先知道相应的效果,并且代码段是在外壳工具启动并运行上述插入跳转语句之后的被加壳程序的副本之前的插入到被加壳程序的副本中的;
进一步地,当上述代码段执行时,代码段中的函数会判断是否存在预先约定名称的文件,若不存在,则创建一个预先约定名称的文件,若存在,则打开上述预先约定名称的文件,其中预先约定名称的文件是用来与外壳工具之间进行传递有关模拟运行信息,具体地,也可以如实施例1中所说的通过共享内存来记录有关模拟运行信息,通过共享内存与外壳工具之间进行传递;
步骤209:外壳工具启动并运行上述插入跳转语句之后的被加壳程序副本,进行模拟运行,并且在运行时跳转到上述嵌入的代码段;
在本实施例中,当上述嵌入的代码段执行时,代码段中的函数会判断是否存在预先约定名称的文件,若不存在,则创建一个预先约定名称的文件,并在文件中记录下模拟运行的相关信息;若存在,则打开预先约定名称的文件,在文件中记录下模拟运行的相关信息;
具体地,本实施例中,代码段中的函数直接打开预先约定名称的文件,并在代码段中的方法每执行一次时,根据该方法中的参数查找该方法在文件中的对应位置,并将对应位置的计数信息加1,表示设为该参数的方法再一次执行。
步骤210:运行结束后,外壳工具从文件中读取模拟运行信息并显示在界面上;
在本实施例中,模拟运行信息具体为计数信息。
步骤211:外壳工具删除上述用来模拟的被加壳程序的副本,不改变原有的被加壳程序;
步骤212:外壳工具对读取得到的多个模拟运行信息进行分析和比较,查看模拟运行效果,选择保护方案。
在本实施例中,由于模拟运行信息具体为计数信息,因此通过计数信息可以知道实际运行上述被加壳程序时各个被分析出来的连续代码段被调用的次数,从而可以明确模拟运行的效果,例如当某个连续代码段对应的计数信息为0时,则表示该连续代码段没有被调用,将该连续代码段放在加密锁内的作用不大,当某个连续代码段对应的计数信息达到1000时,则表示该连续代码段被调用的次数太多,将其放在加密锁内可以能影响效率,因此可以根据具体需求按照各个连续代码段的模拟运行信息来决定将哪个连续代码段放在加密锁内。
本实施例提供了一种模拟软件运行的方法,通过该方法预先模拟各种保护方案,并自动分析模拟得到的相关数据,提供评定保护效果,并且在模拟过程中可预先处理保护信息,提升最终真正保护软件的效率,进一步实现了透明的软件保护,提高了效率,节约了资源,方便直观得选择最合适的保护方案。
实施例3
本实施例提供了又一种模拟软件运行功能的方法,在本实施例中,将分析得到的指令序列放入软加密锁中,在被加壳程序的副本的具体位置插入对软加密锁的调用指令,并通过对软加密锁的调用来实现模拟软件运行。
参见图3,又一种模拟软件运行功能的方法,具体实现如下:
步骤301:外壳工具接收用户输入的对被加壳程序进行分析的信息,调用入口函数准备对被加壳程序进行分析;
在本实施例中,入口函数具体为OnAppOperateAnalyseIl()。
步骤302:外壳工具在上述被加壳程序中查找出所有的连续的指令序列,若查找到连续的指令序列,则执行步骤303,否则提示出错;
其中,指令序列具体可以为运算指令序列、常量加载指令序列、局部变量加载指令序列和局部变量存储指令序列;
在本实施例中,在被加壳程序中查找连续的指令序列的方法与实施例1中所说的方法一致,在此不再重复。
步骤303:判断上述所有的连续的指令序列中是否存在其所访问的局部变量的类型为卡片中所支持类型的连续的指令序列,若是,则执行步骤304,否则提示出错;
步骤304:判断将上述满足步骤303的条件的指令序列分别组装成卡内服务后得到的堆栈中是否存在平衡的堆栈,若否,则提示出错,若是,则执行步骤305;
步骤305:判断上述满足步骤304的条件的指令序列是否为其他指令的跳转目的地,若是,则返回到步骤302继续在被加壳程序中查找连续的指令序列,若否,则执行步骤306;
在本实施例中,判断上述连续指令序列是否为其他指令的跳转目的地的方法与实施例1中的方法相似,在此不再重复;
具体地,本实施例中的步骤302-步骤305具体为对被加壳程序进行分析的步骤,通过上述步骤就可以分析出满足条件的指令序列,并且步骤302-步骤305的4个步骤之间的执行可以是没有顺序的,本实施例中为了提高对加壳程序的分析的效率,选择了顺序执行步骤302-步骤305,但不以此执行顺序为限制;
进一步地,本实施例中对被加壳程序进行分析的方法还可以如实施例2中所述相同,即从被加壳程序中查找连续的指令序列,每查找到一个指令序列就判断该指令序列是否满足步骤303至步骤305所说的条件,如果不满足,则继续查找下一个连续的指令序列,并对该指令序列进行判断,若满足则记录下该指令序列的具体位置,并判断是否已查找完上述被加壳程序,若否,则继续查找下一个连续的指令序列,并进行判断,若是,则执行步骤307;
具体地,在实际操作中经过分析满足上述条件的连续的指令序列一般要大于一个。
步骤306:记录下满足上述条件的连续的指令序列的具体位置;
步骤307:生成一个被加壳程序的副本,在被加壳程序的副本的上述具体位置插入对软加密锁的调用语句;
在本实施例中,由于具体位置可以是分析得到的指令序列的起始位置或终止位置,因此可以是在指令序列的起始位置插入对软加密锁的调用语句,也可以是在指令序列的终止位置插入对软加密锁的调用语句;
其中插入的对软加密锁的调用语句具体为:call Fun2();
具体地,当分析得到有多个连续的指令序列都满足条件时,则步骤306中会相应地记录下多个具体位置,因此本步骤中外壳工具根据用户的选择在被加壳程序的副本的相应的具体位置上插入对软加密锁的调用语句,其中用户可以选择一个具体位置,也可以选择多个具体位置;
并且本实施例中可以在步骤307生成被加壳程序的副本,也可以在步骤302判断被加壳程序中是否存在连续的指令序列之前生成被加壳程序的副本,相应地,步骤302至步骤305也可以是对被加壳程序的副本进行分析;
在本实施例中,软加密锁实现的功能与实施例1中的动态库实现的功能是一样的,并且软加密锁中有一个固定的方法,每次调用软加密锁时时则调用该方法,该方法中有具体的参数,并且外壳工具将需要调用的方法的相关内容以参数的形式通过软加密锁提供的接口传给上述软加密锁中的方法,这样就可以对上述软加密锁中的方法中的参数进行设置,从而可以将上述软加密锁中的方法模拟为将不同的连续的指令序列组装成锁内服务后的方法,因此不同参数的上述方法就表示将不同的连续的指令序列组装成锁内服务后的方法,这样通过对上述代码段的执行就可以模拟为对加密锁内的组装成卡内服务的方法的执行,而不用实际的将连续的指令序列放入加密锁中,在访问加密锁前就可以预先知道相应的效果;
进一步地,当上述软加密锁被调用时,软加密锁中的函数会判断是否存在预先约定名称的文件,若不存在,则创建一个预先约定名称的文件,若存在,则打开上述预先约定名称的文件,其中预先约定名称的文件是用来与外壳工具之间进行传递有关模拟运行的相关信息,具体地,也可以如实施例1中所说的通过共享内存来记录有关模拟运行的相关信息,通过共享内存与外壳工具之间进行传递;
步骤308:外壳工具启动并运行上述插入对软加密锁的调用语句之后的被加壳程序的副本,进行模拟运行,并且在运行时调用软加密锁;
在本实施例中,当上述软加密锁被调用时,软加密锁中的函数会判断是否存在预先约定名称的文件,若不存在,则创建一个预先约定名称的文件,并在文件中记录下模拟运行信息;若存在,则打开预先约定名称的文件,在文件中记录下模拟运行信息;
具体地,本实施例中,软加密锁中的函数直接打开预先约定名称的文件,并在软加密锁中的方法每被调用一次时,根据该方法中的参数查找该方法在共享内存中的对应位置,并将对应位置的计数信息加1,表示设为该参数的方法再一次被调用。
步骤309:运行结束后,外壳工具从文件中读取模拟运行信息并显示在界面上;
在本实施例中,模拟运行信息具体为计数信息。
步骤310:外壳工具删除上述用来模拟的被加壳程序的副本,不改变原有的被加壳程序;
步骤311:外壳工具对读取得到的多个模拟运行信息进行分析和比较,查看模拟运行效果,选择保护方案。
在本实施例中,对多个模拟运行信息进行分析和比较的操作具体为:由于模拟运行信息具体为计数信息,因此通过计数信息可以知道实际运行上述被加壳程序时各个被分析出来的连续代码段被调用的次数,从而可以明确模拟运行的效果,例如当某个连续代码段对应的计数信息为0时,则表示该连续代码段没有被调用,将该连续代码段放在加密锁内的作用不大,当某个连续代码段对应的计数信息达到1000时,则表示该连续代码段被调用的次数太多,将其放在加密锁内可以能影响效率,因此可以根据具体需求按照各个连续代码段的模拟运行信息来决定将哪个连续代码段放在加密锁内。
本实施例提供了一种模拟软件运行的方法,通过该方法预先模拟各种保护方案,并自动分析模拟得到的相关数据,提供评定保护效果,并且在模拟过程中可预先处理保护信息,提升最终真正保护软件的效率,进一步实现了透明的软件保护,提高了效率,节约了资源,方便直观得选择最合适的保护方案。

Claims (16)

1.一种模拟软件运行的方法,其特征在于,所述方法包括:
对被加壳程序进行分析,查找出满足条件的指令序列,记录下所述指令序列在所述被加壳程序中的具体位置;
在被加壳程序的副本的所述具体位置上插入相关语句;
启动并运行所述插入相关语句后的被加壳程序的副本,进行模拟运行,并且相关语句在执行时记录模拟运行信息;
读取模拟运行信息,进行分析和比较,查看模拟运行效果,选择保护方案。
2.如权利要求1所述的模拟软件运行的方法,其特征在于,所述对被加壳程序进行分析,查找出满足条件的指令序列的方法具体为:
从所述被加壳程序中查找出所有的连续的指令序列;
若没有查找到,则提示出错;
若查找到,则判断所述所有的连续的指令序列中是否存在连续的指令序列满足其所访问的局部变量的类型为卡片中所支持的类型、将其组装成卡内服务后得到的堆栈是平衡的以及所述连续的指令序列不为其他指令的跳转目的地这三个条件,若不存在,则提示出错,若存在,则所述连续的指令序列即为满足条件的指令序列。
3.如权利要求1所述的模拟软件运行的方法,其特征在于,所述对被加壳程序进行分析,查找出满足条件的指令序列的方法具体为:
从所述被加壳程序中查找出一个连续的指令序列;
若没有查找到,则提示出错;
若查找到,则判断所述连续的指令序列中是否满足其所访问的局部变量的类型为卡片中所支持的类型、将其组装成卡内服务后得到的堆栈是平衡的以及所述连续的指令序列不为其他指令的跳转目的地这三个条件,若不满足,则继续在所述被加壳程序中查找下一个连续的指令序列,并进行判断,若满足,则所述连续的指令序列为满足条件的指令序列。
4.如权利要求3所述的模拟软件运行的方法,其特征在于,在记录下所述指令序列在所述被加壳程序中的具体位置之后,在被加壳程序的副本的所述具体位置上插入相关语句之前,所述方法还包括:
判断是否已查找完所述被加壳程序;
若否,则继续在所述被加壳程序中查找下一个连续的指令序列,并进行判断;
若是,则在被加壳程序的副本的所述具体位置上插入相关语句。
5.如权利要求1所述的模拟软件运行的方法,其特征在于,所述插入的相关语句具体为:对动态库的调用语句。
6.如权利要求5所述的模拟软件运行的方法,其特征在于,所述动态库中包含一个方法,通过对所述方法的参数进行设置将所述方法模拟为将不同的连续的指令序列组装成锁内服务后的方法。
7.如权利要求1所述的模拟软件运行的方法,其特征在于,所述插入的相关语句具体为:跳转语句。
8.如权利要求7所述的模拟软件运行的方法,其特征在于,所述跳转语句具体用于跳转到在插入跳转语句时嵌入到所述被加壳程序的副本中的代码段,所述代码段中包含一个方法,通过对所述方法的参数进行设置将所述方法模拟为将不同的连续的指令序列组装成锁内服务后的方法。
9.如权利要求1所述的模拟软件运行的方法,其特征在于,所述插入的相关语句具体为:对软加密锁的调用语句。
10.如权利要求9所述的模拟软件运行的方法,其特征在于,所述软加密锁中包含一个方法,外壳工具将需要调用的方法的相关内容以参数的形式通过所述软加密锁提供的接口传给所述方法,并对所述方法的参数进行设置,从而将所述方法模拟为将不同的连续的指令序列组装成锁内服务后的方法。
11.如权利要求5所述的模拟软件运行的方法,其特征在于,所述记录模拟运行信息的方法具体为:所述动态库中的函数将所述模拟运行信息记录在预先约定名称的共享内存中。
12.如权利要求5所述的模拟软件运行的方法,其特征在于,所述记录模拟运行信息的方法具体为:所述动态库中的函数将所述模拟运行信息记录在预先约定名称的文件中。
13.如权利要求7所述的模拟软件运行的方法,其特征在于,所述记录模拟运行信息的方法具体为:所述嵌入的代码段中的函数将所述模拟运行信息记录在预先约定名称的共享内存中。
14.如权利要求7所述的模拟软件运行的方法,其特征在于,所述记录模拟运行信息的方法具体为:所述嵌入的代码段中的函数将所述模拟运行信息记录在预先约定名称的文件中。
15.如权利要求9所述的模拟软件运行的方法,其特征在于,所述记录模拟运行信息的方法具体为:所述软加密锁中的函数将所述模拟运行信息记录在预先约定名称的共享内存中。
16.如权利要求9所述的模拟软件运行的方法,其特征在于,所述记录模拟运行信息的方法具体为:所述软加密锁中的函数将所述模拟运行信息记录在预先约定名称的文件中。
CN 201010214123 2010-06-29 2010-06-29 一种模拟软件运行的方法 Active CN102012858B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN 201010214123 CN102012858B (zh) 2010-06-29 2010-06-29 一种模拟软件运行的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN 201010214123 CN102012858B (zh) 2010-06-29 2010-06-29 一种模拟软件运行的方法

Publications (2)

Publication Number Publication Date
CN102012858A true CN102012858A (zh) 2011-04-13
CN102012858B CN102012858B (zh) 2012-12-12

Family

ID=43843034

Family Applications (1)

Application Number Title Priority Date Filing Date
CN 201010214123 Active CN102012858B (zh) 2010-06-29 2010-06-29 一种模拟软件运行的方法

Country Status (1)

Country Link
CN (1) CN102012858B (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111708704A (zh) * 2020-06-19 2020-09-25 腾讯科技(深圳)有限公司 一种云真机测试方法、装置、终端及存储介质
CN112445522A (zh) * 2019-09-02 2021-03-05 中科寒武纪科技股份有限公司 指令跳转方法、相关设备及计算机可读介质
CN114461306A (zh) * 2022-04-13 2022-05-10 飞腾信息技术有限公司 运行软件的方法、装置及机器可读存储介质

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108052370B (zh) * 2017-10-09 2021-06-08 华南理工大学 一种基于伴随程序组的共享内存对程序执行时间影响的评估方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20030221116A1 (en) * 2002-04-15 2003-11-27 Core Sdi, Incorporated Security framework for protecting rights in computer software
CN1749915A (zh) * 2005-10-19 2006-03-22 北京飞天诚信科技有限公司 从软件中提取部分代码至加密装置中的软件版权保护方法
CN101387970A (zh) * 2008-10-30 2009-03-18 上海交通大学 利用剖分信息生成超级块的方法
CN101561777A (zh) * 2008-04-14 2009-10-21 中兴通讯股份有限公司 一种实现覆盖率测试的系统和方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20030221116A1 (en) * 2002-04-15 2003-11-27 Core Sdi, Incorporated Security framework for protecting rights in computer software
CN1749915A (zh) * 2005-10-19 2006-03-22 北京飞天诚信科技有限公司 从软件中提取部分代码至加密装置中的软件版权保护方法
CN101561777A (zh) * 2008-04-14 2009-10-21 中兴通讯股份有限公司 一种实现覆盖率测试的系统和方法
CN101387970A (zh) * 2008-10-30 2009-03-18 上海交通大学 利用剖分信息生成超级块的方法

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112445522A (zh) * 2019-09-02 2021-03-05 中科寒武纪科技股份有限公司 指令跳转方法、相关设备及计算机可读介质
CN111708704A (zh) * 2020-06-19 2020-09-25 腾讯科技(深圳)有限公司 一种云真机测试方法、装置、终端及存储介质
CN111708704B (zh) * 2020-06-19 2024-05-17 腾讯科技(深圳)有限公司 一种云真机测试方法、装置、终端及存储介质
CN114461306A (zh) * 2022-04-13 2022-05-10 飞腾信息技术有限公司 运行软件的方法、装置及机器可读存储介质

Also Published As

Publication number Publication date
CN102012858B (zh) 2012-12-12

Similar Documents

Publication Publication Date Title
US6609248B1 (en) Cross module representation of heterogeneous programs
CN110990020A (zh) 一种软件编译方法、装置及电子设备和存储介质
US7568195B2 (en) Determining a maximal set of dependent software updates valid for installation
KR101143027B1 (ko) 자기 기술적 소프트웨어 이미지 업데이트 컴포넌트
CN1160626C (zh) 基于标记的链接
US7721253B2 (en) Software development support system
US20040049768A1 (en) Method and program for compiling processing, and computer-readable medium recoding the program thereof
US20080052693A1 (en) Method of simd-ization through data reshaping, padding, and alignment
CN102012858B (zh) 一种模拟软件运行的方法
EP0962859A2 (en) Global register systems, methods, and computer program products
WO2005083565A2 (en) Method and system for performing link-time code optimization without additional code analysis
RU2005126695A (ru) Система и способ для выбора режимов выполнения тестового примера для автоматизации повторно выполняемого тестирования
CN107436787A (zh) 资源处理方法、装置、存储介质和电子装置
WO2010010678A1 (ja) プログラム最適化方法
CN102270128A (zh) 库一致性检查器
CN103631573A (zh) 可迁移函数执行时间的获得方法及系统
US6185578B1 (en) Program creation apparatus, program creation method, and recording medium containing a software program for implementing the method
US7661098B2 (en) Computer program optimization in a dynamic compilation environment
CN107526679A (zh) 自动化测试框架、基于其上的自动化测试方法、存储介质和计算机设备
CN108897588B (zh) 一种用于模块间通信的路由方法和路由装置
US20080196009A1 (en) Apparatus and method for componentizing legacy system
Štolba et al. Privacy leakage of search-based multi-agent planning algorithms
CN116841564B (zh) 一种数据处理方法、装置、设备以及计算机可读存储介质
US5946493A (en) Method and system in a data processing system for association of source code instructions with an optimized listing of object code instructions
CN106557305B (zh) 一种自动回放Android程序的方法及系统

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
ASS Succession or assignment of patent right

Owner name: BEIJING JIANSHI CHENGXIN TECHNOLOGIES CO., LTD.

Free format text: FORMER OWNER: FEITIAN TECHNOLOGIES CO., LTD.

Effective date: 20141203

C41 Transfer of patent application or patent right or utility model
TR01 Transfer of patent right

Effective date of registration: 20141203

Address after: 100085 Beijing city Haidian District Xueqing Road No. 9 Ebizal building B building room 205

Patentee after: Beijing Jianshi Chengxin Technologies Co., Ltd.

Address before: 100085 Beijing city Haidian District Xueqing Road No. 9 Ebizal building B block 17 layer

Patentee before: Feitian Technologies Co., Ltd.