1. 2年逆向研究心得-谈谈我对逆向的一些认识

    1.定义的给出   下面是软件工程中普遍对于逆向工程枯燥的定义:逆向工程是一个广义概念,是指从可运行的程序系统出发,运用解密、反汇编、系统分析、动态调试等多种技术对软件进行分析,推导出软件产品的结构、流程、算法、软件架构、设计模式、运行方法、相关资源及文档等这一过程。软件逆向的整个过程统称为软件逆向工程,过程中所采用的技术统称为软件逆向工程技术。究其义,这是个软件安全方面的技术。

    2014/11/08 Reverse_Engineering

  2. 重识new

    一、new primer

    2014/10/11 C/C++

  3. 动态规划法解数字加符号的运算结果

    背景   今天看到有同学华为面试,而我痛苦去不了,在外实习赶不上啊。看到很多论坛讨论这样一道题:1,2,3,….9 n个数,每个数字前可以加’+’ ‘-‘ 或空,要求输出所有满足计算结果为某数的所有表达式   我刚看到这个问题就觉得可以用动态规划做,经过一阵研究得出下面递推式: F(n,m)=∩F(k-1,m±Interger(a[k,n]))   遍历k∈[0,n-1], 如果不存在k则在数组[0-n]范围内无法找到结果为m的表达式,反之则在n=0时输出。欢迎大家一起测试。

    2014/09/03 Algorithm

  4. 测试编译器下限之不同大小返回值的处理

    写在前面的话   编译器会根据函数返回类型大小(sizeof操作符进行4字节对齐后的值)不同进行不同的操作。如果该值为4字节,那么默认会返回到EAX寄存器中,如果该值为8字节,则通常使用EAX寄存器装载结果的低4字节,EDX寄存器装载结果的高4字节。如果该值超过8,则根据编译器的不同会有不同的行为,在剩余寄存器足够用的情况下,通常会使用这些寄存器来传值,如果编译器发现现有寄存器无法满足返回值长度要求,那么就会在内存中开辟一块相对安全的栈区域用于存储该值,赋值完毕后,将起始位置指针传递给EAX。一般情况下,返回大小超过8字节的行为并不恰当,如果在设计不良的编译器中很有可能造成返回地址覆盖,也极为少见。(基于32位 MSVC) 对于4字节返回值,例如int,众所周知,返回值存在EAX 对于8字节返回值,例如longlong,众所周知,返回值存于EDX:EAX 对于8字节以上返回值,虽然编程方法错误(因为有些不良编译器可能直接返回栈地址),但是出于理论研究,还是想看看编译器怎么考虑。

    2014/08/10 Reverse_Engineering

  5. 自动生成系统关键api的hash函数

    背景   《0day安全 软件漏洞分析技术》第二版一书中,有一节动态定位API地址的shellcode,一年前看到该篇文章时,第一次发现hash函数的妙用,不过该文章的缺憾是需要对用到的api,自己分析出不产生碰撞的hash函数,如果api数比较多,用文中使用的hash函数就可能碰撞,因此有必要设计出一种自动适应算法自动生成散列函数。   文中是这么说的:shellcode最重要放到缓冲区,为了让shellcode更加通用能被大多数缓冲区容纳,总希望shellcode尽可能短。因此在函数名导出表中搜索函数名时,一般不会用”MessageBoxA”这么长的字符串直接比较。通常情况下我们会对所需的api函数进行hash运算,在搜索导出表是对当前遇到的函数进行同样的hash,这样只要比对hash所得的摘要就能判定是不是我们所需的api了,虽然这种搜索算法需要引入额外的hash算法但是可以节省出存储函数名字符串的代码。   现在考虑,如果想构造出hash表达式可以对任意api都生成不碰撞摘要,应该怎么做呢?基于算法复杂度和计算时间的考虑,应该采用多元一次表达式,设函数名字符串数组为name[64],则hash应为k0name[0]+k1name[1]+k2name[2]+….+k63name[63];现在就是选择一种算法计算出k0~k63。巧妇难为无米之炊,所以我们先要生成api列表,如何获取这个列表呢?列表中应该有哪些api呢?我们仅考虑系统关键函数kernel32.dll user32.dll gdi32.dll ntdll.dll中的导出函数(如需其它函数,做法类似)。参照我之前的一篇文章:http://www.0xaa55.com/thread-312-1-1.html

    2014/07/24 Algorithm

  6. 可执行文件另类加密

    操作方法:给定A.exe进行保护 1.使用生成工具去除A.exe所有段内容,例如

    2014/04/20 Windows

  7. win7磁盘读写操作

    直接放代码   正常情况下,Win7系统16扇区以后写操作是无效的,如果要破解这个通常会在驱动级实现,然而这里提供一种应用层实现方式: ```C++ HANDLE handle=CreateFile(“\\.\c:”,GENERIC_ALL,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); //GENERIC_ALL有时不好使,不过权限最大,如果用GENERIC_ALL返回INVALID_HANDLE则改成GENERIC_READ|GENERIC_WRITE BOOL ret; ret=SetFilePointer(handle,0x0000CC00,NULL,FILE_BEGIN); BYTE buffer[512]; memset(buffer,1,512); DWORD num; ret=DeviceIoControl(handle,FSCTL_DISMOUNT_VOLUME,NULL,0,NULL,0,&num,NULL);//注意FSCTL_LOCK_VOLUME无效 //下面要写数据了,注意别把自己的数据写了,自己修改上面的偏移 ret=WriteFile(handle,buffer,512,&num,NULL);//必须是扇区大小的倍数,否则报参数错 CloseHandle(handle);

    2014/04/18 C/C++

  8. xp扫雷程序的部分分析

    简介   xp扫雷很受欢迎,那么里面有什么古怪呢?让我们进行逆向分析。初学ollydbg,便出此文。

    2014/03/23 Reverse_Engineering