Love 梦想 发表于 2011-4-22 19:32:45

搜索并修改文件中固定的一段十六进制代码问题

本帖最后由 soldier 于 2011-4-28 15:50 编辑

之前设计的破解程序的文件地址都是固定的 只要作者一更新主程序 只能重新修改文件地址 所以就想到试试搜索关键性代码 然后修改 这样就能解决这个问题了下面的程序是搜索到了 关键性代码 但是就是改不了 郁闷的很···
大伙都看看 是怎么回事··· 编译环境是DEV C++


#include <stdio.h>
#include <unistd.h>
#include <windows.h>

int main()
{
    system("COLOR 0a");
    system("title O(∩_∩)O~~欢迎使用由【遲、钝dè豬】设计的程序");
    printf("======================================================================\n");
    printf("\n\tU盘杀毒专家-USBKiller V3.1 Build1102 破解程序...\n");
    printf("\n======================================================================\n");
    printf("\t\t\t\t\t\t遲、钝dè豬 QQ:1007566569\n\n");
    MessageBox(0,"\n【注意】:此程序只为技术研究,若喜欢【U盘杀毒专家】请购买正版...\n\n\t 毕竟程序是一句一句代码写出来的,需要花费很多的精力与时间...\n","注意!",MB_OK);
    MessageBox(0,"【注意】:本程序需放在该软件目录中,主程序原名【USBKiller.exe】不得更改...","提示",MB_OK);
   
    FILE *fp=NULL;
        int data=0;
        int i=0,h=0; // 记录 加/解密 字节数
        int d;
    char rvir[]={0XEB};
    if((fp=fopen("已被破解.exe","r"))==NULL)
    {
      if((fp=fopen("USBKiller.exe","rb+"))==NULL)
      {
         printf("----------------------------------------------------------------------\n");
         printf("无法打开或修改文件...【USBKiller.exe】可能正在运行...正在结束其进程...\n\n");
         system("TASKKILL /F /T /im USBKiller.exe");
         printf("----------------------------------------------------------------------\n\n");
         
      }               
      if((fp=fopen("USBKiller.exe","rb+"))!=NULL)
      {       
            system("copy USBKiller.exe 备份文件.exe>>%windir%\\temp\\tmp.tmp");
                    fseek(fp,0,2); // 将指针指向文件尾端   
                    d=ftell(fp); // 读取文件大小并存入d
                    fseek(fp,0,0); // 重新指向文件开端
            printf("正在搜寻关键代码...\n\n");
            for(i=1;i<=d;i++) // 判断文件是否读取完毕   原本是想用变量 i 来记录指针所指向的位置 即文件地址 但现在貌似 错了
            {       
                fread(&data,0x1,1,fp); // 读取每一字节
                        if(data==0xFF)
                        {
                            fread(&data,0x1,1,fp); // 读取每一字节
                            if(data==0x2C)
                            {
                               fread(&data,0x1,1,fp);
                               if(data==0X01)
                              {
                                 fread(&data,0x1,1,fp);                     
                                 if(data==0X72)// 其实应该修改这里的 把72 改 EB 就能破解了但我的目的不在于破解
                                 {
                                    fread(&data,0x1,1,fp);
                                    if(data==0x0D)
                                    {
                                          fread(&data,0x1,1,fp);
                                          if(data==0x2C)// 修改这里只是演示 由于时间关系 暂时这样设计先
                                          {                                       
                                             fwrite(rvir,0x1,1,fp); // 修改其代码
                                             fclose(fp);// 关闭文件
                                             system("copy USBKiller.exe 已被破解.exe>>%windir%\\temp\\tmp.tmp");
                                             system("copy 备份文件.exe USBKiller.exe>>%windir%\\temp\\tmp.tmp");
                                             unlink("备份文件.exe");
                                             MessageBox(0,"O(∩_∩)O~~~破解成功...准备运行【已被破解.exe】...\n\n【USBKiller.exe】主程序需要保留它以备升级病毒库时供升级组件验证...","~O(∩_∩)O~破解成功~",MB_OK);
                                             spawnl(P_NOWAIT, "已被破解.exe", NULL);
                                             exit(0);
                                          }
                                    }
                                 }
                                 else if(data==0xEB)
                                 {
                                        printf("\n\n----------------------------------------------------------------------\n");
                                        printf("\t【USBKiller.exe】主程序已被破解,不需要再次破解.....");
                                        printf("\n----------------------------------------------------------------------\n\n");   
                                        system("pause");
                                        exit(0);                              
                                 }
                                 else
                                        MessageBox(0,"无法破解该程序...可能作者已经更改其密钥算法或程序被加密!","错误",0);                                                   
                              }
                            }
                        }
                     
               
            }
      }
      else
      {
         printf("----------------------------------------------------------------------\n");
         printf("无法打修改该文件,请检查该程序的文件属性是否为只读?...\n\n");
         printf("----------------------------------------------------------------------\n\n");
      }
    }
    else
    {
      MessageBox(0,"检测到曾经被破解过的程序【已被破解.exe】存在...","提示",MB_OK);
      fclose(fp);
    }
system("pause");
exit(0);
}

Love 梦想 发表于 2011-4-23 10:45:31

咋就没人回答咧...

故乡的风 发表于 2011-4-23 11:19:58

不好意思,个人能力有限,对这种高深的问题实在是无能为力啊!!!

Love 梦想 发表于 2011-4-23 11:21:21

回复 故乡的风 的帖子

只是 文件操作 的知识点啊 ..学到文件操作 就 应该能看懂把...

小甲鱼 发表于 2011-4-23 23:08:18

改不了?能够显示MessageBox(0,"O(∩_∩)O~~~破解成功...准备运行【已被破解.exe】...\n\n【USBKiller.exe】主程序需要保留它以备升级病毒库时供升级组件验证...","~O(∩_∩)O~破解成功~",MB_OK);这句吗?跟踪下,看到这句的时候下断点,看数据是否更改,如果更改了结束程序他又恢复了就可能是有进程守护或线程守护。

Love 梦想 发表于 2011-4-24 02:23:49

回复 小甲鱼 的帖子

不 不可能,我研究过它的程序,没有进程守护,而且通过C32 找到关键跳的文件地址直接用 C 设计一个程序 指定那个文件地址 就可以修改并且成功破解...

而且 在   fwrite(rvir,0x1,1,fp); // 修改其代码   是被执行的 因为我曾经改成这样


                                          if(data==0x2C)// 修改这里只是演示 由于时间关系 暂时这样设计先
                                          {         
                                             puts("找到指定位置...");                           
                                             fwrite(rvir,0x1,1,fp); // 修改其代码
                                             puts("已经执行修改...");
                                             fclose(fp);// 关闭文件
                                             system("copy USBKiller.exe 已被破解.exe>>%windir%\\temp\\tmp.tmp");
                                             system("copy 备份文件.exe USBKiller.exe>>%windir%\\temp\\tmp.tmp");
                                             unlink("备份文件.exe");
                                             MessageBox(0,"O(∩_∩)O~~~破解成功...准备运行【已被破解.exe】...\n\n【USBKiller.exe】主程序需要保留它以备升级病毒库时供升级组件验证...","~O(∩_∩)O~破解成功~",MB_OK);
                                             spawnl(P_NOWAIT, "已被破解.exe", NULL);
                                             exit(0);
                                          }


程序是可以显示出 找到指定位置 和 已经执行修改这两行字!并且 在程序目录是有 已被破解.exe 这个文件
但是通过 MD5 发现和原来未被破解的 MD5 是一样的!   我怀疑是不是 指针所指的位置 有问题···
但是 如果有问题的话 那它应该找不到2C 这一个字节啊看IF指令就知道啦被我严格限制了!!!

Love 梦想 发表于 2011-4-24 04:27:43

搞定了!修改过后的源码 和 程序都已经发表到 作品展示区了

鱼C工作室.YCGZS 发表于 2015-12-13 12:04:55

:big:sad
页: [1]
查看完整版本: 搜索并修改文件中固定的一段十六进制代码问题