S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

OllyDBG 之旅 (十三)

Posted on 2009-10-07 15:40 S.l.e!ep.¢% 阅读(290) 评论(0)  编辑 收藏 引用 所属分类: Crack

再次将C++的代码优化

#include <iostream>
#include <stdlib.h>
#include <vector>
using namespace std;

// 模拟ASM的 PUSH, POP 操作
template<class T>
class Stack
{
public:
 void push(T data)
 {
  vstack.push_back(data);
 }
 
 void pop(T& data)
 {
  if (vstack.empty())
  {
   data = 0;
  }
  else
  {
   data = vstack.back();
   vstack.pop_back();
  }
 }
 
private:
 vector<T> vstack;
};

typedef unsigned long DWORD;

Stack<DWORD> thisStack;

__int64 n402182 = 0xFEDCBA98;

std::vector<DWORD> g_stack;

void XChange(DWORD& a, DWORD& b)
{
 DWORD c = 0;
 c = a;
 a = b;
 b = c;
}

int SHR(DWORD& a)
{
 int nBit = a & 0x01;
 a >>= 0x01;
 return nBit;
}

void XOR_HIGH_LOW(DWORD& a)
{
 char value[2] = {0};
 memcpy(value, &a, sizeof(short));
 value[1] |= value[0];
 memcpy(&a, value, sizeof(short));
 
}

DWORD fun(DWORD nECX)

 printf("0x%X\n", nECX);

    if( nECX <= 8 )       // cmp ecx, 80
    {
  printf("return\n");
  return nECX;         // jle short 004011F0
 }
 
    thisStack.push(nECX);    //  push ecx

    DWORD nESI  = nECX;      //  mov esi, ecx
    nECX &= 0xFF;            //  and ecx, 0FF
    DWORD nEDI = 0x549417E7; // nEAX 值   mov edi, eax  //////////////////////  EAX 值
   
    if( nECX > 8 )            // cmp ecx, 8; jle short 004011B0
 {
  nEDI = 0x02F23D32;    // nEBX 值  mov edi, ebx /////////////////////   EBX 值
  nECX /= 16;           // shr ecx, 4
 }
 
 do
 {
  _asm rol nEDI, 8       // rol edi, 8
 }
    while( !SHR(nECX) );         //SHR ecx, 1; jnz short 004011B0
   
    nESI /= 256; 
    nEDI &= nESI;
    nEDI &= 0xFF;

    thisStack.pop(nECX);
 
    nESI = 0x80;    // mov esi, 80
 
 do
 {
  int nResult = (nESI & nEDI);
  
  while( nResult != 0 )           // test esi, edi; je short 004011EC
  {
   nEDI ^= nESI;
   nECX &= 0xFF00;   // and ecx, 0FF00
   XOR_HIGH_LOW(nESI);          // xor ch, cl
   nECX ^= nESI;                // xor esi, ecx
   // n402182++;   // push ecx; inc dword ptr [402182] // n402182 地址
   nECX = fun(nECX);   // call 00401190
   nESI = 0x80;    // mov esi, 80
   nResult = (nESI & nEDI);
  }

 }while( SHR(nESI) != 1);
 
 return nECX;
}

void main()
{
 fun(0x0FF01);

 //printf("0x%x\n", fun(0x0FF01));
}


 


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理