编译后的可执行文件居然被人轻易修改?

AV_15 2003-06-27 11:05:06
问题是这样的:
我有一个朋友学习破解别人程序,要我写 CrackMe 程序给他练习.我就写了一个简单的根据输入的 Name 计算对应的 Key 的模拟注册程序.可是他看了还不到5分钟就解决了.我不知道它如何修改 .exe 文件,把窗体标题改了(这倒不难),而且可能还修改了程序的判断部分,使得他无论输入什么 Key 都可以通过.而且他也可以推算出任意 Name 对应的 Key.
可能他把程序反汇编了,我也不太清楚.有没有哪位朋友知道这方面的有关信息,或者完全知晓如何修改,能不能指点一下?另外,我要如何才能对付类似这样的修改呢?
其实我也用过类似 SoftIce 的工具,似乎它们都要依靠拦截诸如 JMP 的跳转语句来达到破解的目的.但问题是,如果我不使用类似 if 的判断语句,那这样的模拟注册程序要怎么写啊?
我也不知道以上的推断是否正确.还是先谢谢大家了!谢了!!!
...全文
145 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
ksaiy 2003-06-28
  • 打赏
  • 举报
回复
对了,你的朋友是采用爆破的方法,就是改了关键的CALL,然后你输入什么都可以注册成功的~
ksaiy 2003-06-28
  • 打赏
  • 举报
回复
还有如果你加了壳,现在也有专门的脱壳工具,哈哈~~~~~~~~~~~~~~~~`
ksaiy 2003-06-28
  • 打赏
  • 举报
回复
哈哈~
他是改了跳转的关键CALL了~
你可以看这个里:
一.机械码,又称机器码.
ultraedit打开,编辑exe文件时你会看到
许许多多的由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F组成的数码,这些数码
就是机器码.
修改程序时必须通过修改机器码来修改exe文件.

二.需要熟练掌握的全部汇编知识(只有这么多)
不大容易理解,可先强行背住,混个脸儿熟,以后慢慢的就理解了
cmp a,b 比较a与b
mov a,b 把b的值送给a
ret 返回主程序
nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)***机器码的含义参看上面
(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop)
call 调用子程序
je 或jz 若相等则跳(机器码74 或0F84)
jne或jnz 若不相等则跳(机器码75或0F85)
jmp 无条件跳(机器码EB)
jb 若小于则跳
ja 若大于则跳
jg 若大于则跳
jge 若大于等于则跳
jl 若小于则跳
jle 若小于等于则跳
pop 出栈
push 压栈



上面这些一定要记主。破解的关键语句所在。

三.常见修改(机器码)
74=>75 74=>90 74=>EB
75=>74 75=>90 75=>EB

jnz->nop
75->90(相应的机器码修改)

jnz -> jmp
75 -> EB(相应的机器码修改)

jnz -> jz
75->74 (正常) 0F 85 -> 0F 84(特殊情况下,有时,相应的机器码修改)

四.两种不同情况的不同修改方法
1.修改为jmp
je(jne,jz,jnz) =>jmp相应的机器码EB (出错信息向上找到的第一个跳转)jmp的作用是绝对跳,无条件跳,从而跳过下面的出错信息

xxxxxxxxxxxx 出错信息,例如:注册码不对,sorry,未注册版不能...,"Function Not Avaible in Demo" 或 "Command Not Avaible" 或 "Can't save in Shareware/Demo"等 (我们希望把它跳过,不让它出现)
。。。
。。。
xxxxxxxxxxxx 正确路线所在

2.修改为nop
je(jne,jz,jnz) =>nop相应的机器码90 (正确信息向上找到的第一个跳转) nop的作用是抹掉这个跳转,使这个跳转无效,失去作用,从而使程序顺利来到紧跟其后的正确信息处

xxxxxxxxxxxx 正确信息,例如:注册成功,谢谢您的支持等(我们希望它不被跳过,让它出现,程序一定要顺利来到这里)
。。。
。。。
xxxxxxxxxxxx 出错信息(我们希望不要跳到这里,不让它出现)
。。。
。。。
五.爆破无敌口诀 背会此口诀,天下无敌,以后慢慢琢磨,仔细体会,收益多多。如此好的口诀,不要错过
一条(跳)就死,九筒(90)就胡 (对应上面的2.修改为nop)
一条(跳)就胡,一饼(EB)伺候 (对应上面的1.修改为jmp)
妻死(74)便妻无(75)
爸死(84)便爸无(85)

win98ddk 2003-06-28
  • 打赏
  • 举报
回复
方法来了:

你用一个EXE压缩工具处理过,他就改不掉了。比如aspack 2.11 什么的都可以
jun_01 2003-06-28
  • 打赏
  • 举报
回复
等他输入注册码后,并不要当时给他对或不对的答案,先把数据放起来。
等到启动时,读出数据,然后加载窗体,再执行一系列代码,判断密码是否正确,再执行一系列代码,最后弹出对话框,这样有用吗?欢迎讨论。
karl 2003-06-28
  • 打赏
  • 举报
回复
道高一尺,魔高一丈~~~~~~~~~~
exhx 2003-06-28
  • 打赏
  • 举报
回复
说实话我也用过soft-ice确实可以轻易的破解很多程序
lqdmafeng 2003-06-28
  • 打赏
  • 举报
回复
学习中。。。。。。
Sumie@Sam 2003-06-28
  • 打赏
  • 举报
回复
ASPack也不保险,现在脱壳程序好多啊
AV_15 2003-06-28
  • 打赏
  • 举报
回复
谢谢!
虽然我现在去除了 if 判断,他无法很快找出正确的修改方法,但他依然可以推算出很多 Key ,我不知道这到底是不是代码太简单的原因.但是,Key 总要有一个输出过程,我不知道是不是这里被他窥视到了.
还有,如果我把 Key 的运算放到 DLL 里,或派生出几个线程,其中只有一个运算 Key ,不知这样管用不管用?
先谢过了...!
cnssk 2003-06-28
  • 打赏
  • 举报
回复
第五节 拆解教程

实验对象:例题Chap4-eg-1.zip ;

破解工具:W32Dasm,Hiew;

1、思路提示:首先要试运行要破解的程序,了解其一些提示信息,如:文本/NAG屏/按钮等等.最重要的就是出错信息 .如: "Wrong serial.."记下,因为你在后面要用到它,你需要它来找到call出错messagebox的地方.当 W32Dasm反编译后你会看到一屏幕难懂的汇编码 .你还记得刚要你记下的那个message么? 此时单击在工具栏里的串式数据参考SDR (=String Data Reference).这个功能可是非常有用的.

在串式数据参考SDR中找到那个提示信息(它也许只显示了信息的一部分) ,此时双击它,来到相关代码处,再分析源代码。

2、运行crackme,输入假的序列号,点击CHECK,出现错误提示:"Incorrect try again!! "记下。

3、将crackmer备份一份,用W32DASM反汇编它。

4、一旦完成反汇编 , 点串式数据参考(string data reference)按钮 , 在列出的字符串列表中找到 : "Incorrect try again!! " 并双击它 . (注:如代码中有多处有此字串,你再次双击后,光标将出现在下一代码上)

5、关闭这个窗口回到主窗口 , 你应该能够看到下面这一行 :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401595(C)
|
:004015AD 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"CrackMe"//错误提示窗口的标题
|
:004015AF 686C304000 push 0040306C

* Possible StringData Ref from Data Obj ->"Incorrect try again!!"//错误提示处,我们来到这一行
|
:004015B4 6874304000 push 00403074
:004015B9 8B4DE0 mov ecx, dword ptr [ebp-20]


6、现在你必须从这行起向上找 , 直到找到有这样的命令为止 :cmp,jne,je,test 等等 .

CMP = 比较 (如 CMP EAX, EBX) <- 比较EAX和EBX
JE = 如果相等就跳转
JNE = 如果不相等就跳转
JL = 如果小于就跳转
JLE = 如果小于等于就跳转
JA = 如果大于就跳转
JAE = 如果大于等于就跳转
JMP = 无条件跳转

7、注意这一行代码:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401595(C)
|
:004015AD 6A40 push 00000040


:00401595(C) 是代码位置而不是offset,表示指令由00401595一行跳转到此 .此时你在利用菜单的转到代码位置功能或按shift+F12,在对话框中输入:00401595,你将来到此:


:00401585 8D4DE4 lea ecx, dword ptr [ebp-1C]
:00401588 51 push ecx
:00401589 8D55F4 lea edx, dword ptr [ebp-0C]
:0040158C 52 push edx

* Reference To: KERNEL32.lstrcmpA, Ord:02FCh
|
:0040158D FF1500204000 Call dword ptr [00402000]
:00401593 85C0 test eax, eax
:00401595 7516 jne 004015AD


8、此时你借助SOFTICE动态调试能很快找到序列号,在这我们今天用暴力法破解,注意 :

:0040158D FF1500204000 Call dword ptr [00402000]//真假序列号比较核心(调用函数lsrcmpa比较)
:00401593 85C0 test eax, eax//用eax当旗帜,如相等,则eax=0
:00401595 7516 jne 004015AD//如不跳转则注册成功

看明白了吗?要让程序接受任何注册码就只要把JNE (=不相等就跳)改成JE (=相等就跳).或把改成空指令nop(什么也不执行),这样前一各改法要注册就只能输入错误的注册码,后者可任意注册码。

9、将绿色的光条移到 :00401595 7516 jne 004015AD上 , 在窗口底部有一行字指示这句命令的偏移地址 , 此处为 @Offset 00001595h. 这就是应该修改的地方了 .



10、启动hiew, 打开crackme.exe,按 F4 然后选择 decode mode, 按 F5 输入偏移地址1595(@Offset 00001595h). 你应该看到下面这几行 :

?00401593: 85C0 test eax,eax
?00401595: 7516 jne .0004015AD

11、这就是修改的地方了,按F3进入修正状态,在机器码处直接用7416代替7516,按F9存獭;蛟谡庖恍邪碏2或回车进入小汇编修改状态,输入正确的指令。

12、第二种修改方法是用两个NOP指令(NOP指令机器码是90,是一个字节)代替机器码:7516,即改为:9090

13、运行 crackme, 随便输入几个字符试试 . 成功了 ! (当然这只是对那些简单的程序有效)

AV_15 2003-06-28
  • 打赏
  • 举报
回复
嗯,谢谢.
现在虽然不会被爆破,但依然被他的动态调试工具跟踪.我增加难度,拆分 Name 再运算,还是被看穿了.朋友说,他只多跟踪了两步就发现了.而且,我冗余代码也加了不少,还是不管用.

怎么办呢??唉...

AV_15 2003-06-28
  • 打赏
  • 举报
回复
To ksaiy(丹丹的木头):
谢谢你提供的信息!还有更多的吗?
yansea 2003-06-27
  • 打赏
  • 举报
回复
看雪论坛 www.pediy.com
大健 2003-06-27
  • 打赏
  • 举报
回复
gz
rustle 2003-06-27
  • 打赏
  • 举报
回复
aspack压缩过就困难多了

这是最简单的方法了
pankun 2003-06-27
  • 打赏
  • 举报
回复
我soft-ice用的不好,不敢多说....学习....
大大怪老张 2003-06-27
  • 打赏
  • 举报
回复
www.pediy.com
耙子 2003-06-27
  • 打赏
  • 举报
回复
你的程序越结构化,越简单,他越容易。
通常都是向楼上几位说的,增加大量的荣誉的分支语句,增大逻辑树的体积。
其次,增加单个分支的判断长度,就一个简单的步骤脱开走。

比如:
......
计算出一个数值 a 需要判断,先别急
..... 弄它几十行上百行其他语句,
在写 if a xxxx then
这样,增大了阅读的难度。

打开编译器的优化,去掉编译的调试信息(我曾经破解的一个BC的程序,调试信息都在,原码都看得见),弄得了最好在压缩一下,比如aspack。
AV_15 2003-06-27
  • 打赏
  • 举报
回复
谢谢,谢谢.
不过我想知道究竟写怎样的冗余代码才能像你们说的"让他麻烦"?
我都不知道循环和判断编译成汇编是怎样的.是不是 cmp xx,xx jmp xx........

还有,那个朋友说他更本没用动态汇编就发现破绽了.....
我只使用了一个 if 判断是否成功,不知是不是这个原因让他轻易得手?
谢谢!
加载更多回复(7)

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧