Ⅰ VS源代碼為什麼會自己還原到以前!!
你好
很高興為你解答
答案是:我還在用VS2010。如果排除忘記存檔或者存檔失敗這種低級錯誤的話,是不是VS2013已經集成了版本控制項系統,將你的代碼還原到以前的某個時間點了,如果真有的話,那也不用擔心了,修改的代碼還在。如果沒有版本控制,那隻能說這個現象太詭異了。
。
滿意請採納,謝謝!
Ⅱ 關於修改了網頁源代碼怎麼還原的問題
除非你的網頁是純文本的,否則不可能復原,因為現在的網頁一般都包含的了太多的圖片等引用內容,而這些引用內容指向的圖片是不會包含在源代碼中的,所以你不能復原。word是一個富文本編輯軟體,他所保存的html文件通常都有很多榮譽代碼和word格式。你可以查看一下其源代碼! 通常你可以使用記事本編輯html代碼並保存!
Ⅲ 猿編程代碼怎麼去掉
編程代碼怎麼去掉?都是加密的,無法去掉
Ⅳ 怎麼把二進制代碼還原
反編譯也要看是什麼文件才行啊並不是所有的二進制文件都可以進行反編譯的```有的二進制文件(.EXE文件)可以用反匯編進行修改```但是也不能把它們的源碼給反出來。別外,你要知道一點,編程語言有好多種類的,C、C++、C#、VB、PB等各種語言都可以寫成二進制的文件。。但是各種語言的結構和演算法又不一樣,但是又可以寫出相同功能的軟體。。
。。比如說,一個數學計算器軟體,以上的語言都可以寫一個功能和運行方式等都一樣的計算器出來,但是寫法是肯定不一樣的,但是當你反編譯時,你又知道它是用什麼語言寫的呢?。。。
。。舉個簡單的例子,我們打字的時候可以用拼音輸入法,也可以用五筆輸入法,也可以用手寫板輸入,但是輸出來的字都是一樣的,當讓你判斷這些字是用什麼方法輸入的時候,你什麼可能判斷得出來?
Ⅳ 被VM的代碼怎麼還原
1. 變形代碼長啥樣?
變形代碼在殼里用得越來越多,這種源於病毒的技巧被用來掩蓋代碼的真實目的,
以及對cracker進行身心折磨:-(。變形代碼不象普通的花指令那樣,用簡單的字
符串匹配即可清理(其生成過程也不同,花指令一般以在編程時插入宏的方式創建)。
下面的實例來自Themida虛擬機代碼:
01596EEF push edx
01596EF0 add ebx, ecx *
01596EF2 mov edx, 0
01596EF7 mov bh, 35h *
01596EF9 add edx, edi
01596EFB shr al, 3 *
01596EFE push ecx
01596EFF sub eax, ebx *
01596F01 jmp loc_14F562A
014F562A mov ecx, 7445h
014F562F neg ecx
014F5631 not ecx
014F5633 not ecx
014F5635 or ecx, 629Ah
014F563B jmp loc_14FA94D
014FA94D sub al, dl *
014FA94F or ecx, 205Ch
014FA955 xor ecx, 0FFFFEBFFh
014FA95B mov bl, 8Ah *
014FA95D add ecx, edx
014FA95F add ah, dh *
014FA961 jmp loc_1594A3C
01594A3C mov esi, [ecx]
01594A3E mov bl, ch *
01594A40 pop ecx
01594A41 mov ebx, 7570h *
01594A46 mov edx, [esp]
01594A49 add esp, 4
這段代碼非常典型,我們可以嘗試手工清理。其中的3個jmp是所謂的置換jmp,即人為將
代碼分塊,打亂其物理存放位置,再用JMP指令鏈接。
除了JMP指令,其中還夾雜了一些垃圾指令(帶*號的行,從代碼的邏輯可以識別),拿掉這
些JMP和垃圾指令後剩下:
01596EEF push edx
01596EF2 mov edx, 0
01596EF9 add edx, edi
01596EFE push ecx
014F562A mov ecx, 7445h
014F562F neg ecx
014F5631 not ecx
014F5633 not ecx
014F5635 or ecx, 629Ah
014FA94F or ecx, 205Ch
014FA955 xor ecx, 0FFFFEBFFh
014FA95D add ecx, edx
01594A3C mov esi, [ecx]
01594A40 pop ecx
01594A46 mov edx, [esp]
01594A49 add esp, 4
014F562A - 014FA955對ecx的賦值及計算,其結果為0,可以壓縮為1句,現在很容易
看出代碼的真正含義了:
01596EEF push edx ----------------------\
01596EF2 mov edx, 0 \
01596EF9 add edx, edi \
01596EFE push ecx -------\ \
014F562A mov ecx, 0 \ \
014FA95D add ecx, edx mov esi,[edx] mov esi,[edi]
01594A3C mov esi, [ecx] / /
01594A40 pop ecx -------/ /
01594A46 mov edx, [esp]--- pop edx ----/
01594A49 add esp, 4 -----/
這里實際使用了2種代碼模式:
MOV Reg,[ESP]/ADD ESP,4 -> POP Reg
PUSH Reg1/MOV Reg1,Imm/ADD Reg1,Reg2/Operate Reg3,Mem/POP Reg1 -> Operate Reg3,[Reg2+Imm]
(這里Reg1用來生成內存地址)
2. 怎樣生成變形代碼?
置換JMP的生成過程如下,將代碼隨機劃分為片斷,例如每段1-10行,用數據結構
(如List)管理代碼塊信息,然後混洗,以下為偽碼:
ESI = Initial address of instructions
EDI = Address of last instruction
; 用第1-60h行代碼創建若干代碼片段,每段8-16行
Given ESI = 00000000h,
EDI = 00000060h
while(ESI < EDI)
Store ESI
ESI += Random(8)+8
Store ESI
if((ESI+0F > EDI)
Store ESI,EDI
break;
end if
end while
Result (for example):
DD 00000000h,0000000Ah <- 1 (第0-10行)
DD 0000000Ah,00000017h <- 2
DD 00000017h,00000023h <- 3
DD 00000023h,00000032h <- 4
DD 00000032h,0000003Dh <- 5
DD 0000003Dh,00000049h <- 6
DD 00000049h,00000052h <- 7
DD 00000052h,00000060h <- 8
洗完後的結果:
DD 00000032h,0000003Dh <- 5
DD 00000023h,00000032h <- 4
DD 0000000Ah,00000017h <- 2
DD 00000000h,0000000Ah <- 1
DD 00000017h,00000023h <- 3
DD 00000052h,00000060h <- 8
DD 0000003Dh,00000049h <- 6
DD 00000049h,00000052h <- 7
按洗完的順序物理擺放代碼,每塊代碼在末尾用jmp跳到邏輯上的下一塊,保持代碼原來的
執行順序,由於代碼物理位置的變化,有些指令需要修正(call,jmp,jcc等)。
程序執行時,eip會隨著執行自然落到物理位置的第1塊(但這並不是程序邏輯的第1塊,具體
說是第5塊,第1塊現在排在第4),所以在混洗後的第1個物理塊前,應該有1句:
JMP EntryPoint(處理前代碼的首句,在第1塊內)
變形代碼可按預定義的模式生成。隨機選擇合適的模式對代碼進行擴展,這是前面壓縮過程
的逆反。這個過程是遞歸的,需要定義停止條件(如遞歸深度)。如:
push eax -> sub esp,4 -> push ebp -> ...
mov [esp],eax mov ebp,esp
add ebp,4
sub ebp,4
xchg ebp,[esp]
pop esp
mov [esp],eax
代碼的物理膨脹同樣需要修正指令。顯然,變形代碼的生成過程必須有反匯編引擎的支持。
僅僅有這些是不夠的。cracker同樣可以藉助反匯編引擎重建代碼,只要識別出匹配的代碼序列
即可對擴展後的代碼進行壓縮。然而,如果在有效的代碼中夾雜入垃圾代碼,重建難度就直線上
升了。例如:
sub esp,4
shl ebp,2 <- 垃圾指令
mov [esp],eax
中間的1句是垃圾指令,這用肉眼很容易識別,但用程序來做就沒這么簡單了。這意味著在檢測代
碼序列,與預定義模式進行比對時,允許對不連續指令進行匹配,而這樣做誤判幾乎是無法避免的。
或許更好的解決方式是使用emulator,從代碼的演算法(而不是具體的指令)來分析,類似啟發式反
病毒。
注意,在上面的例子中,加入shl ebp,2(或者別的什麼指令,如add ebp,1234),前提是當前ebp是
空閑寄存器,可隨意使用。簡單的處理可以是對空閑寄存器進行約定,比如約定某段代碼不使用
ebp,但這樣做強度不夠,更好的辦法是能判斷出當前位置可用的空閑寄存器。
z0mbie的XDE反匯編引擎就帶有這樣的功能(實際上這大概是其最重要的設計目的之一)。XDE中最
重要的概念是對象集(object set),即指令讀寫的registers,memory等,表示為1個DWORD中的對應
位。被反匯編的指令,結果數據結構中包含了該指令讀取的源對象集(src_set)與寫入的目的對象
集(obj_set)。具體細節可參考XDE源碼及z0mbie的<Permutation conditions>。下面的代碼是
XDE v1.02帶的例子,演示了獲取空閑對象集(英文注釋是原代碼帶的)。
int AnalyzeRegs( CMistfall* M)
{
HOOY* h; // current element of the file, instruction or anything else
// step 1/3 -- mark all registers as "used"
// 對List內的每條指令,初始化為所有對象都被佔用
ForEachInList(M->HooyList, HOOY, h)
{
h->regused = XSET_UNDEF; // XSET_UNDEF=0xFFFFFFFF
}
// step 2/3 -- for each instruction, clear dst_set&~src_set
ForEachInList(M->HooyList, HOOY, h)
{
if(h->flags & FL_OPCODE)
if((h->flags & FL_ERROR) == 0)
{
xde_instr instr;
xde_disasm(h->dataptr, &instr);
// update h->regused
// 對鏈表上的每個指令節點,計算出對應的空閑對象集。仔細看看這個位運算:
//
// 1. ~instr.src_set:
// 不作為當前指令src_set使用的obj_set
//
// 2. instr.dst_set & (~instr.src_set):
// 取1的結果與當前指令目的對象集的重疊。1取到的onj_set只是當前指令未用,但後續的
// 指令可能會使用,並不能判斷為空閑。與的結果是,未作為當前指令src使用,同時被用作
// 當前指令的dst,這個結果就是從當前指令可以判斷出的空閑obj_set
//
// 這種策略很保守,取到的結果可靠,但能取到的obj_set很有限,大部分時候為空。
// 如add eax,ebx:
//
// ~instr.src_set = {ecx|edx|esp|ebp|esi|edi|memory}
// dst_set = {eax|flags}
// 與的結果為0,即僅憑這條指令,取不到任何空閑obj_set數據。
//
// 那麼什麼指令能取到空閑obj_set? 可以立刻想到1個;-)
// mov eax,12345678
// 此時eax為空閑寄存器,即在這條指令之前,可以插入指令,隨意使用eax
// (add eax,ebx/shl eax,cl/...)
//
// 3. ~(instr.dst_set & (~instr.src_set))
// 取反的結果對應不能判斷為空閑的obj_set,這個結果可能比指令真正使用的obj_set大。
h->regused &= ~(instr.dst_set & (~instr.src_set));
//
// incorrect, need to be replaced with recursive subroutine analysis.
// however, the following means:
// "CALL'ed subroutines doesnt use FLAGS as a source_object"
//
if (XDE_CMD(instr.flag) == C_CMD_CALL)
h->regused &= ~XSET_FL;
}
}
// step 3/3 -- propagate zero bits within freeset, until possible;
// works similar to "wave" algo
// 從2得到的空閑obj_set是很少的,這里使用"波浪"演算法傳遞free set
for(;;)
{
int modified = 0;
ForEachInList(M->HooyList, HOOY, h)
{
if (h->flags & FL_OPCODE) // 當前節點為代碼
if ((h->flags & FL_ERROR) == 0)
if (h->next) // 存在後續節點,也為代碼
if (h->next->flags & FL_OPCODE)
if ((h->next->flags & (FL_LABEL|FL_ERROR)) == 0)
{
xde_instr instr;
xde_disasm(h->dataptr, &instr);
if (((instr.src_set|instr.dst_set) & (~h->next->regused)) == 0)
{
// 1. instr.src_set|instr.dst_set為當前指令讀寫的obj_set
//
// 2. ~h->next->regused 為下一句指令的空閑obj_set(來自第2步)
//
// 這個條件為true的含義是: 當前指令使用的obj_set(包括src和dst)
// 與下一句指令的空閑obj_set不存在交叉,即下一條指令的空閑obj_set
// 當前指令沒有使用
//
// 條件滿足,會執行h->regused &= h->next->regused
// 即h->next->regused內對應為0的位(空閑obj_set)被傳遞到當前指令
//
// ForEachInList循環遍歷所有指令,每次隻影響了相鄰的2條指令
//
// 由for(;;)和ForEachInList構成的2重循環的目的,在於盡可能地傳遞
// 空閑obj_set信息,在每條指令位置提取出盡可能多的空閑obj_set
if ((h->regused & h->next->regused) != h->regused)
{
// h->regused的某位為1,h->next->regused的對應位為0時條件為
// true,即某個obj,對下一條指令確定為空閑,對當前指令不能判斷
// 為空閑。注意這個檢查是在修改當前指令的regused(即下面的
// h->regused &= h->next->regused)之前做的。
// 有了外面的if作保證,這個原來對當前指令"可能使用"的obj可明
// 確判斷為空閑。
// 注意對1條指令,src_set,dst_set是通過反匯編得到的確切數據,
// 即當前指令肯定要使用的obj_set。這和regused是不同的概念。
// regused中為0的位代表空閑obj,為1的位代表不能確切判定為空
// 閑obj(當前指令不一定使用)。regused涵蓋的范圍>= src_set|dst_set。
// regused預置為0xFFFFFFFF(全部佔用),通過第2步的分析及前後
// 指令空閑obj_set的傳遞來剔除空閑obj_set。
// 當條件為true,增加modified,表示相鄰指令間出現了空閑obj_set
// 傳遞。結束ForEachInList後進入下一輪for(;;)再次遍歷指令鏈表
modified++;
}
h->regused &= h->next->regused;
}
}
}
if (!modified) break;
}
return 1;
} // AnalyzeRegs
用這段代碼測試了幾個kernel32中的API,對空閑obj_set的識別效果似乎還不夠好,不過這種做法
是可行的。另外,這里的代碼雖然很短,讀起來並不容易,但願我沒有理解錯;-)。
MetaPHOR還包括寄存器變換(隨機選擇不同的寄存器),變數選擇,用不同的opcode編碼實現同樣的
功能等等.
Ⅵ 猿編程怎麼替換字典里的值
首先在PyCharm軟體中,打開一個Python項目。
2
/7
在Python項目中,新建並打開一個空白的python文件(比如:test.py)。
3
/7
在python文件編輯區中,輸入:「dictVal = {'name':'Beijing', 'age': 88}」。
4
/7
接著輸入:「dictVal['name']='Python'」,點擊Enter鍵。
5
/7
然後輸入:「print(dictVal)」,列印檢查結果。
6
/7
在編輯區域點擊滑鼠右鍵,在彈出菜單中選擇「運行」選項。
7
/7
在運行結果窗口中查看運行結果,可以看到已經更改了字典中「name」鍵對應的特定項。
Ⅶ java編程時一段代碼刪錯了怎麼復原
如果是svn共享的話,就使用team更新應該就會復原了。如果是手誤在沒有關掉java文件的情況下使用ctrl+z就可以還原吧。
Ⅷ 怎樣可以把已經做好的軟體還原成製作軟體時的完整的代碼
難度很大,要脫殼,逆向工程,甚至不能還原成編程時的代碼。
Ⅸ 怎樣將用易語言寫的EXE文件和DLL文件重新還原成代碼呀,
不可以的,,就和 做成香腸的豬肉永遠變不回豬了一樣!
你可能剛接觸易語言感覺很新鮮,看到別人做的軟體,就覺得很好,,其實用易語言時間長了,你就會發現很簡單的。。先把基礎學好吧!
如果你真有心學校編程的話,建議你不要把時間浪費在易語言上,雖說是 漢字編程,但是對一些專業軟體和一些大型軟體,他還沒資格!
學習VC,DELPHI,等都比學這個要有前途
Ⅹ 怎麼把exe文件的代碼還原
牛..,,
那是大現實滴
一般編程軟體不允許其所編譯出來的
EXE文件
被
反編譯
.
如需要修改EXE文件一般要對程序源代碼進行修改,然後重新編譯..
或訴你可以到一些黑客網站找找看有沒有類似的工具,不過即使有也只能進一部份語言所編譯出來的EXE文件進行反編譯.不可能適應用全部EXE文件,估計這種工具99%是要收費的。