Skip to content

Commit b1bb35c

Browse files
authored
Added nvidia turing instructions set (#162)
Signed-off-by: Prabhu Subramanian <prabhu@appthreat.com>
1 parent b404e96 commit b1bb35c

File tree

3 files changed

+59
-13
lines changed

3 files changed

+59
-13
lines changed

blint/config.py

Lines changed: 53 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,20 +1399,62 @@ def __post_init__(self):
13991399
'npxor', 'vpxor', 'vpxord', 'vpxorq',
14001400
'pshufb', 'vpshufb',
14011401
'pclmulqdq', 'vpclmulqdq',
1402-
'movdqa', 'movdqu', 'vmovdqa', 'vmovdqu',
1403-
'padd', 'psub', 'pmul',
1404-
'psll', 'psrl', 'psra',
14051402
'vpaddd', 'vpsubd', 'vpmulld', 'pmaddwd'
14061403
]
1404+
1405+
# https://docs.nvidia.com/cuda/cuda-binary-utilities/index.html#turing-turing-instruction-set-table
14071406
GPU_INDICATORS = [
1408-
'glbind', 'glvertex', 'glcolor', 'glbegin', 'glend', 'glenable', 'gldisable', 'glget', 'glset', 'glload', 'glsave', 'gluniform', 'gluseprogram', 'glattachshader', 'gldraw', 'glclear', 'glviewport', 'glmatrix', 'glpushmatrix', 'glpopmatrix',
1409-
'cuda', 'cuinit', 'cucontext', 'cudriver', 'cugpu', 'cudevice', 'cumem', 'cuptr', 'cukernel', 'culaunch', 'cugrid', 'cublock', 'cuthread', 'cufree', 'cucopy',
1410-
'clgetplatform', 'clgetdevice', 'clcreatecontext', 'clcreatecommandqueue', 'clcreateshared', 'clcreatekernel', 'clsetkernelarg', 'clenqueuendrange', 'clfinish', 'clrelease', 'clbuildprogram',
1411-
'd3d', 'd3d11', 'd3d12', 'create', 'device', 'swapchain', 'rendertarget', 'shaders', 'ps_', 'vs_', 'gs_', 'cs_', 'hs_', 'ds_',
1412-
'vkcreate', 'vkdestroy', 'vkallocate', 'vkfree', 'vkqueue', 'vksubmit', 'vkwait', 'vkacquire', 'vkpresent', 'vkcmd', 'vkbegin', 'vkend', 'vkbind', 'vkdraw', 'vkdispatch', 'vkcopy', 'vkblit', 'vkclear', 'vkfill', 'vkupdate',
1413-
'mtl', 'metal', 'mtldevice', 'mtlcommand', 'mtlrender', 'mtlcompute', 'mtlbuffer', 'mtltexture', 'mtlfunction', 'mtllibrary', 'mtlencoder', 'mtlpass',
1414-
'gpu', 'compute', 'shader', 'vertex', 'fragment', 'pixel', 'kernel', 'workgroup', 'local', 'global', 'buffer', 'texture', 'surface',
1415-
]
1407+
'acqbulk', 'acqshminit', 'atom', 'atomg', 'atoms', 'b2r', 'bgmma',
1408+
'bmov', 'bmma', 'bmsk', 'bpt', 'brx', 'brxu',
1409+
'bssy', 'bsync', 'bvote', 'cctl', 'cctll', 'cctlt',
1410+
'cgaerrbar', 'clclear', 'clcolor', 'clcreatecommandqueue',
1411+
'clcreatecontext', 'clcreatekernel', 'clcreateshared', 'cldevice',
1412+
'clenqueuendrange', 'clfinish', 'clgetdevice', 'clgetplatform', 'clcopy',
1413+
'clrelease', 'clsetkernelarg', 'compute', 'credux', 'cs2r',
1414+
'cs2ur', 'cuda', 'cublock', 'cucontext', 'cucopy', 'cudevice',
1415+
'cudriver', 'cufree', 'cugpu', 'cugrid', 'cuinit', 'cukernel', 'culaunch',
1416+
'cumem', 'cuptr', 'cuthread', 'd3d', 'd3d11', 'd3d12', 'depbar',
1417+
'dfma', 'dmma', 'elect', 'endcollective',
1418+
'errbar', 'fadd32i',
1419+
'fchk', 'ffma2', 'ffma32i', 'fhfma', 'fmnmx',
1420+
'fmnmx3', 'fmul2', 'fmul32i', 'fragment',
1421+
'fswzadd', 'getlmembase', 'glattachshader', 'glbegin', 'glbind',
1422+
'glclear', 'glcolor', 'gldisable', 'gldraw', 'glend', 'glenable', 'glget',
1423+
'glload', 'glmatrix', 'glpopmatrix', 'glpushmatrix', 'glsave', 'glset',
1424+
'gluniform', 'gluseprogram', 'glvertex', 'glviewport', 'gpu',
1425+
'gs_', 'hadd2', 'hadd2_32i', 'hfma2', 'hfma2_32i', 'hgmma', 'hmma',
1426+
'hmnmx2', 'hmul2', 'hmul2_32i',
1427+
'iadd3', 'iadd32i', 'idp4a', 'igmma',
1428+
'imma', 'imnmx', 'imul32i', 'iscadd', 'iscadd32i',
1429+
'jmxu', 'ldcu',
1430+
'ldgdepbar', 'ldgmc', 'ldgsts' 'ldsm', 'ldtm',
1431+
'lepc', 'lop3', 'lop32i', 'metal',
1432+
'mov32i', 'movm', 'mtl', 'mtlbuffer', 'mtlcommand', 'mtlcompute',
1433+
'mtldevice', 'mtlencoder', 'mtlfunction', 'mtllibrary', 'mtlpass',
1434+
'mtlrender', 'mtltexture', 'mufu', 'omma', 'p2r',
1435+
'plop3', 'pmtrig', 'preexit',
1436+
'qgmma', 'qspc', 'r2b', 'r2p', 'r2ur', 'redas', 'redg', 'redux',
1437+
'rendertarget', 'rpcmov', 'rtt', 's2r', 's2ur', 'setctaid',
1438+
'setlmembase', 'shader', 'shaders', 'shf', 'shfl', 'sgxt',
1439+
'stas', 'stg', 'stsm', 'sttm', 'suatom', 'suld',
1440+
'sured', 'sust', 'swapchain', 'syncs', 'tex', 'texture', 'tld',
1441+
'tld4', 'tmml', 'txd', 'txq', 'ublkcp', 'ublkpf', 'ublkred', 'ubmsk',
1442+
'ubrev', 'ucgabar_arv', 'ucgabar_wait', 'uclea', 'uf2f', 'uf2fp', 'uf2i',
1443+
'uf2ip', 'ufadd', 'uffma', 'uflo', 'ufmnmx', 'ufmul', 'ufrnd', 'ufsel',
1444+
'ugetnextworkid', 'ui2f', 'ui2fp', 'ui2i', 'ui2ip',
1445+
'uiabs', 'uiadd3', 'uiadd3.64', 'uimad', 'uimnmx', 'uldc', 'ulea',
1446+
'ulepc', 'ulop', 'ulop3', 'ulop32i', 'umemsets', 'up2ur', 'uplop3',
1447+
'upopc', 'ur2up', 'uredgr', 'usel', 'usetmaxreg',
1448+
'usgxt', 'ushf', 'ushl', 'ushr', 'ustgr', 'utcatomsws', 'utcbar', 'utccp',
1449+
'utchmma', 'utcimma', 'utcomma', 'utcqmma', 'utcshift', 'utmacctl',
1450+
'utmacmdflush', 'utmaldg', 'utmapf', 'utmaredg', 'utmastg', 'uviadd',
1451+
'uvimnmx', 'uvirtcount', 'vabsdiff4', 'vertex', 'vhmnmx',
1452+
'viadd', 'viaddmnmx', 'vimnmx', 'vimnmx3', 'vkacquire', 'vkallocate',
1453+
'vkbegin', 'vkbind', 'vkblit', 'vkclear', 'vkcmd', 'vkcopy', 'vkcreate',
1454+
'vkdestroy', 'vkdispatch', 'vkdraw', 'vkend', 'vkfill', 'vkfree',
1455+
'vkpresent', 'vkqueue', 'vksubmit', 'vkupdate', 'vkwait',
1456+
'warpgroup', 'warpgroupset', 'warpsync', 'vote'
1457+
]
14161458

14171459
IMPLICIT_REGS_X86 = {
14181460
'mul': {'read': {'ax', 'eax', 'rax'}, 'write': {'dx', 'ax', 'edx', 'eax', 'rdx', 'rax'}},

blint/lib/disassembler.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,8 @@ def disassemble_functions(parsed_obj, metadata, arch_target="", cpu="", features
715715
arch_target = machine_type
716716
if arch_target == "arm64" or (metadata.get("binary_type", "") == "MachO" and not arch_target):
717717
arch_target = "aarch64"
718+
if arch_target == "riscv":
719+
arch_target = "riscv64"
718720
if not arch_target:
719721
arch_target = "x86_64"
720722
try:
@@ -797,8 +799,8 @@ def disassemble_functions(parsed_obj, metadata, arch_target="", cpu="", features
797799
instruction_hash = hashlib.sha256(joined_mnemonics.encode('utf-8')).hexdigest()
798800
has_system_call = any(syscall_pattern in lower_assembly for syscall_pattern in SYSCALL_INDICATORS)
799801
has_security_feature = any(feature_pattern in lower_assembly for feature_pattern in SECURITY_INDICATORS)
800-
has_crypto_call = any(indicator in lower_assembly for indicator in CRYPTO_INDICATORS)
801-
has_gpu_call = any(indicator in lower_assembly for indicator in GPU_INDICATORS)
802+
has_crypto_call = any(f"{indicator} " in lower_assembly for indicator in CRYPTO_INDICATORS if len(indicator) > 3)
803+
has_gpu_call = any(f"{indicator} " in lower_assembly for indicator in GPU_INDICATORS if len(indicator) > 3)
802804
function_type = _classify_function(instruction_metrics, instruction_count, plain_assembly_text, has_system_call, has_indirect_call)
803805
disassembly_results[f"{func_addr_va_hex}::{func_name}"] = {
804806
"name": func_name,

blint/lib/utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,8 @@ def extract_ar(ar_file: str, to_dir: str | None = None) -> list[str]:
653653
for entry in archive:
654654
# This workarounds a bug in ar that returns multiple names
655655
file_name = entry.name.split("\n")[0].removesuffix("/")
656+
if os.path.sep in file_name:
657+
file_name = file_name.rsplit(os.path.sep, 1)[-1]
656658
afile = os.path.join(to_dir, file_name)
657659
with open(afile, "wb") as output:
658660
output.write(archive.open(entry, "rb").read())

0 commit comments

Comments
 (0)