首页
社区
课程
招聘
程序的分析与破解
2004-7-19 15:27 4823

程序的分析与破解

2004-7-19 15:27
4823
此程序加了IP验证..这点让我头疼..

先分析一下吧....

此程序 在编译时使用了资源文件编译方法!在 XXX.exe 文件运行后 生成了 Lpatch.dat 这个文件! 其实他就是用来升级本地用的!第一次运行程序后..
Lpatch.dat会更新出一个XXX.INI 的文件...里面有此程序的IP连接..

要破解此程序就要改掉XXX.INI 里的内容..使之能单机运行...

1:Lpatch.dat.每次自动更新..不能改掉XXX.INI中的内容...
2:用UE打开XXX.exe.找到XXX.INI..改其名为YYY.INI.还是不行.
在XXX.exe 文件内也有IP验证.....

3:将Lpatch.dat 变个名字为 Lpatch.dat.EXE....
原来XXX.EXE里大家都找不到 IP 地址 原来是在 LPATCH.DAT.EXE 里面

关键是程序每次运行后 都会把固化在 XXX.EXE中的 文件从新生成并覆盖掉 除非把你修改的 在写回 XXX.EXE 文件中!或者 使用比较 厉害的方法 来完成..

XXX.EXE 读取 IP 是 使用的语句是:MOV EAX,0047C3F4 127.0.0.1 《---Lpatch.dat.EXE 中读取出来!(这里用127.0.0.1来表示)

分析到这...

要破解此程序.该怎么做...

如何取消Lpatch.dat...让XXX.exe 直接读取XXX.ini中的内容...

此程序已经困绕我几天了....始终破解不了..希望大家帮忙..希望高手指教..提点........

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
打赏
分享
最新回复 (4)
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-7-19 15:52
2
0
与脱壳无关
转 调试论坛
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
RoBa 16 2004-7-19 19:14
3
0
最初由 游戏而已 发布
关键是程序每次运行后 都会把固化在 XXX.EXE中的 文件从新生成并覆盖掉 除非把你修改的 在写回 XXX.EXE 文件中!或者 使用比较 厉害的方法 来完成..


就这么办呗,应该是不太难的SMC。:)
雪    币: 229
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
游戏而已 2004-7-21 15:22
4
0
此程序是已经脱壳。。脱壳后发现是是DELPHI 写的。。

    "Self Modifying Code",代码自修改,简称SMC,看名字就知道是狠角色,程序在运行过程中
自己修改自己的代码这项技术在病毒界、加密/解密界是应用相当广泛的技术。病毒与反病毒、
加密与解密都用这项技术相互对抗。

下面为了更清楚的说明一下我引一下老罗的相关文章 -- 浅析SMC技术

===========================================
今天让我们来看Win32ASM里面的高级一点的技术――SMC(当当当当……)!!!

SMC是什么意思?它的英文名叫“Self Modifying Code”,顾名思义,就是“代码自修改”(?)(不好意思,小弟的英语六级还没过,只能翻译成这样啦……)

“代码自修改”?哇,好高深啊!其实不然……

我们知道,Win32应用程序是运行在保护模式下的,每个Win32应用程序都有相互独立的4GB地址空间,并且已经摒弃了16位时代的把代码分为Data、Code等段的内存模式的做法;现在它们只有一种内存模式,即FLAT模式,意思是“平坦”的内存模式――再也没有烦人的64KB的段大小限制啦。如此一来,所有的Win32应用程序都能各自运行在一个连续、平坦、巨大的4GB空间中,作为程序员,也不用再跟段寄存器打交道,您可以用任意的段寄存器寻址任意的地址空间,是不是很方便呢?

不过且慢,Win32时代的编程虽然比之Win16时代已经方便了不止一个数量级,但是毕竟还有一些规则是需要遵守的。最明显的之一就是不能在程序运行的过程中随便更改代码段!

(咦?刚刚不是说了Win32里面没有段的概念了吗?怎么这里又来了一个“代码段”了?别急,请听我细细道来……)

虽然Win32下已经没有了“段”,但是您还是可以给自己的程序分成不同的“段”,一个“分段”的开始即是上一个“分段”的结束。Win32只有两种性质的分段:Data和Code。

实际上,在Win32里面的分段并不是像DOS下一样,为不同的段分别指出不同的段寄存器,因为Windows下只有一个4GB的段,Windows程序中的分段表现在当程序装载时,赋予不同的段不同的属性,比如说当你的程序加载时,对于Ring3程序来说,.code段是不可写的,而.data段是可写的,如果你尝试像在DOS下一样写自己的代码部分,你将会得到一个“很cool”的蓝屏错误。

怎么样?头晕了吗?如果没有的话,让我们继续!^_^

上面已经提到代码段是不能在程序运行途中更改的了,那么怎么又来了一个“SMC”技术呢?它是如何实现的?

其实关键就在于链接时的参数,只要指定了代码段的属性是可写的,那么就OK啦!(默认的参数是不可写的)。也就是说,我们在编译、链接带有SMC的Win32ASM时应该这样做:

ml /c /coff %1.asm
link /subsystem:windows /section:.text,RWE %1.obj

怎么样?明白了吗? /section:.text,RWE 这句指定了代码段(.text)的属性是RWE,含义是:R(ReadAble),W(WriteAble),E(ExecuteAble),也就是“可读可写可执行”。这样我们的程序就可以在运行途中自己改写自己的代码段啦,怎么样?是不是很爽呢?

下面给出了一个完整的带有SMC技术的Win32ASM例子,很容易理解的,记得要用上面的方法来编译和链接哦!

;***********************************************
;程序名称:演示SMC原理
;作者:罗聪
;日期:2002-10-2
;出处:http://laoluoc.yeah.net(老罗的缤纷天地)
;注意事项:如欲转载,请保持本程序的完整,并注明:
;转载自“老罗的缤纷天地”(http://laoluoc.yeah.net)
;***********************************************

.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

ShowMessage    proto
ReplaceMent    proto

.data
szMsg1        db    "这是未执行SMC之前的代码!", 0
szMsg2        db    "SMC已经执行!", 0
szCaption     db    "SMC demo by LC, 2002", 0
Replace_Len   dd    0

.code
main:
    ;第一次执行子程序ShowMessage,此时还没执行SMC操作
    invoke ShowMessage

    lea eax, ReplaceMentEnd      ;标号ReplaceMent的结束
    lea edx, ReplaceMentStart    ;标号ReplaceMent的开始
    sub eax, edx                 ;标号ReplaceMent的长度
    mov Replace_Len, eax         ;把长度储存起来

    ;关键代码!!!!!!!!!
    lea esi, ReplaceMentStart    ;标号ReplaceMent的开始
    lea edi, ShowMessageStart    ;原程序ShowMessage的标号的开始
    mov ecx, Replace_Len         ;标号ReplaceMent的长度
    rep movsb                    ;这里是最关键的语句!!!执行SMC操作!

    ;第二次执行子程序ShowMessage,此时已经执行了SMC操作。
    ;换句话说,ShowMessage的内容已经不是第一次运行时的内容了:
    invoke ShowMessage

    invoke ExitProcess, 0

ShowMessage    proc
    ;这里用“::”的话,就能够使标号成为全局性的
    ShowMessageStart::
        invoke MessageBox, NULL, addr szMsg1, addr szCaption, MB_OK
    ShowMessageEnd::

    ;用nop来预留空间,以便后面的SMC能够成功执行;
    ;否则如果空间不够,将有可能产生不可预测的错误:
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop

    ret
ShowMessage    endp

ReplaceMent    proc
    ;将要用来SMC的代码:
    ReplaceMentStart::
        ;invoke MessageBox, NULL, addr szMsg2, addr szCaption, MB_OK or MB_ICONINFORMATION
        push    MB_OK or MB_ICONINFORMATION
        lea     eax, szCaption
        push    eax
        lea     eax, szMsg2
        push    eax
        push    NULL
        lea     eax, MessageBox
        call    eax
    ReplaceMentEnd::

    ret
ReplaceMent endp

end main

怎么样?明白了吧?如果还有不够明白的地方,欢迎给我来信讨论!
[email]lcother@163.net[/email]

老罗
2002-10-2
===============================================

上面老罗的代码是借助于汇编实现的,实现关键是编译器连接时的参数来指定段是否可读写。
我们如何在Delphi这种高级程序语言中实现呢?用编译器连接开关?告诉你,想都别想。
经过我这段时间的研究终于有了一点心得,下面来看看我是怎么在Delphi中实现这种技术的

要修改代码就需要先找到代码,如何找?做标志,空说无益,我们还是来看看下面的代码段,
有这么一段代码,如,如果是试用版就执行相应的操作,如:

procedure TForm1.ModifiedCode(Sender: TObject);
var
  isTryVer: boolean;
  
begin
  isTryVer := CheckVer;
  
  if isTryVer then
  begin
    //执行试用版的功能
    ................    //省略代码若干
  end
  else
  begin
    //执行正式版的功能
    ..............    //省略代码若干
  end;
end;

这段代码经过反汇编后,Cracker改一改跳转,可以很容易的爆破这个软件

要是代码具有自修改功能,那么菜鸟级Cracker就很难对这个软件实行爆破了,修改成下面的代码:
procedure TForm1.ModifiedCode(Sender: TObject);
var
  isTryVer: boolean;

label tr1;
  
begin
  ....................        ////省略代码若干
  
  isTryVer = true;        //在程序中就写死了,这就是试用版
  
  if isTryVer then goto tr1;
  
  //执行正式版功能
  ..................        //省略代码若干
  tr1:
    //执行试用版功能
  .................          //省略代码若干
end;

是的,在程序中写死,这就是试用版,甚至还可以在
if isTryVer then goto tr1后写一个死循环、强退等爆力对抗代码,如果Cracker改了goto指令后
就会陷入这些对抗代码,至于这些怎么写,以防Cracker改对抗代码我以后再讲,今天就只讲SMC技术

哦,还没完呢,直接执行上面的代码就完蛋了,因为无论是正版用户或是试用用户执行的都是试用版功能
,是的,我们就是要在程序运行时修改上面那段代码,我们需要再另外一个过程来让,如果是正版用户让
isTryVer = false。。。
但在程序运行时如何找到这段代码在哪里呢,上面说过了,做个标志的话就简单了,于是我们再来改代码,如下:
procedure TForm1.ModifiedCode(Sender: TObject);
var
  isTryVer: boolean;

label tr1, lb1;
  
begin
  ....................        ////省略代码若干
  
  isTryVer = true;        //在程序中就写死了,这就是试用版
  
  if isTryVer then goto tr1;
  
  ;用nop来预留空间,以便后面的SMC能够成功执行;
  ;否则如果空间不够,将有可能产生不可预测的错误:  
  asm
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
  end;

  lb1:  
  //执行正式版功能
  ..................        //省略代码若干
  tr1:
    //执行试用版功能
  .................          //省略代码若干
end;
我们也用连续8个nop来在程序中加标志,nop 什么都不做,在内存中形如

807DFB00 cmp byte ptr [ebp-$05],$00
750D   jnz TForm1.ModifiedCode + $2A
  
90   nop
90   nop
90   nop
90   nop
90   nop
90   nop
90   nop
90   nop
lb1:
...
tr1:
...

$00是代码Delphi中的false(不同的反汇编工具,得到结果可能不同,可能是其它的代码如01,然后后面就是jz了)
于是我们只在内存中找到$9090909090909090,然后再回退3个字节,读取1个字节,再减1,写回原处
于是我们就得到了一个可用的程序,功能和本文第一个delphi程序实现的功能一样了,代码形如:
procedure TForm1.ModifyCode;
var
  lpBuffer: DWORD;
  mbi: _MEMORY_BASIC_INFORMATION;
  a: DWORD;
  BaseAddr: Pointer;
  hProcess: THandle;
   
begin
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessId);
  VirtualQuery(@ModifyedProc, mbi, sizeof(MEMORY_BASIC_INFORMATION));

  VirtualProtect(
    mbi.BaseAddress,
    mbi.RegionSize,
    PAGE_READWRITE,    // desired access protection
    mbi.Protect     // address of variable to get old protection
   );

  a := 0;
  lpBuffer := 0;
  BaseAddr := Pointer($0047170d);    //这个地址是我在Exe文件中根据标志找到的
  
  ReadProcessMemory(
    hProcess,
    BaseAddr,    // address to start reading
    @lpBuffer,    // address of buffer to place read data
    1,    // number of bytes to read
    a     // address of number of bytes read
   );

  Dec(lpBuffer);
  WriteProcessMemory(
    hProcess,
    BaseAddr,
    @lpBuffer,
    1,
    a
  );

  VirtualProtect(
    mbi.BaseAddress,    // address of region of committed pages
    mbi.RegionSize,    // size of the region
    mbi.Protect,    // desired access protection
    a     // address of variable to get old protection
   );
end;

于是程序在有需要的某个时候就自己修改自己内存中的代码以给用户完整的正式版功能了。。。
SMC技术在加密/解密技术中应用相当广泛,只要我们使用得当便可以很好的防止破解

       但还是不知道怎么解密。。。请高手指点。。。
雪    币: 229
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
游戏而已 2004-7-22 01:26
5
0
顶。。高手指点指点呀。。
游客
登录 | 注册 方可回帖
返回