逆向工程核心原理_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命令进入内核模式
动态方法常用 调试和注入
方法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)