normal31(hook的学习,sm4算法)

执行程序

弹出hooked显示,这里涉及hook程序。主要就是通过用户行为来跳转到指定程序

初探hook技术 - 先知社区 (aliyun.com)

检索字符串,检查弹窗信息来源,交叉检索

跳转

这里似乎是一个base64变表

AddVectoredExceptionHandler进入一个指向的程序

进入Hadnler

继续进入sub_B61172

找到sm4特征值

推测sub_B61172此处为sm4的key生成,以where_are_u_now?作为密钥生成轮密钥,对储存unk_B6A218的位置进行交叉检索

找到与shuru相关的sm4加密

在执行完密钥生成之后就会回到被hook的位置执行sm4加密,然后引发异常,SetUnhandledExceptionFilter函数,设置异常捕获函数,会在发生异常之后优先执行函数内的程序。

这里应该是再sm4加密之后设置了一个错误

然后执行一个换序和base64再变种

我们先还原b64

这里面有个sub_B610FF,是对取6位的函数进行加24除模64的操作,可以理解为表的偏移(就把第一次变表的前24位再挪到后面就行

安洵杯 2019——crackMe | 蝉3301 (shijingtian.github.io)

搞到个好东西

https://github.com/yang3yen/pysm4

安装pysm4的时候除了点问题

这里需要给open加上编码,win10的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import base64
from pysm4 import encrypt, decrypt
old='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
new='yzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/abcdefghijklmnopqrstuvwx' #修改过的b64表
data=list('1UTAOIkpyOSWGv/mOYFY4R!!')
newdata=''
result=''
for i in range(0,len(data),2):
newdata += data[i + 1]
newdata+=data[i]
for i in range(len(newdata)-2):
result+=old[new.find(newdata[i])]
result+='=='
de=base64.b64decode(result)
decodedata=list(de)
for i in decodedata:
print(hex(i))
#0x59d095290df2400614f48d276906874e

flag_int=[]
encodedata = 0x59d095290df2400614f48d276906874e
key = 0x77686572655f6172655f755f6e6f773f #where_are_u_now?
decode = decrypt(encodedata, key)
flag=hex(decode)[2:]
for i in range(0,len(flag),2):
flag_int.append(int(flag[i]+flag[i+1],16))
print(''.join(chr(j)for j in flag_int ))

(2条消息) C++ IAT HOOK(MessageBoxW 为例)_(-: LYSM :-)的博客-CSDN博客