破解步骤三——代码重建:
在此需要将限制的代码恢复(改变)成原来正常的代码,正常打印的Pascal代码应该如下所示:
文章出自:《编程手札》http://blog.csdn.net/nhconch
作者:狂歌痛饮
请从《编程手札》阅读原文,引用或转载可能导致内容不全。
根据Pascal代码可以很轻易的写出对应的汇编代码:
在此需要将限制的代码恢复(改变)成原来正常的代码,正常打印的Pascal代码应该如下所示:
- procedure _DoPrintReport;
- var
- i,j: integer;
- begin
- if 逐份打印 then
- begin
- i := 0;
- repeat
- if CanPrint(i) then PrintOnePage(i);
- i := i+1;
- until ((i>=TRMEndPages.GetCount-1) or (UserCancel));
- end
- else begin
- //逐页打印
- for i:=0 to TRMEndPages.GetCount-1 do
- for j:=0 to copies{打印份数} do
- begin
- if CanPrint(i) then PrintOnePage(i);
- if UserCancel then Break;
- end;
- end;
- end;
作者:狂歌痛饮
请从《编程手札》阅读原文,引用或转载可能导致内容不全。
- //第一段
- asm
- mov eax, [ebp + $08]
- cmp byte ptr [eax + $0C], $00 //判断是否逐份打印
- jz @@579 //不是转到逐页打印
- //`````````````````逐份打印`````````````````````````````
- xor ebx, ebx //ebx保存当前打印份数
- jmp @@557
- @@506:
- mov eax, [ebp + $08]
- mov eax, [eax - $08]
- mov eax, [eax + $58]
- call TRMEndPages.GetCount //取总页数
- dec eax //eax=页数-1
- mov ecx, eax //ecx保存循环次数
- xor eax, eax //eax保存当前打印页码
- @@1:
- push ecx
- push eax
- push ebp
- call _CanPrint
- test al, al //判断是否要打印
- jz @@528
- pop ecx {push ebp}
- pop eax
- push eax
- push ebp
- call _PrintOnePage
- @@528:
- pop ecx {push ebp}
- pop eax
- pop ecx
- inc eax
- loop @@1
- inc ebx //打印份数加1
- @@557:
- mov eax, [ebp + $08]
- cmp ebx, [eax - $0c] //对比打印份数
- jnl @@679 //打完退出
- mov eax, [ebp + $08]
- mov eax, [eax - $08]
- cmp byte ptr [eax + $30],