#define LM_PUBKEYS 3
#define LM_MAXPUBKEYSIZ 40
#define LM_MAXSIGNS 4 /* SIGN=, SIGN2=, SIGN3=, SIGN4= */
#define LM_MAX_BEH_VER 4
typedef struct _pubkeyinfo
{
int pubkeysize[LM_PUBKEYS];
unsigned char pubkey[LM_PUBKEYS][LM_MAXPUBKEYSIZ];
int (*pubkey_fptr)();
int strength;
int sign_level;
} LM_VENDORCODE_PUBKEYINFO;
typedef struct _vendorcode
{
short type;
unsigned long data[2];
unsigned long keys[4];
short flexlm_version;
short flexlm_revision;
char flexlm_patch[2];
char behavior_ver[LM_MAX_BEH_VER + 1];
unsigned long trlkeys[2];
int signs;
int strength;
int sign_level;
LM_VENDORCODE_PUBKEYINFO pubkeyinfo[LM_MAXSIGNS];
} VENDORCODE;
....................
static unsigned int l_2078index = 16; //0x10, 静态存储
....................
Static int l_n36_buf
(
char *buf;
VENDORCODE *v;
unsigned int l_buf_13;
unsigned char *l_ctr_17;
unsigned int l_8indexes;
unsigned int *l_18index;
char *buf2
);
{
......................
//第一处Flag的位置
if (l_18index) *l_18index = 1;
.............................
//第二处Flag的位置
if (l_4counters == 0) v->pubkeyinfo[0].pubkeysize[0] += (l_2078index << 0);
................................
}
对应如下近似代码(每个程序有差别):
第一处Flag的位置
cmp [ebp+arg_14], 0
jz short loc_xxxx
mov eax, [ebp+arg_14]
mov dword ptr [eax], 1 //有的程序为2
第二处Flag的位置
cmp ds:?l_4counters@?1??l_counters_1@@9@9, 0 ; `l_counters_1'::`2'::l_4counters
jnz short loc_xxxx
mov eax, [ebp+Dst]
mov ecx, [eax+3Ch]
add ecx, _l_2078index //找到静态存储位置:0x10-->0x00
mov edx, [ebp+Dst]
mov [edx+3Ch], ecx
- 标 题:去FLEXLM/NET ECC标志,强行12位SIGN验证
- 作 者:wztuxw
- 时 间:2009-02-17 13:50
- 链 接:http://bbs.pediy.com/showthread.php?t=82230