吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 39926|回复: 164
上一主题 下一主题
收起左侧

[原创工具] 亚洲诚信数字签名工具修改版 能通过驱动签名验证 免修改系统时间 增加时间戳

    [复制链接]
跳转到指定楼层
楼主
JemmyloveJenny 发表于 2019-2-24 02:47 回帖奖励
本帖最后由 JemmyloveJenny 于 2019-3-10 11:11 编辑

亚洲诚信数字签名工具是一个使用很广泛的软件,因为它确实好用……
应用模式签名、内核模式签名、CAB/CAT签名及生成样样都行,比微软的signtool方便。

但是呢,经常用它签内核驱动的人都知道他有一个缺点:
签名内核模式驱动最常用的证书是有两个
一个是“上海域联软件技术有限公司” (这个公司正是这数字签名工具最初的开发商……可能某次一不小心把签名证书泄露了?)
另一个是“HT Srl”(那个卖间谍软件给政府的意大利开发商HackingTeam被黑了,证书泄露)

如你们所见,这些证书早就过期了。如果现在想用这个证书签名,签名工具会拒绝接收此证书。唯一的解决办法就是修改系统时间回到有效期内再签名。
但是,修改系统日期很麻烦有没有啊……!

我很懒,所以就把签名工具修改了一下:

修改版本与原版的区别:
1.在原版中,若想使用已过期的数字证书进行签名,则需要修改整个系统的时间。在修改版本中您可以通过编辑hook.ini修改签名工具获取到的时间,免去修改系统时间的麻烦。
2.修改了原版时间戳列表,删除Entrust时间戳,增加了我自建的上海域联专用时间戳(签名时间为 2011-04-01 00:00:00 UTC),因此可以在签名的同时打上时间戳。
  若将我的 JemmyLoveJenny EV Root CA 添加进系统根证书信任列表,过期的上海域联证书+此专用时间戳可以直接通过WinXP-Win10所有系统的驱动加载签名检查。
  EVRootCA.crt就是我自签名的根证书。为了便于添加信任,我制作了注册表添加方式,运行EVRootCA.reg也可以达到的目的。

修改过程:
1.编译HookSigntool.dll,使用微软Detur库Hook了签名工具的函数 crypt32.dll!CertVerifyTimeValidity 和 kernel32.dll!GetLocalTime。
2.修改DSigntool.exe,PE头部导入表添加 HookSigntool.dll!attach 达到Hook函数的目的。
3.修改Dsigntool.exe,将Entrust的时间戳地址更换为我自己的专用时间戳。

用法:
1.安装原版签名工具,获取地址为 https://www.trustasia.com/sign-tools (其实不安装也可以)
2.下载本修改版工具,替换文件到安装位置。
3.编辑hook.ini文件,自定义日期(默认设为2011-04-01)
4.启动DSigntool.exe尽情享用吧。

效果展示:

增加的上海域联专用时间戳


时间戳后数字签名正常(如果不加时间戳,会显示证书已吊销)


Signtool验证签名及加载驱动


最后是下载链接:(下载修改版后 替换原版目录下的文件)
原版: https://www.trustasia.com/sign-tools在
修改版: DSigntool.7z (985.03 KB, 下载次数: 4739)
至于签名用的“上海域联”和“HT Srl”嘛……你们自己上网找吧,还算比较好找的。
我不想牵扯进可能的纠纷,就不提供出来了。
这两个泄露证书这么难找嘛?给一些线索:

上海域联软件技术有限公司:在看雪论坛里有,关键词:签名,Win64驱动
HT Srl:在Github里有,关键词:hackedteam

好多人都私信问我签名证书从哪里获得,
我最近在论坛看到有人发了签名证书,数量挺多的,有兴趣的人去他哪里下载吧
https://www.52pojie.cn/thread-884098-1-1.html
证书是他发的,和我无关哦。

有些人问我如何自定义时间戳打上的时间,我在这里统一解释一下:

数字签名工具里的时间戳地址是写死的,所以无法根据配置文件里设置的时间自动更改。自定义时间需要用微软的signtool来打时间戳。

时间戳服务器的地址是 http://tsa.pki.jemmylovejenny.tk/SHA1/ 或 http://tsa.pki.jemmylovejenny.tk/SHA256/
这两个地址都支持 Authenticode 和 RFC3161 时间戳,也就是说,在微软signtool中使用 /t "<URL>" 或者 /tr "<URL>" 都是可以的,可以根据自己的需要打不同协议的时间戳 (Authenticode时间戳兼容性比较好,支持XP)
两个地址的区别就是,时间戳后签名证书链不同,一个证书链哈希算法是SHA1,另一个是SHA256,其他没有区别。

自定义时间的话,就是在地址后面加上希望的时间(UTC时间,需要转换时区)。
格式为"yyyy-MM-dd'T'HH:mm:ss"
北京时间是UTC+8,所以地址后面的时间需要减掉8小时才能变成UTC时间。
举几个例子:(SHA1还是SHA256根据自己需要修改,以下就全部用SHA1举例)
北京时间 2011-04-01 08:00:00,对应的时间戳地址是 http://tsa.pki.jemmylovejenny.tk/SHA1/2011-04-01T00:00:00
北京时间 2019-03-10 10:25:34,对应的时间戳地址是 http://tsa.pki.jemmylovejenny.tk/SHA1/2019-03-10T02:25:34

然后打时间戳就用微软的signtool,命令为 【signtool timestamp /t "<URL>" <filename>】
如果是双签名,另加/tp参数指定签名序号,打两次时间戳【signtool timestamp /tp <index> /tr "<URL>" <filename>】

比如说,给我要给 test.exe 单签名打2011-04-01 08:00:00的时间戳,完整命令为 【signtool timestamp /t "http://tsa.pki.jemmylovejenny.tk/SHA1/2011-04-01T00:00:00" test.exe】
如果 test.exe 有双签名,首先执行上一条命令,然后再用【signtool timestamp /tp 1 /tr "http://tsa.pki.jemmylovejenny.tk/SHA256/2011-04-01T00:00:00" test.exe】给第二个签名打时间戳

注意!自定义的时间戳日期最好接近证书的颁发时间,因为大部分泄露的证书已经被CA吊销,自定义的时间必须在证书吊销之前才能通过驱动签名验证!

免费评分

参与人数 22吾爱币 +17 热心值 +20 收起 理由
Pony21 + 1 + 1 谢谢@Thanks!
lsz7575 + 1 + 1 谢谢@Thanks!
5598869 + 1 + 1 他就算是抄袭的?你们发出来了?
Dmitri + 1 + 1 我很赞同!
╭ァの修罗 + 1 + 1 我很赞同!
尺度空间 + 1 + 1 热心回复!
jilisa + 1 + 1 谢谢@Thanks!
qq63 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
big冰 + 1 + 1 原来可以正常时间戳签名那个上海域联的签名,但是今天测速失败了
fdsa123q + 1 + 1 谢谢@Thanks!
rekent + 1 鼓励转贴优秀软件安全工具和文档!
xy1478 + 1 + 1 谢谢@Thanks!
aabbcc123123 + 1 + 1 谢谢@Thanks!
tail88 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
loversoft + 1 谢谢@Thanks!
Tyrantcwj + 1 不支持哪方,只希望能有一个结果告诉大家到底是不是抄的
网事如风 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
woaihot + 1 + 1 谢谢指点!!!
xinkui + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
紫血 + 1 转载工具,请注明出处
囚徒灬 -1 转载工具,请注明出处
黑洛 + 1 + 1 https://github.com/hzqst/FuckCertVerifyTimeValidity

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

来自 #
 楼主| JemmyloveJenny 发表于 2019-3-1 20:55 |楼主
本帖最后由 JemmyloveJenny 于 2019-3-1 21:16 编辑
黑洛 发表于 2019-2-25 19:30
而且,最怪异的是你明明是个C语言选手(这是我看你以前代码得出来的判断),但是你居然用C++风格这么浓烈 ...

周一到周五我没看……
你猜错了,其实我是个C#和Java选手……C和C++只是会用,但是不熟。
我最开始用的是typedef,后来改的decltype

你对我怀疑不断,那我把我的代码git仓库公开,我刚push上去的:
https://gitlab.com/JemmyLoveJenny/hooksigntool
https://github.com/JemmyLoveJenny/HookSigntool
你看这git能不能证明我原创了呢?
推荐
 楼主| JemmyloveJenny 发表于 2019-7-4 14:52 |楼主
朱玛 发表于 2019-7-4 12:04
话说用现有的这些证书有没有办法用这个工具一键完美SHA1+SHA2签名?单独SHA1的“HT Srl”没问题,SHA256的 ...

一键完美SHA1+SHA2可以实现,不过就不是通过改现有的数字签名工具了……
Win8+加上signtool可以用一个批处理实现一键完美签名

我现在正在开发一个全能的数字签名工具,等完成了再发出来
推荐
 楼主| JemmyloveJenny 发表于 2019-2-24 04:31 |楼主
黑洛 发表于 2019-2-24 03:44
我就说一点。detours,没他那个代码你知道怎么用吗?看你之前发的贴,我认为你看都看不懂这个库。
比较 ...

你这样想,那我就没办法了…
修改编译后的程序的API调用,我认为最通用的作法就是外部加载一个Hook用的dll,这样比较灵活。
Detours库还算是比较有名的,我听说过它,就用了它。
我没细看过Detours库的原理,但是知道是和5字节有关。就算我再菜,但是一个Attach我还是会调用的好嘛!
HookSigntool.dll做的事情就是一个Attach,再重写一个实现函数。本来就是十几行代码搞定的事,十几行代码能有多少区别呢?

举个例子,我们两人分别写Helloworld,我先用了printf,你用的也是printf,我说你抄了我的代码,你服气吗?

我说的你都不信,还让我如何自证清白?
你认为我抄了他的代码,那你从dll里找证据吧,有证据证明你的观点就回复到这里。
推荐
 楼主| JemmyloveJenny 发表于 2019-2-24 19:13 |楼主
本帖最后由 JemmyloveJenny 于 2019-2-24 19:56 编辑
黑洛 发表于 2019-2-24 17:27
“dll里总会出现"FuckCert"之类的项目名称吧”
就凭你这句话,我更认为你是抄的。修改的dll怎么会带上别 ...

新建一个项目再复制代码进去,这符合正常人的思路吗?
行,为了打你的脸,我代码就贴在下面。
重写函数的定义是从MSDN上拷的,参数的类型是Attach函数要求的,你说我能有什么区别?
能有区别的是什么?只有变量名称了吧?不好意思,根据命名法则,变量名也是很相近的。

我说很难有差别,你要喷。那你说说我下面写的算不算?
如果不算,那你给我写一个不同的看看,让我长长见识。
#pragma comment(lib, "detours.lib")
#define _CRT_SECURE_NO_WARNINGS

#include <Windows.h>
#include <wincrypt.h>
#include <stdlib.h>
#include <detours.h>
#include <direct.h>
#include <io.h>
#include<stdio.h>

using fntCertVerifyTimeValidity = decltype(CertVerifyTimeValidity);
using fntGetLocalTime = decltype(GetLocalTime);

int year = -1;
int month = -1;
int day = -1;
int dayofweek = -1;
int hour = -1;
int minute = -1;
int second = -1;
int milliseconds = -1;

fntCertVerifyTimeValidity *pOldCertVerifyTimeValidity = NULL;
fntGetLocalTime *pOldGetLocalTime = NULL;

LONG WINAPI NewCertVerifyTimeValidity(
        LPFILETIME pTimeToVerify,
        PCERT_INFO pCertInfo
)
{
        return 0;
}

void WINAPI NewGetLocalTime(
        LPSYSTEMTIME lpSystemTime
)
{
        pOldGetLocalTime(lpSystemTime);
        if (year >= 0)
                lpSystemTime->wYear = year;
        if (month >= 0)
                lpSystemTime->wMonth = month;
        if (day >= 0)
                lpSystemTime->wDay = day;
        if (dayofweek >= 0)
                lpSystemTime->wDayOfWeek = dayofweek;
        if (hour >= 0)
                lpSystemTime->wHour = hour;
        if (minute >= 0)
                lpSystemTime->wMinute = minute;
        if (second >= 0)
                lpSystemTime->wSecond = second;
        if (milliseconds >= 0)
                lpSystemTime->wMilliseconds = milliseconds;
}

BOOL WINAPI DllMain(
        _In_ HINSTANCE hinstDLL,
        _In_ DWORD fdwReason,
        _In_ LPVOID lpvReserved)
{
        if (fdwReason == DLL_PROCESS_ATTACH)
        {
                //Get config file
                char buf[260];
                char* p = strstr(GetCommandLineA(), "-config ");
                if (p) {
                        strcat_s(buf, p);
                }
                else {
                        _getcwd(buf, sizeof(buf));
                        strcat_s(buf, "\\hook.ini");
                }
                year = GetPrivateProfileInt("Time", "Year", -1, buf);
                month = GetPrivateProfileInt("Time", "Month", -1, buf);
                day = GetPrivateProfileInt("Time", "Day", -1, buf);
                dayofweek = GetPrivateProfileInt("Time", "DayOfWeek", -1, buf);
                hour = GetPrivateProfileInt("Time", "Hour", -1, buf);
                minute = GetPrivateProfileInt("Time", "Minute", -1, buf);
                second = GetPrivateProfileInt("Time", "Second", -1, buf);
                milliseconds = GetPrivateProfileInt("Time", "Milliseconds", -1, buf);

                memset(buf, 0, sizeof(buf));
                strcpy_s(buf, getenv("APPDATA"));
                strcat_s(buf, "\\TrustAsia\\DSignTool\\hook");

                //Check is first run
                if (_access(buf, 0)) {
                        if (MessageBoxA(NULL, "欢迎使用JemmyLoveJenny修改版的数字签名工具\r\n初次使用时建议您先阅读README了解修改版的变化\r\n是否打开README?", "欢迎使用", MB_YESNO) == IDYES) {
                                memset(buf, 0, sizeof(buf));
                                _getcwd(buf, sizeof(buf));
                                strcat_s(buf, "\\README.txt");
                                if (!_access(buf, 0)) {
                                        char buf2[260];
                                        strcpy_s(buf2, "notepad.exe \"");
                                        strcat_s(buf2, buf);
                                        strcat_s(buf2, "\"");
                                        WinExec(buf2, 1);
                                }
                                else {
                                        strcat_s(buf, " 不存在");
                                        MessageBoxA(NULL, buf, "文件不存在", MB_OK | MB_ICONERROR);
                                }
                        }
                        memset(buf, 0, sizeof(buf));
                        strcpy_s(buf, getenv("APPDATA"));
                        strcat_s(buf, "\\TrustAsia\\DSignTool\\hook");
                        FILE *fp;
                        fp = fopen(buf, "w+");
                        fclose(fp);
                }

                pOldCertVerifyTimeValidity = (fntCertVerifyTimeValidity *)GetProcAddress(LoadLibraryW(L"crypt32.dll"), "CertVerifyTimeValidity");
                pOldGetLocalTime = (fntGetLocalTime *)GetProcAddress(LoadLibraryW(L"kernel32.dll"), "GetLocalTime");

                DetourTransactionBegin();
                DetourAttach(&(PVOID&)pOldCertVerifyTimeValidity, NewCertVerifyTimeValidity);
                DetourAttach(&(PVOID&)pOldGetLocalTime, NewGetLocalTime);
                DetourTransactionCommit();
        }
        return 1;
}

extern "C" __declspec(dllexport) int attach()
{
        return 0;
}
推荐
 楼主| JemmyloveJenny 发表于 2019-3-15 16:01 |楼主
忧郁小男生 发表于 2019-3-15 09:54
按照你说的方法,win10双签名会出现这种情况

我按照你给的截图自己试了一次,没有问题啊,两个签名都正常。
我签了一个HelloWorld,你看下我签的文件是否正常?
HelloWorld.zip (17.19 KB, 下载次数: 233)

你也可以把你打了时间戳的文件发上来,我看一下问题在哪……
推荐
 楼主| JemmyloveJenny 发表于 2019-3-1 23:05 |楼主
安得茶业 发表于 2019-3-1 22:51
我前两天还在申请SSL证书,但是域名后缀不支持,看到楼主的码的字很多,蛮看看

emmm
我的工具是代码签名,而不是SSL证书。
SSL证书用Let's Encrypt啊,免费的,大部分域名都支持。
推荐
 楼主| JemmyloveJenny 发表于 2019-7-21 20:03 |楼主
laocan2018 发表于 2019-7-21 19:02
WIN10 64 各个流程都没有问题,安装鼠标驱动出现未知设备,楼主现在还能用吗,win7能用,win10会出现未知设 ...

你在说什么流程?
未知设备应该是你INF文件的问题,和签名无关
3#
黑洛 发表于 2019-2-24 03:01
发东西前请带上出处
https://github.com/hzqst/FuckCertVerifyTimeValidity
别搞得好像是你自己弄出来的
4#
 楼主| JemmyloveJenny 发表于 2019-2-24 03:17 |楼主
黑洛 发表于 2019-2-24 03:01
发东西前请带上出处
https://github.com/hzqst/FuckCertVerifyTimeValidity
别搞得好像是你自己弄出来的
...

噗…其实你发的这个我之前没看到过。
刚去github上看了一下,hook日期的地方确实和他的操作比较像…不过你为什么认为我就是般他的东西呢?用detour库hook函数不都是差不多的嘛。再说,我hook还读取了ini文件,他的就没有。

另外,你再看时间戳功能呢?时间戳的证书链都是我的,总不至于是搬运的吧
5#
黑洛 发表于 2019-2-24 03:44
JemmyloveJenny 发表于 2019-2-24 03:17
噗…其实你发的这个我之前没看到过。
刚去github上看了一下,hook日期的地方确实和他的操作比较像…不过 ...

我就说一点。detours,没他那个代码你知道怎么用吗?看你之前发的贴,我认为你看都看不懂这个库。
比较像,像到劫持主程序的思路都一样吗?不过是拿他的改改而已,别搞得好像是你自己的东西。
6#
 楼主| JemmyloveJenny 发表于 2019-2-24 04:50 |楼主
黑洛 发表于 2019-2-24 03:44
我就说一点。detours,没他那个代码你知道怎么用吗?看你之前发的贴,我认为你看都看不懂这个库。
比较 ...

你怀疑我,现有的证据就是我和他都用了Detours库Hook了数字签名工具呗。达到目的的途径和目标都相同,确实挺值得怀疑的。但是你要拿出证据啊。
修改的目标不变,你觉得我用了Detours很可疑,那我用什么才正常?或者你给一个修改时间的思路?

如果我clone了他的repo,修改一下再编译,dll里总会出现"FuckCert"之类的项目名称吧。但你找找看有吗?只能找到"HookSigntool",这能不能说明问题呢?
7#
 楼主| JemmyloveJenny 发表于 2019-2-24 05:06 |楼主
黑洛 发表于 2019-2-24 03:44
我就说一点。detours,没他那个代码你知道怎么用吗?看你之前发的贴,我认为你看都看不懂这个库。
比较 ...

如果你还是执意认为我抄了他的代码,那你就继续认为吧。
因为我真的无法证明我的dll不是从他的代码改的。就像我证明不了有控制台输出的程序不是从Helloworld改的一样。

来吧,说说我的时间戳服务器又是从谁的代码改的?
8#
565266718 发表于 2019-2-24 08:15
希望把签名证书分享下。。
9#
woaihot 发表于 2019-2-24 08:48
如何获得泄露的证书?
10#
chen4321 发表于 2019-2-24 09:27 来自手机
ht那个证书在哪有下载
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 提醒:禁止复制他人回复等『恶意灌水』行为,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2022-12-9 20:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表