首页
社区
课程
招聘
ASProtect SKE 2.2 SDK中的API修复
发表于: 2006-7-10 20:22 60054

ASProtect SKE 2.2 SDK中的API修复

2006-7-10 20:22
60054

【文章标题】: ASProtect SKE 2.2 SDK中的API修复
【文章作者】: kanxue
--------------------------------------------------------------------------------
【详细过程】

   有关ASProtect的SDK,近期论坛不少文章涉及到了,如cyto的文章(本文一些补丁代码参考了cyto文章)。SDK的修复VolX、shoooo等大侠更是轻车熟路。这2天也学习了一下SDK修复,有少许心得,现拿出来希望大家帮忙指正一下。

    ASProtect的SDK种类比较多,本文主要介绍如何修复ASProtect自带的一些API,如GetHardwareID,CheckKeyAndDecrypt,GetRegistrationKeys,GetModeInformation,GetRegistrationInformation 等。  
    学习SDK最好的方法是将ASProtect的帮助文档看一遍,并结合其样例掌握用法。

1.准备工作

   本文以ASProtect自带的样例Examples\Reg Trial\VC\ 来讨论。为了降低难度,我将样例中的REG_CRYPT_BEGIN1与REG_CRYPT_END1注释掉,这对标签是加密代码的,无key代码就不能解密,当然有key还得修复这段代码,修复方法类似stolen OEP。


//REG_CRYPT_BEGIN1 //注释掉,不加密如下代码
strcpy( caption, "Registered version!" );
SetWindowText( hwnd, caption );
GetModeInformation( 0, &ModeName, &mode_status );
SetWindowText( GetDlgItem(hwnd,IDCANCEL), "Close" );
ShowWindow(GetDlgItem(hwnd,IDC_BUYNOW), SW_HIDE);
ShowWindow(GetDlgItem(hwnd,IDC_REG_BUTTON), SW_HIDE);
wsprintf( buffer,"Key: %s\nName: \t\t%s\nMode Name: \t%s",UserKey, UserName, ModeName );
SetDlgItemText(hwnd, IDC_TEXT, buffer);
//REG_CRYPT_END1 //注释掉

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (93)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
第一个学习。
2006-7-10 20:35
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
3
学习!
2006-7-10 20:37
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
4
学习!
2006-7-10 20:38
0
雪    币: 196
活跃值: (2224)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
学习
2006-7-10 20:39
0
雪    币: 303
活跃值: (466)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
还是学习
2006-7-10 20:41
0
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
7
对于好文是不顶不行了
2006-7-10 20:42
0
雪    币: 313
活跃值: (250)
能力值: ( LV9,RANK:650 )
在线值:
发帖
回帖
粉丝
8
我说我第二个学习呢,没想到看完了,一下到了第八楼了
2006-7-10 20:44
0
雪    币: 378
活跃值: (247)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持,学习中!
2006-7-10 20:44
0
雪    币: 236
活跃值: (100)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
10
学习并不断成长ing.............
2006-7-10 21:07
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
11
好文不断~
2006-7-10 22:09
0
雪    币: 417
活跃值: (475)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
12
看完后有一种茅塞顿开的感觉。
坛主的这篇文章真是及时雨。
谢谢!
2006-7-10 22:27
0
雪    币: 146
活跃值: (33)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
收藏!!!!
2006-7-10 23:10
0
雪    币: 222
活跃值: (401)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
老大的文章每次都有一种里程碑似的指导意义,学习了。
2006-7-11 00:07
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
此时EAX=1,结合源码及ASProtect帮助文档,可以猜出这个是GetRegistrationInformation。
用这种方法就可确定其他几个函数:

都用猜来判断下面的API吗?
2006-7-11 01:01
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
16
最初由 血草 发布

都用猜来判断下面的API吗?


经验很重要,根据参数及返回值来判断。
2006-7-11 08:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
顶,学习中!!!
2006-7-11 10:31
0
雪    币: 690
活跃值: (1826)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
18
最初由 kanxue 发布
经验很重要,根据参数及返回值来判断。

做个通用版本的api ida签名,也许更容易些。
2006-7-11 12:53
0
雪    币: 210
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
看学老大就是牛,学习收藏
2006-7-11 13:03
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
20
由KANXUE版主的教程看来,GetRegistrationInformation是ASP SDK中一个重要函数,
几乎每一个用到SDK的程序都要修复这个函数(由源代码可见,它是第一个被调用的)
但是,对于 构造 GetRegistrationInformation函数的参数及返回值
有一点不解:

以下是源代码:

  GetRegistrationInformation( 0, &UserKey,  &UserName );

  if ((UserKey != NULL) && (strlen(UserKey) > 0))
  {


GetRegistrationInformation这个函数并没有返回值,后面的判断也没用到返回值,
只是用到UserKey,为什么构造 GetRegistrationInformation函数的参数及返回值时要有个返回值 MOV EAX,1


00404A41         mov     eax, [esp+8]
00404A45         mov     dword ptr [eax], 00404A5E        ;  ASCII "78787878" //参数Key
00404A4B         mov     eax, [esp+C]
00404A4F         mov     dword ptr [eax], 00404A68        ;  ASCII "pediy"   //参数Name
00404A55         mov     eax, 1                           //返回值
00404A5A         retn    0C



确实有点不解,在ASProtect help中,作者的例子是:


 For Delphi:  
 
  
 
 Var  
 
   Key  : PChar;  
 
   Name : PChar;  
 
  
 
 begin  
 
   GetRegistrationInformation( 0, Key, Name );  
 
   MessageBox(0,StrPas(Key) + #13#10 + StrPas(Name),'Key/Name:',0);  
 
 end;   
 
  
 
 For C++:  
 
  
 
 {  
 
 char* Key = "";  
 
 char* Name = "";  
 
  
 
 GetRegistrationInformation( 0, &Key, &Name );  
 
 printf( " Key: %s\n Name: %s\n", Key, Name );  
 
 }  



也没用到返回值
2006-7-12 18:08
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
21
最初由 海风月影 发布
对于 构造 GetRegistrationInformation函数的参数及返回值 有一点不解:


你跟踪加壳程序,带key与不带key都跟一下,你会发现有key时这函数返回1,否则返回0.
当然此例中返回任何值都不影响程序功能。
2006-7-12 18:16
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
22
最初由 kanxue 发布
你跟踪加壳程序,带key与不带key都跟一下,你会发现有key时这函数返回1,否则返回0.
当然此例中返回任何值都不影响程序功能。


也就是说,可以把程序写出这样了:


IsReg=GetRegistrationInformation( 0, &UserKey,  &UserName );

  if (IsReg) 
 {
  ...
 }



去试试看
2006-7-12 22:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
跟着老大的文章练习,很受益!
2006-7-13 22:49
0
雪    币: 313
活跃值: (250)
能力值: ( LV9,RANK:650 )
在线值:
发帖
回帖
粉丝
24
#include "stdafx.h"
#include "resource.h"
#include <shellapi.h>
#include "include/aspr_api.h"
#include "include/asprotect.h"
#pragma comment(lib,"include/aspr_ide.lib")
kanxue楼主这几个文件在哪找?
2006-7-14 01:33
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
2006-7-14 02:02
0
游客
登录 | 注册 方可回帖
返回
//