补充上次的元组等,同时继续往下。
Cython程序分析_4
代码1
继续使用博客3编译的文件来分析。
1 | def func_Tuple(): |
func_Tuple()
C文件
1 | +029: def func_Tuple(): |
IDA
两个元组的初始化在InitCachedConstants()
函数中
1 | // InitCachedConstants() |
1 | // write access to const memory has been detected, the output may be wrong! |
补充
__Pyx_PyTuple_GetSlice()
元组的slice
调用的是__Pyx_PyTuple_GetSlice()
宏。
1 | static CYTHON_INLINE PyObject* __Pyx_PyTuple_GetSlice( |
tuple1[0:5:2]
上面试了两个是默认步长为1的。
1 | +1: def func(): |
步长不为1后立刻变成了PySlice_New()
了,反而更容易辨识了。
1 | // write access to const memory has been detected, the output may be wrong! |
func_Set()
1 | +040: def func_Set(): |
IDA
1 | // write access to const memory has been detected, the output may be wrong! |
func_Dictionary()
在exec函数中遇到过不少次了,很多重要全局变量都是在字典中维护的。
1 | +060: def func_Dictionary(): |
IDA
1 | // write access to const memory has been detected, the output may be wrong! |
补充
关于方法的调用
1 | /* py_dict_keys */ |
从这个函数来看,现在的方法调用基本都是通过__Pyx_CallUnboundCMethodn()
这种函数。关于恢复,在博客2已经讲过了,主要是要恢复结构体。
代码2
有关基本类型转换函数。
1 | def dict_plus(): |
dict_plus()
1 | +01: def dict_plus(): |
可以看出列表推导式的逻辑真的完整的显现了一遍。
IDA
1 | // write access to const memory has been detected, the output may be wrong! |
to_int()
1 | +05: def to_int(): |
前几个调用的函数都是一样的,最后多了一个关于基数的参数,就变了。
IDA
1 | // write access to const memory has been detected, the output may be wrong! |
to_float()
1 | +11: def to_float(): |
IDA
1 | // write access to const memory has been detected, the output may be wrong! |
to_str()
IDA
1 | // write access to const memory has been detected, the output may be wrong! |
全部使用PyObject_Call(PyUnicode_Type, xxxx)
的手法来调用。
test_repr_and_list()
1 | +22: def test_repr_and_list(): |
IDA
1 | // write access to const memory has been detected, the output may be wrong! |
里面有些内联函数和元组的一样。就是初始化列表没有元组要美观,因为PyList_SET_ITEM()
是个会被内联的宏。
补充
1 |
test_eval()
1 | +30: def test_eval(): |
不少内联函数。
__Pyx_Globals()
使用这个函数来
1 | /* Globals */ |
IDA
1 | // write access to const memory has been detected, the output may be wrong! |
test_hex_oct()
1 | +34: def test_hex_oct(): |
IDA
1 | // write access to const memory has been detected, the output may be wrong! |
test_ord_chr()
1 | +39: a = ord('b') |
IDA
1 | // write access to const memory has been detected, the output may be wrong! |
由此可见ord()
如果传入的是常量,最后有可能会被直接优化成具体值。
补充
1 | def test_ord(input): |
1 | +1: def test_ord(input): |
IDA
1 | // write access to const memory has been detected, the output may be wrong! |
- 本文作者: Taardis
- 本文链接: https://taardisaa.github.io/2022/01/28/Cython Reverse 4/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!