zoukankan      html  css  js  c++  java
  • 逆向工程——注册篇

    共享软件要注册,于是很多人动了歪主意,然后美其名日——逆向工程。

    用“网络填表终结者(共享软件)”做例子简单介绍一下。

      

    下载了网络填表终结者后用langague.exe侦壳发现加的是aspack壳

    用aspcakdie脱壳后,就可以对它进行注册破解了。

    要达到免注册的目的可以有很多方式,简单介绍一下。

    1、  爆破

    先注册一下,

    用win32dasm反汇编一下下载的网络填表终结者的主程序FormGhost.exe,找到参考字符串(注册码错误),

    向上看代码发现call。。。jne。。。语句

    ,这是一种经典的垃圾算法,意思就是跟正确注册码对比,如果错误则跳转到错误提示处(jump not equal---jne),只要改成je,即正确才跳转即可。

    效果如图

    2、  完全破解

    这指的是明白了注册机制后得到或者算出注册码,还是这个例子,这下用ollydebug载入那个垃圾软件,在刚才的语句处下中断,然后注册试试

    注册机制是在中断处拿出正确码与输入做比较,所以可以在寄存器EAX中和堆栈中看到484c8f9,这是注册码,旁边的222是我输入的,很明显它想让它们对比,看相不相等。

    3、  注册补丁

    这又有一个问题了,没有这些工具怎么办,一般人谁会准备着这些东西,难道要先下载一通?所以可以做一个补丁然后发布给其他所有人

       补丁制作工具很多,现在用codefusion做例子。

      Codefusion不但可以制作文件补丁,意思就是通过比较破解前和破解后程序的区别,自动生成补丁。 也可以制作内存补丁,意思就是通过修改程序在运行时的内存指令达到目的。

    生成补丁后放到原目录下,首先运行它一次即可注册了。

    效果如图

    4.高级语言修改内存(我以vc为例)

         

    //cracked by zhuang

    #include<windows.h>
    /*实际上APIENTRY是个宏,其定义为
    #define   APIENTRY   WINAPI

    而WINAPI也是个宏,其定义为
    #define   WINAPI   __stdcall
    这是个关于调用时压栈顺序的修饰符. (调用约定)*/


    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
         
    {
     

     unsigned int OBJ_ip1=0x004ACAD7;//修改代码的偏移地址
     unsigned int OBJ_patch[1]={0x90};//其中的90则是NOP的十六进制,占一个字节
     
     unsigned int OBJ_ip2=0x004ACAD8;//修改代码的偏移地址

      
     unsigned int OBJ_ip3=0x004ACAD9;//修改代码的偏移地址

     
     unsigned int OBJ_ip4=0x004ACADA;//修改代码的偏移地址
     
      
     unsigned int OBJ_ip5=0x004ACADB;//修改代码的偏移地址

     unsigned int OBJ_ip6=0x004ACADC;//修改代码的偏移地址

     
     HWND hwndOBJ=FindWindow(NULL,"FormGhost 网络填表终结者 -未注册版");//获得游戏的窗口句柄
     DWORD PID;
     HANDLE hProcess;//HANDLE是操作系统一系列内核对象的句柄。HWND仅是窗口对象的句柄
     
     if (hwndOBJ!=0)
     {
      SetForegroundWindow(hwndOBJ);//找到句柄后将游戏设置为当前窗口
      GetWindowThreadProcessId(hwndOBJ,&PID);//得到游戏的进程ID
      hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);//打开游戏进程
      WriteProcessMemory(hProcess,(void *)OBJ_ip1,OBJ_patch,1,0);//写入修改后的代码
       WriteProcessMemory(hProcess,(void *)OBJ_ip2,OBJ_patch,1,0);//写入修改后的代码
        WriteProcessMemory(hProcess,(void *)OBJ_ip3,OBJ_patch,1,0);//写入修改后的代码
         WriteProcessMemory(hProcess,(void *)OBJ_ip4,OBJ_patch,1,0);//写入修改后的代码
          WriteProcessMemory(hProcess,(void *)OBJ_ip5,OBJ_patch,1,0);//写入修改后的代码
           WriteProcessMemory(hProcess,(void *)OBJ_ip6,OBJ_patch,1,0);//写入修改后的代码
      
      CloseHandle(hwndOBJ);
      CloseHandle(hProcess);
     }
     else
      MessageBox(NULL,"没有启动吧?","错误!",NULL);
     
     
     
     return 0;
    }

        

  • 相关阅读:
    1.时间复杂度与空间复杂度分析
    数据结构与算法之重头再来
    MySQL时间字段与业务代码取出的时间不一致问题
    [redtiger]在线靶场level3
    win10 卡顿 MsMpEng.exe进程
    react 笔记 局部打印 print
    react table td 自动换行
    kali apt-get update release文件过期
    ubuntu怎么切换到root用户,切换到root账号方法
    winscp连接kali 使用预置密码验证 拒绝访问
  • 原文地址:https://www.cnblogs.com/encode/p/2610611.html
Copyright © 2011-2022 走看看