逆向工程核心原理_little_summary

INT 和 IAT

INT 是rva数组,INT表示数组首地址 数组元素是一个地址 指向由一个2字节ordinall地址和函数名称组成的结构体 第一个值地址指向第一个结构体

如果IAT存在于 选择头中IAT表明的地址中 相应没有写权限也没事

INT和IAT指向内容有时相同 表示地址肯定不同 因为保存在不同地址 所指内容相同


进程内存转储

OLLYGDB插件?? dump命令
是解压缩运行时,将内存转为文件,方便查看


代码注入

使用CALL指令将接下来的在代码间的字符串数据地址压入栈,然后直接接下来运行命令

CALL EAX
EAX保存函数地址
32位保存返回内容


top 命令 (linux)

查看 CPU 时间在 User space 与 Kernel Space 之间的分配情况


SEH链

ollydbg VIEW-SEH CHAIN


API钩取

windows 中内核模式所有代码共用一个虚拟空间地址,用API传
e1 = 9Fh => 0fh*2^7 = 780h

使用常规系统资源的API会经由kernel32.dll和ntdll.dll不断向下调用,最后经由SYSENTER命令进入内核模式

0N35f1.png


0N3vtA.png


动态方法常用 调试和注入

方法1:调试

异常必须处理为EXCEPTION_BREAKPOINT 汇编指令为int 3 IA-32指令为0xCC

用异常获取API的控制

线程上下文,(执行完一个线程时间片,执行另一个),也就是各个寄存器信息,保存在CONTEXT结构体中。

CONTEXT.esp

api钩取 获取某个API的控制权

方法2:DLL注入

setwindowstextA 表示ASCII
setwindowstextW 表示宽字符 win中为Unicode码

IAT钩取

通过注入DLL,修改IAT中指向某API的地址改为指向自己API的地址,自己的函数再去调用某API,来达到修改的目的


搜索API

在用ollydng进行内部模块call 搜索时,先选取对的模块。右键-select moudle
在用ollydbg 中 search for name命令


API代码修改

将API头五个字节 修改 为JMP XXXXXXXX
即跳转到注入的函数中

通过将ntdll.ZwQuerySystemInformation() 函数形成的链表中删除进程信息即可做到隐藏相关进程。

全局API钩取

通过修改ntdll.ZwResumeThread() API

热补丁 hot patch

修改7字节代码
1.二次跳转
两字节跳到指令上面,用五字节跳到自己的函数地址
2.不用脱钩,地址+2字节,就可正常运行

ia-32 E9 表示far jmp 五字节。
E9 XXXXXXXX=要跳转的地址-当前指令地址-当前指令长度(5)

EB 表示 short jmp 两字节
依托当前EIP 在-128~127范围间跳转
XX=要跳转的地址-当前指令地址-当前指令长度(2)