首页
社区
课程
招聘
[分享]IDA dump ASM code + FlexLM SDK编译生成带VSTRING验证的licgen
发表于: 2013-4-6 15:36 21952

[分享]IDA dump ASM code + FlexLM SDK编译生成带VSTRING验证的licgen

2013-4-6 15:36
21952

IDA dump ASM code +  FlexLM SDK编译生成带VSTRING验证的licgen

首先,感谢论坛里帮助过我的朋友,恕不一一列举:)

花了不少时间研究并最终做出注册机,这里只是与有兴趣的朋友分享下,高手请飘过:)

工具:IDA5.5, RadASM2.2.1.9, FlexLM SDK 11.4, VC2003或VC2008

目标:用FlexLM SDK开发带VSTRING的licgen(license格式如下)
SERVER hostname 12345678
DAEMON testlmd ./testlmd
INCREMENT feature_name testlmd 2013.6 16-dec-2013 1 \
    1234567812345678abcd VSTRING=XXXXXXXXXXXXXXXXXXXX

一. 如何开发程序vstring_crypt
1. 读懂应用程序中VSTRING的产生算法后,编写C程序
2. 参照《C++反汇编与逆向分析技术揭秘》一书第17章“反汇编代码的重建与编译”,读懂应用程序中VSTRING的产生算法后,将产生VSTRING的子程序用IDA反汇编后dump成ASM代码,编译成vstring_crypt.obj文件,编译FlexLM SDK时调用vstring_crypt.obj

本人C编程功力不够,所以采用方法2.

关于从IDA中dump出ASM code,可以参考
<1> 从IDA中提取代码做汇编注册机之C/C++篇
    http://bbs.pediy.com/showthread.php?t=36799
<2> 从IDA中提取代码做汇编注册机之VB篇
    http://bbs.pediy.com/showthread.php?t=36400
<3> 《C++反汇编与逆向分析技术揭秘》一书第17章“反汇编代码的重建与编译”
<4> erfaren关于IDA反汇编的几篇文章(原文是俄文的,可以用google chrom浏览器翻译成英文)
    66dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3g2J5k6X3q4J5k6h3&6Q4x3X3g2F1j5i4u0G2k6q4)9J5k6i4u0#2i4K6u0r3b7i4y4E0i4K6u0r3j5i4y4E0i4K6u0W2K9s2c8E0
<5> IDA反出来的ZeroAdd源代码稍作修改后,编译通过
    http://bbs.pediy.com/showthread.php?t=17347

关于ASM
<1> 编译时加入/Zm选项,Enable MASM 5.10 compatibility
<2> .model flat, C => 此处需用C选项,否则VC LINK时会报找不到vstring_crypt
<3> EXTRN _alloca_probe:PROC => 库函数在C编译后会在函数名前加"_",所以需将IDA反汇编出来的"__alloca_probe"修改为“_alloca_probe”
<4> uni.ini => 参照erfaren的文章
        unicode macro page,string,zero
                irpc c,<string>
                db '&c', page
                endm
                ifnb <zero>
                dw zero
                endif
        endm
<5> IDA的版本与产生的ASM code似乎有些关联,从已有版本的测试结果看IDA5.5出来的结果编译错误较少

二. FlexLM SDK编译
假设VSTRING与feature_name和license版本等等相关
1. VSTRING产生的程序命名为vstring_crypt, 修改SDK(lmcrypt.c)将vstring_crypt的输出作为lc_cryptstr的输入
extern char * vstring_crypt (char *);
......
vstring = (char *)vstring_crypt((char *)str);
if (lc_cryptstr(lm_job, vstring, &ofile_str, /*&v*/code,
      forceit, ifname, &err))
{
  ......
}

2. VC LINK时加入vstring_crypt.obj
LINK /nologo /NODEFAULTLIB /OPT:NOREF  /out:lmcrypt.exe lmcrypt.obj lmgr.lib libsb.lib libcrvs.lib .\activation\lib\libnoact.lib oldnames.lib kernel32.lib user32.lib netapi32.lib  advapi32.lib  gdi32.lib comdlg32.lib  comctl32.lib wsock32.lib libcmt.lib vstring_crypt.obj

或者修改i86_n3\makefile
LD = LINK /nologo /NODEFAULTLIB /OPT:NOREF $(LDFLAGS) vstring_crypt.obj


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (19)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习下,看看能学到东西不
2013-4-6 18:30
0
雪    币: 341
活跃值: (153)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
嘿嘿。带走。。。
2013-4-6 20:10
0
雪    币: 1925
活跃值: (906)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
4
呵呵,不错,标记。。。
2013-4-7 00:49
0
雪    币: 211
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
Thanks for Information.......
2013-4-8 12:45
0
雪    币: 493
活跃值: (309)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
2013.4.15: share asm code and lmcrypt file with daemon 'testlmd' for reference.
2013-4-15 13:18
0
雪    币: 228
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
testlmd.exe没有啊。附上来呢,crack玩下。
2013-4-20 20:54
0
雪    币: 493
活跃值: (309)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
8
请见附件......
上传的附件:
2013-4-20 22:17
0
雪    币: 493
活跃值: (309)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
9
谢谢kanxue老大加精鼓励:-)
2013-4-20 22:48
0
雪    币: 228
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
在testlmd里找出加密seed
0x12345678
0x9abcdef0

先编出一般的lmcrypt,在许可里加了个f1,签后用daemon可以启动

INCREMENT f1 testlmd 2013.6 31-dec-2016 1 AE221735057DBD49B89F \
        VENDOR_STRING=00000000 SIGN2=F5E63BAE83723880

你的daemon似乎没有用 ls_user_crypt 嘛。
2013-4-21 17:31
0
雪    币: 493
活跃值: (309)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
bigcathua兄好,

首先谢谢兄关注我的帖子:)

通常VSTRING含的附加验证,都不包含在守护进程中,所以testlmd.exe里的确没有含VSTRING的验证。从实战的角度而言,如果能从lmcrypt_vstring_crypt_testlmd中dump出关键代码并编译重建lmcrypt,与实际的crack相比,过程和方法上基本上是一样的。

另外,兄提到ls_user_crypt,不知是不是指的是这个http://bbs.pediy.com/showthread.php?t=134717,如果是的话,那与这个帖子的VSTRING用的是不一样的方法哦。
2013-4-22 09:18
0
雪    币: 2990
活跃值: (2764)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这个软件做什么用的呀?
2013-4-22 17:13
0
雪    币: 228
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
ls_user_crypt 不是你那篇文章里所说的 ls_a_user_crypt_filter。
ls_a_user_crypt_filter 是用lmrand1生成的。
ls_user_crypt 是由用户自己定义的一个加密函数。

我是认为daemon应该也是要有VendorString的验证处理的,否则lmcrypt出来的许可daemon怎么验证?
2013-4-22 23:16
0
雪    币: 228
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
呵呵,附件本身无任何用。只是在研究一个问题。
2013-4-22 23:18
0
雪    币: 493
活跃值: (309)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
15
一般在应用程序端验证的,当然也可以在daemon里验证,我C编程不强,bigcathua兄如果有兴趣的话,可否帮忙加到daemon里?

这里的VSTRING是个标准的CRC32算法,以下面的license为例,

SERVER hostname 12345678 1006
DAEMON testlmd ./testlmd
INCREMENT test_feature testlmd 2013.6 31-dec-2016 8 \
        1E8287671DC9B3902366 VENDOR_STRING=606609E0 \
        SIGN2=6B026C2641DC4D60

CRC32的输入为: test_feature2013.631-dec-20168e27712345678
用CRC32算法器可以验证VSTRING为:606609E0

关于e277,请参看http://bbs.pediy.com/showthread.php?t=99373
上传的附件:
2013-4-23 10:00
0
雪    币: 493
活跃值: (309)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
16
帖子里的例子是我自己搭建供参考用的,只是探讨下VSTRING算法的逆向,并编译到lmcrypt的一种方法,并不对应具体的软件。
2013-4-23 10:06
0
雪    币: 161
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
强。。。学习
2013-4-30 16:14
0
雪    币: 102
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
非常不错,学习一下
2013-5-9 15:42
0
雪    币: 1
活跃值: (161)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
非常不错了,细心研究一下。
2018-5-4 12:57
0
雪    币: 1251
活跃值: (4685)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
学习了 感谢分享
2020-4-18 11:14
0
游客
登录 | 注册 方可回帖
返回