首页
社区
课程
招聘
[分享]IDA_Patch_KEYGEN源码
2023-12-1 22:37 5527

[分享]IDA_Patch_KEYGEN源码

2023-12-1 22:37
5527

授人以鱼不如授人以渔,论坛没搜到源码,找了半天的ida_keygen源码,以及简单研究了下原理,目前的IDA_KEYGEN来自两位大神,一个TOM_RUS, 一个CZC, 但他们的代码原理是一样的,下面来自CZC源码里readme说明

1
2
3
4
5
6
7
8
9
10
IDA uses RSA-1024 for its key signatures and without the private key you
cannot make valid keys. So what I did was to generate a new pair of
public/private keys with a modulus close to the original. The two RSA
modulus differ by just one byte. This was important because IDA checks the
validity of the modulus and private key but it only compares the first and
last bytes. This allows one to patch just one byte in the IDA library and
have complete control of the license. This works for all OS versions: Mac,
Linux and Windows. I'm sure that after this keygen is published (last IDA
version is now 7.3) better checks will be incorporated and the binaries
will have to be patched more extensively.

也就是IDA使用了RSA-1024(128字节)加密,并且只检查模数和私钥的第一字节和最后一字节,keygen的原理就是找到一对公私钥,让模数接近于原始值,满足检查。
RSA算法原理网上很多,比如
https://blog.csdn.net/weixin_43408952/article/details/124696147
这里模数N在历代IDA产品里没变(ida.dll/ida64.dll),如下

1
2
3
4
5
6
7
8
9
10
11
mod_rsa[] = {
  0xed, 0xfd, 0x42, 0x5c, 0xf9, 0x78, 0x54, 0x6e, 0x89, 0x11, 0x22, 0x58, 0x84,
  0x43, 0x6c, 0x57, 0x14, 5, 0x25, 0x65, 0xb, 0xcf, 0x6e, 0xbf, 0xe8, 0xe,
  0xdb, 0xc5, 0xfb, 0x1d, 0xe6, 0x8f, 0x4c, 0x66, 0xc2, 0x9c, 0xb2, 0x2e, 0xb6,
  0x68, 0x78, 0x8a, 0xfc, 0xb0, 0xab, 0xbb, 0x71, 0x80, 0x44, 0x58, 0x4b, 0x81,
  0xf, 0x89, 0x70, 0xcd, 0xdf, 0x22, 0x73, 0x85, 0xf7, 0x5d, 0x5d, 0xdd, 0xd9,
  0x1d, 0x4f, 0x18, 0x93, 0x7a, 8, 0xaa, 0x83, 0xb2, 0x8c, 0x49, 0xd1, 0x2d,
  0xc9, 0x2e, 0x75, 5, 0xbb, 0x38, 0x80, 0x9e, 0x91, 0xbd, 0xf, 0xbd, 0x2f,
  0x2e, 0x6a, 0xb1, 0xd2, 0xe3, 0x3c, 0xc, 0x55, 0xd5, 0xbd, 0xdd, 0x47, 0x8e,
  0xe8, 0xbf, 0x84, 0x5f, 0xce, 0xf3, 0xc8, 0x2b, 0x9d, 0x29, 0x29, 0xec, 0xb7,
  0x1f, 0x4d, 0x1b, 0x3d, 0xb9, 0x6e, 0x3a, 0x8e, 0x7a, 0xaf, 0x93}

他们找到一对公钥私钥,其中模数N很接近于原始模数,仅仅第4个字节0x5C变为0xCB,所以先patch这两个dll文件中模数,公钥幂指数E=0X13,对应私钥如下:就可以用该私钥生成key文件了

1
2
3
4
5
6
7
8
9
10
11
12
pri_key[] = {
  0x74, 0x98, 2, 0x70, 0x49, 0x14, 0xb, 0x81, 0x15, 0x8d, 0xba, 0xb9, 0x9f,
  0x7e, 0xd0, 2, 0xd1, 0xb9, 0x98, 0xe, 0xb7, 0x32, 0xe8, 0x59, 0x47, 0xe7,
  0xe4, 0xf4, 0x2f, 0x28, 0x32, 0x15, 0x1f, 0xa6, 0x56, 0x2b, 0x67, 0xd4, 0xd8,
  0xa0, 0xa3, 0x22, 0x1e, 0xd1, 4, 0x5d, 0xc0, 0xf0, 0xb9, 0x25, 0x8f, 0xf6,
  0x11, 0xa4, 0xf8, 0xb8, 0xc9, 0x9a, 0xe7, 0x81, 0x99, 0xed, 0x9e, 0x4d, 0xae,
  0xc2, 0xf9, 0x57, 0x9f, 0x3f, 0xf3, 0x1c, 0x79, 0xc4, 0xa2, 0x19, 0xb6, 0xea,
  0xa4, 0, 0x2f, 0x82, 0x35, 0xd8, 0x63, 0x4e, 0x1c, 0x7a, 1, 0xd3, 0x32, 0x57,
  0x1d, 0x71, 0xd, 0x64, 0xdd, 0x64, 0xd4, 0x4d, 0x81, 0x41, 0x26, 0xb7, 0xbf,
  0x8d, 0x60, 0x16, 0x78, 0x45, 0xa5, 0xb1, 0xbe, 0x47, 0xff, 0x68, 0x7b, 0x79,
  0x36, 0x44, 0x13, 0xbb, 0xf3, 0xb7, 0xbb, 0x6a, 0xc8, 0x77
};

这里有个疑问,这对公钥私钥当初是怎么找出来的,然后根据readme说明,IDA只检查第一个字节和最后一个字节,这样我如果用openssl生成RSA公钥私钥,只要模数首尾是0xED,0x93,私钥0x74,0x77是不是就可以了。

附上两位大神源码供参考

2023.12.5

根据大佬帖子的指引,https://bbs.kanxue.com/thread-270822.html.
成功解决了疑问.
原始N:

93AF7A8E3A6EB93D1B4D1FB7EC29299D2BC8F3CE5F84BFE88E47DDBDD5550C3CE3D2B16A2E2FBD0FBD919E8038BB05752EC92DD1498CB283AA087A93184F1DD9DD5D5DF7857322DFCD70890F814B58448071BBABB0FC8A7868B62EB29CC2664C8FE61DFBC5DB0EE8BF6ECF0B65250514576C4384582211896E5478F95C42FDED

它是个合数,要想得到私钥D,必须先找到因子P/Q,然后根据φ(N)=(P-1)*(Q-1)得到φ(N),再由D = 1/E mod (φ(N))得到私钥D,但大数分解为P/Q是很难的,所以已知公钥N/E是没办法拿到D的.

但大佬们找到一个好办法(前提是没有签名,不验证N合法性),更改N(改变一个字节,倒数第四个字节5C-->CB),把N由合数变成一个素数,而素数的φ(N)=N-1 就直接拿到了,再由D = 1/E mod (φ(N))就可以拿到D,直接GAME OVER.

使用RDLP工具测试通过

N1:
93AF7A8E3A6EB93D1B4D1FB7EC29299D2BC8F3CE5F84BFE88E47DDBDD5550C3CE3D2B16A2E2FBD0FBD919E8038BB05752EC92DD1498CB283AA087A93184F1DD9DD5D5DF7857322DFCD70890F814B58448071BBABB0FC8A7868B62EB29CC2664C8FE61DFBC5DB0EE8BF6ECF0B65250514576C4384582211896E5478F9CB42FDED

φ(N1)=N1-1:
93AF7A8E3A6EB93D1B4D1FB7EC29299D2BC8F3CE5F84BFE88E47DDBDD5550C3CE3D2B16A2E2FBD0FBD919E8038BB05752EC92DD1498CB283AA087A93184F1DD9DD5D5DF7857322DFCD70890F814B58448071BBABB0FC8A7868B62EB29CC2664C8FE61DFBC5DB0EE8BF6ECF0B65250514576C4384582211896E5478F9CB42FDEC

E:13

D:7498027049140B81158DBAB99F7ED002D1B9980EB732E85947E7E4F42F2832151FA6562B67D4D8A0A3221ED1045DC0F0B9258FF611A4F8B8C99AE78199ED9E4DAEC2F9579F3FF31C79C4A219B6EAA4002F8235D8634E1C7A01D332571D710D64DD64D44D814126B7BF8D60167845A5B1BE47FF687B79364413BBF3B7BB6AC877

图片描述

附件是提到的工具,其他更多算法工具可以到我的网盘里翻

https://od.cloudsploit.top/zh-CN/tools/Tuts%204%20You%20-%20Collection%202011/Crypto%20Tools/

2024.1.5

今天解决了剩下的疑问,怎么找到这个替换的字节?
借助chatgpt生成代码,循环替换5C验证,很快就能找到当替换为CB时N变为素数 。
python代码见附件,也可以替换其他位置字节(修改position_to_replace = -4)找到符合的素数,做自己的不同的keygen.


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2024-1-5 20:47 被wusha编辑 ,原因: 将27楼帖子合并更新
注:下载本附件需支付 10雪币(note:10 points for downloading this attachment)
上传的附件:
收藏
点赞10
打赏
分享
最新回复 (30)
雪    币: 2140
活跃值: (3523)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
R0g 2 2023-12-1 22:53
2
0
学习一下
雪    币: 11312
活跃值: (4038)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xie风腾 2023-12-2 09:15
3
0

虽然看不懂,但是感觉很强大哟
雪    币: 13465
活跃值: (4793)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 2023-12-2 10:32
4
0
你把这个key放到原版看能用?
雪    币: 5529
活跃值: (16450)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
wusha 2023-12-2 10:40
5
0
大哥,看清下原理,它是替换ida.dll/ida64.dll里的公钥模数N(0x5C-->0xCB),然后就可以使用该配对私钥生成的key文件了
雪    币: 13465
活跃值: (4793)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 2023-12-2 11:39
6
0
wusha 大哥,看清下原理,它是替换ida.dll/ida64.dll里的公钥模数N(0x5C-->0xCB),然后就可以使用该配对私钥生成的key文件了

对,所以呢?

1你的题目应该是IDA patch keygen

2会patch的不说全世界,中国都有n多,只是不想重复第1人的劳动,这是对第1人的尊重!

最后于 2023-12-2 11:46 被tDasm编辑 ,原因:
雪    币: 5529
活跃值: (16450)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
wusha 2023-12-2 11:56
7
1
无语,理解力真是奇葩,我有说是自己弄的吗?我分享的是大神的作品和工作原理,帖子里写的明明白白。。。
雪    币: 13465
活跃值: (4793)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 2023-12-2 12:40
8
0
wusha 无语,理解力真是奇葩,我有说是自己弄的吗?我分享的是大神的作品和工作原理,帖子里写的明明白白。。。
你自己没思维能力写这些?文不对题。2位大神?n个大神!
雪    币: 357
活跃值: (2593)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
KooJiSung 2023-12-2 19:42
9
0
我觉得还是 patch keygen 标题好一点
雪    币: 19410
活跃值: (29069)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-12-2 20:58
10
1
感谢分享
雪    币: 8000
活跃值: (2632)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
layerfsd 4 2023-12-2 22:37
11
1
tDasm 你自己没思维能力写这些?文不对题。2位大神?n个大神!

有毛病吧?你在居高临下的杠什么?楼主只是分享他获取到的知识,也没说其他额外的内容,那么喜欢杠?咋不见你分享啥?已举报。

最后于 2023-12-2 22:39 被layerfsd编辑 ,原因: 改
雪    币: 13465
活跃值: (4793)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 2023-12-3 08:29
12
1
layerfsd tDasm 你自己没思维能力写这些?文不对题。2位大神?n个大神! 有毛病吧?你在居高临下的杠什么?楼主只是分享他获取到的知识,也没说其他额外的 ...

有毛病是你自卑?看不见错误才是你最大错误。指出错误就是杠?你这言论才是真杠,还好意思举报你这无聊逻辑!

最后于 2023-12-3 08:32 被tDasm编辑 ,原因:
雪    币: 5529
活跃值: (16450)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
wusha 2023-12-3 10:40
13
0
两位大佬,别吵打住,我再补充说明下,这个keygen前提是先要patch 公钥,如果是纠结这个,我改标题OK。
如果说会patch的有多人,仅仅指用二进制工具改下第四字节,我同意,可关键改哪里?改成多少,有多少人自己搞出来?或者说找到接近原模数的公钥私钥,这也是我主题帖子里想知道的这对公钥私钥,模数当初是怎么找到的,哪怕差一个字节,满足条件的差多个字节也可以。

另外关于keygen源码,我搜索能力有限,在github,google找了好久没找到,最后只找到这两位大神(TOM_RUS/CZC)的,如果觉得这个有很多,麻烦给下其他作者链接。
注:源码压缩包我没改过名字,也没带patch字
雪    币: 1351
活跃值: (1225)
能力值: ( LV12,RANK:212 )
在线值:
发帖
回帖
粉丝
shuax 2 2023-12-3 17:16
14
0
首先mod_rsa要反过来一下 https://github.com/zu1kbackup/IDA-Keygen/blob/85237fc2302d1b90d15d24a0fae999f0e05e15cc/IDA-Pro-KeyGen/src/ida_key.c#L204 ,然后修改后的mod刚好是一个素数,并且比原来的mod大0x6F000000,也就只需要修改一个字节。可能把N修改为素数有什么特殊作用?期待大佬回答。
雪    币: 5529
活跃值: (16450)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
wusha 2023-12-3 19:30
15
0

多谢大佬指点,这个项目好像是fork CZC的,ida_key.c的38行写着// original RSA modulus (reversed)会不会定义原始mod数据时就是反的。

另外模数N应该是个合数,它可以分解为P*Q,正因为大数因式分解很难,所以P,Q是很难得到的。

这里面深入分析期待大佬解答。

最后于 2023-12-3 21:17 被wusha编辑 ,原因:
雪    币: 8000
活跃值: (2632)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
layerfsd 4 2023-12-3 20:54
16
1
tDasm layerfsd tDasm 你自己没思维能力写这些?文不对题。2位大神?n个大神! 有毛 ...
你配让谁自卑了?我不觉得楼主有什么错误,就算有,用得着居高临下阴阳怪气?真是奇了怪了,人家原文描述也写了,引用作者也带了。
雪    币: 5529
活跃值: (16450)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
wusha 2023-12-3 21:23
17
0
多谢大佬支持,消消气,以和为贵!以和为贵!不要继续哈
雪    币: 1187
活跃值: (382)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dfui 2023-12-3 22:39
18
0
感谢分享。
雪    币: 13465
活跃值: (4793)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 2023-12-4 07:27
19
0

!!!!!

最后于 2023-12-4 07:29 被tDasm编辑 ,原因:
雪    币: 1351
活跃值: (1225)
能力值: ( LV12,RANK:212 )
在线值:
发帖
回帖
粉丝
shuax 2 2023-12-4 09:10
20
0
我又想了下N为素数,相当于N=N*1,也是就是P=N,Q=1,然后phi_N=(P-1)*(Q-1),求d = mod_inverse(e, phi_N),因为Q-1=0,所以我去掉了,也就是phi_N=N-1,刚刚好计算出来的d就是上面的pri_key。这样子rsa也能用吗?我不太懂原理。
雪    币: 1351
活跃值: (1225)
能力值: ( LV12,RANK:212 )
在线值:
发帖
回帖
粉丝
shuax 2 2023-12-4 09:24
21
0
找到一个帖子,原来大佬们早就玩明白了: https://bbs.kanxue.com/thread-270822.htm
雪    币: 177
活跃值: (1906)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xingbing 2023-12-4 10:48
22
0
好东西,学习。
雪    币: 5529
活跃值: (16450)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
wusha 2023-12-4 12:18
23
0
shuax [em_13]找到一个帖子,原来大佬们早就玩明白了: https://bbs.kanxue.com/thread-270822.htm
多谢大佬指点,原帖已收藏
雪    币: 4069
活跃值: (3052)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
scz 5 2023-12-4 13:32
24
2
你别跟他吵了,我看过几次他的发言,感觉精神状态不稳定,非常冲,再吵下去,可能影响你的心情。
雪    币: 6218
活跃值: (586)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
b!@nk 2023-12-4 16:10
25
0
tDasm layerfsd tDasm 你自己没思维能力写这些?文不对题。2位大神?n个大神! 有毛 ...

有病

最后于 2023-12-4 16:12 被b!@nk编辑 ,原因:
游客
登录 | 注册 方可回帖
返回