當前位置:首頁 » 編程軟體 » 數據類型反編譯

數據類型反編譯

發布時間: 2023-03-11 18:15:49

Ⅰ C++中的注釋,如//和/* */的注釋內容,會參與編譯嗎即反編譯時會被看到嗎

這個建議在CSDN技術專區裡面找到答案。

(1)數據類型反編譯擴展閱讀:由硬體系統和軟體系統所組成,沒有安裝任何軟體的計算機稱為裸機。可分為超級計算機、工業控制計算機、網路計算機、個人計算機、嵌入式計算機五類,較先進的計算機有生物計算機、光子計算機、量子計算機等。計算機發明者約翰·馮·諾依曼。計算機是20世紀最先進的科學技術發明之一,對人類的生產活動和社會活動產生了極其重要的影響,並以強大的生命力飛速發展。它的應用領域從最初的軍事科研應用擴展到社會的各個領域。

Ⅱ lua 怎麼反編譯

1.Lua的虛擬機指令,5.2 的有40條

Lua的指令使用一個32bit的unsigned integer表示。所有指令的定義都在lopcodes.h文件中(可以從Lua 官方網站下
載),使用一個enum OpCode代表指令類型。在lua5.2中,總共有40種指令(id從0到39)。根據指令參數的不同,可以將所有指令分為4
類:

typedef enum {
/*----------------------------------------------------------------------
name args description

------------------------------------------------------------------------*/
OP_MOVE,/* A B R(A) := R(B) */
OP_LOADK,/* A Bx R(A) := Kst(Bx) */
OP_LOADKX,/* A R(A) := Kst(extra arg) */
OP_LOADBOOL,/* A B C R(A) := (Bool)B; if (C) pc++ */
OP_LOADNIL,/* A B R(A), R(A+1), ..., R(A+B) := nil */
OP_GETUPVAL,/* A B R(A) := UpValue[B] */

OP_GETTABUP,/* A B C R(A) := UpValue[B][RK(C)] */
OP_GETTABLE,/* A B C R(A) := R(B)[RK(C)] */

OP_SETTABUP,/* A B C UpValue[A][RK(B)] := RK(C) */
OP_SETUPVAL,/* A B UpValue[B] := R(A) */
OP_SETTABLE,/* A B C R(A)[RK(B)] := RK(C) */

OP_NEWTABLE,/* A B C R(A) := {} (size = B,C) */

OP_SELF,/* A B C R(A+1) := R(B); R(A) := R(B)[RK(C)] */

OP_ADD,/* A B C R(A) := RK(B) + RK(C) */
OP_SUB,/* A B C R(A) := RK(B) - RK(C) */
OP_MUL,/* A B C R(A) := RK(B) * RK(C) */
OP_DIV,/* A B C R(A) := RK(B) / RK(C) */
OP_MOD,/* A B C R(A) := RK(B) % RK(C) */
OP_POW,/* A B C R(A) := RK(B) ^ RK(C) */
OP_UNM,/* A B R(A) := -R(B) */
OP_NOT,/* A B R(A) := not R(B) */
OP_LEN,/* A B R(A) := length of R(B) */

OP_CONCAT,/* A B C R(A) := R(B).. ... ..R(C) */

OP_JMP,/* A sBx pc+=sBx; if (A) close all upvalues >= R(A) + 1 */
OP_EQ,/* A B C if ((RK(B) == RK(C)) ~= A) then pc++ */
OP_LT,/* A B C if ((RK(B) < RK(C)) ~= A) then pc++ */
OP_LE,/* A B C if ((RK(B) <= RK(C)) ~= A) then pc++ */

OP_TEST,/* A C if not (R(A) <=> C) then pc++ */
OP_TESTSET,/* A B C if (R(B) <=> C) then R(A) := R(B) else pc++ */

OP_CALL,/* A B C R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */
OP_TAILCALL,/* A B C return R(A)(R(A+1), ... ,R(A+B-1)) */
OP_RETURN,/* A B return R(A), ... ,R(A+B-2) (see note) */

OP_FORLOOP,/* A sBx R(A)+=R(A+2);
if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/
OP_FORPREP,/* A sBx R(A)-=R(A+2); pc+=sBx */

OP_TFORCALL,/* A C R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2)); */
OP_TFORLOOP,/* A sBx if R(A+1) ~= nil then { R(A)=R(A+1); pc += sBx }*/

OP_SETLIST,/* A B C R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B */

OP_CLOSURE,/* A Bx R(A) := closure(KPROTO[Bx]) */

OP_VARARG,/* A B R(A), R(A+1), ..., R(A+B-2) = vararg */

OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */
} OpCode;

**********************************************************
虛擬機指令(2) MOVE & LOAD

OP_MOVE A B
OP_MOVE用來將寄存器B中的值拷貝到寄存器A中,由於Lua是基於寄存器虛擬機,大部分的指令都是直接對寄存器進行操作,而不需要對數據進行壓棧和彈棧。OP_MOVE 指令的作用 是將一個Local變數復制給另一個local變數.
例子:
local a = 10;
local b = a;
編譯出來的結果
1 [1] LOAD 0 1;1代表的是常量表的項,這里代表的是10
2 [2] MOVE 1 0
所代表的二進制為
B A OP_Code
Load 0 1 = 100000000 000000000 00000000 000001 = 0x80000001 ,
也就是說, 0x80000001 的二進制所代表的指令為 Load 0 1,這里B中的最高位為1,表示的B為常量表的序號,而不是寄存器

MOVE 1 0 = 000000000 000000000 00000001 000000 = 0x40

*****************華麗分割線***********************************************
1.lua 的二進制格式,官方的luac.exe 編譯出來的格式

原始的lua 腳本
local a = 10
local b = a
print(b)

下面介紹格式文件,介紹每個欄位的意思.當然啦,這種格式是官方的,各個游戲公司可能會做一些改動,但是萬變不離其宗。個個欄位已經用顏色標明了
在lua 的源文件中,前面四個位元組 1b 4c 75 61 也就是 \033Lua , 標識的是lua文件的特有的標示符數據格式,代表是lua
#define LUA_SIGNATURE "\033Lua" 033時八進制 = 0x1b ,很多那些反編譯工具判斷這四個位元組的值,來判斷是否能反編譯,很多公司都會偷偷的去掉或者用其他的值來替換,以迷惑菜鳥。呵呵

52 第五個位元組,表示的是,當前lua 的目標版本,這里指的是5.2 版本。
感覺編輯的好痛苦,我還是直接貼我的比較圖算了,看起來比較舒服

函數的頭描述
linedefined = 00 00 00 00 ;函數定義開始處的行號
linedefined = 00 00 00 00 ; 函數定義結束處的行號 ;頂級函數開始和結束行號都是為00
numparams = 00 ;固定參數的數目 number of fixed parameters
is_vararg = 01 ;可變參數標識符
• 1=VARARG_HASARG
• 2=VARARG_ISVARARG
• 4=VARARG_NEEDSARG
maxstacksize = 03 ;調用函數所需要的堆棧空間指令段
sizecode = 06 00 00 00 ; 函數中 指令的數目,緩存區的大小 = sizecode * sizeof(Instruction),每四個位元組為一條指令
code = 02 00 00 00 41 00 00 00 87 40 40 00 c1 00 80 00 a0 40 00 01 1e 00 80 00

常量列表 保存著函數中引用的常量的列表 (常量池)
Constant.sizek = 02 00 00 00 ;常量列表的大小 ,緩存區的大小 = Constant.sizek * sizeof(TValue) = 2 * 8 = 16,每項為8個位元組,
TValue * = 03 00 00 .
00 00 00 00 24 40 04 06 00 00 00 70 72 69 6e 74 [email protected]
Constant list 數據結構 保存著函數中引用的常量的列表 (常量池)
Integer 常量列表的大小 (sizek)
[
1 byte 常量類型 (value in parentheses): • 0=LUA_TNIL, 1=LUA_TBOOLEAN,• 3=LUA_TNUMBER, 4=LUA_TSTRING
Const 常量本身: 如果常量類型是0這個域不存在;如果類型是1,這個是0或1;如果類型是3這個域是 Number;如果類型是4 這個域是String。
]
這里的String 是包含"0"為結束的字元串

為什麼上傳圖片以後,圖片都變小了,而且不清晰呢?

***********************給大家發一點福利,矯正虛擬機指令的函數**************************************
//矯正虛擬機指令
DWORD Rectify(DWORD Source);
{
DWORD Instruction = Source;
BYTE Source_OpCode = Instruction & 0x3F;
switch(Source_OpCode)
{
case OP_MOVE:
Source_OpCode = Target_OpCode;
break;
...
}
Instruction = ((Instruction & 0xFFFFFFC0) | Source_OpCode);
return Instruction
}

Ⅲ lua 怎麼反編譯

lua源文件--obfuscate-->lua源文件(混淆後)--compile-->luac文件(帶調試用的變數名和行號)--strip-->luac文件(不帶調試信息)
lua/luac--加密/打包-->數據文件

數據文件--解包/解密-->lua/luac-->lua虛擬機

1. 跟蹤,脫殼,解包,解密,獲得 luac

追 luaL_loadbuffer luaL_loadfile lua_load 應該可以找到 解密函數。
hook 這3個函數,導出解密後的數據,直接就是 luac 文件。如果沒編譯甚至是 lua源文件。

hook luaV_execute 可以拿到 Proto* ,想辦法用 luaU_mp 導出。luaD_precall 應該沒必要搞。

2. 非標准 luac 處理

我們有兩種方案來處理得到的 luac

1. 得到一個能夠執行上述非標 luac 的 lua 版本
搞清楚編譯方式,改 lua 源文件,編譯出一個,這樣做什麼都可以,還能編譯出對應的 luadec 。
如果能找到 lua51.dll 之類的就直接調用吧。但是,只能用於導出 luac 對比文件格式,或者執行找到的幾個關鍵函數。
2. 將非標 luac 轉換成標准格式 luac,正所謂:山不來就我,我便去就山
非標准 luac 是怎麼做的:

1. bad header 改文件頭
#define LUA_SIGNATURE "\033Lua" // lua.h
2. bad header 改數據類型
// luaconf.h
#define LUA_NUMBER_DOUBLE
#define LUA_NUMBER double
LUA_NUMBER to float
LUA_NUMBER_SCAN to "%f"
LUA_NUMBER_FMT to "%.7g"
l_mathop(x) to (x##f)
lua_str2number to use strtof

3. bad code OpCode 重定義
// 改有 "ORDER OP" 的地方
/* grep "ORDER OP" if you change these enums */
enum OpCode; // lopcodes.h
const lu_byte luaP_opmodes[]; // lopcodes.c
const char *const luaP_opnames[]; // lopcodes.c
http://lua-users.org/wiki/CnumberPatch

生成一個被破解程序可以執行的 luac 文件用於對比,分析格式
想辦法執行下面的代碼,編譯 allopcodes.lua 並導出, 與標准 lua 編譯相同源文件生成的進行對比。

1. 在 C 內導出
lua_State* L = luaL_newstate();
luaL_loadbuffer or luaL_loadstring or luaL_loadfile
Closure* c=(Closure*)lua_topointer(L, -1);
Proto* f = c->l.p;//Closure如果改了偏移會不同
luaU_mp(L, f, writer, D, 0);//非導出函數
lua_close(L);
2. 用 lua 導出到文件或者string
lua_State* L = luaL_newstate();
luaopen_string(L);
luaopen_io(L);
luaL_dostring or luaL_dofile
char* str = lua_tostring(L, -1);
lua_close(L);
-- luaopen_string 此庫必須打開
allopcodes() allopcodes.lua文件內容 end
chunk = string.mp(allopcodes)
if luaopen_io then --如果 io 可用,則可以直接寫文件
file:write(chunk)
else
output(chunk,to_any_where) --想辦法把 chunk 搞出來
return chunk
end
3. 位元組碼反匯編,閱讀

4. 反編譯

5. 二進制編輯,修改指令,替換函數

Ⅳ 用jni寫的安卓應用能被反編譯嗎

反編譯是可以的。
但是由於c語言代碼的可讀性本身就很大,反編譯後不可能像java一樣回歸原來的源碼的,反編譯的代碼時沒有數據類型的,所有的數據類型,甚至指針都變成了int類型,c語言的反編譯基本上就可以忽略的功效基本上就可以忽略其功效。

Ⅳ java強制類型轉換:int i = (int)obj轉換過程是怎樣的

因為有Integer這個包裝類,

如圖是使用javap -c xx.class命令查看的反編譯代碼,Obj 1 = 1;其實是Obj 1 = Integer.valueOf(1);obj轉int其實是obj轉Integer再調用intvalue()方法轉換成int類型

Ⅵ java反編譯

如今JAVA語言在全世界范圍正如火如荼般的流行,它廣范地應用在INTERNET的資料庫、多媒體、CGI、及動態網頁的製作方面。1999年在美國對JAVA程序員的需求量首次超過C++!

作者因最近分析一些JAVA程序,對JAVA的反編譯進行了一番了解,下面將我所了解的情況作以下介紹,希望對JAVA愛好者有所幫助。

JAVA是採用一種稱做「位元組編碼」的程序結構,分為小程序(嵌入到HTML文件中)和應用程序(直接在命令狀態下執行)兩種類型。無論哪種結構,一旦用JAVAC 命令編譯後,均變成後綴為CLASS的同名可執行文件。這種文件是不可閱讀的代碼。

經查閱了SUN公司的JDK(JDK1.1.3)文檔資料後,我找到了一個據稱是可反編譯JAVA的JAVAP文件(EXE),這個文件位於\JDK\BIN\ 下面,經按說明使用後,感到失望,原來這個「反編譯」僅可反編譯出JAVA程序的數據區(定義)、若干方法和類的引用等。

這里我用了一個簡單例子來說明問題。

JAVA的源程序hello_java.java如下:

import java.applet.*;
import java.awt.*;
public class hello_java extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello Java!\n",20,20);
}
}

經用反編譯命令:javap -c -package -public -private hello_java hello.java

得到的反編譯結果(hello.java)如下:(有關javap命令的選擇參數請見其使用說明,這里-c表示選擇了反編譯)

Compiled from hello_java.java
public synchronized class hello_java extends java.applet.Applet
/* ACC_SUPER bit set */
{
public void paint(java.awt.Graphics);
public hello_java();
Method void paint(java.awt.Graphics)
0 aload_1
1 ldc #1
3 bipush 20
5 bipush 20
7 invokevirtual #6
10 return
Method hello_java()
0 aload_0
1 invokespecial #5 ()V>
4 return
}

Ⅶ 我自己做出來的E程序 用E-Code Explorer來反編譯 為什麼不可以

生成的程序是不能看到源代碼的,不過可以看到那個程序的資源,用E-Code Explorer 反匯編調試由易語言編譯生成的易格式可執行文件,分析內部結構,查看其中的各項數據。1。格式分析:分析易格式可執行文件的總體結構,查看對應項的數據。分別對PE骨骼(PE頭)和易格式原體分析,以樹形結構清晰的顯示,同時輔以詳細的分析表格。2。反匯編分析:快速的靜態反匯編易格式可執行文件。提供方便的跳轉、調用目標地址的代碼預覽功能。3。窗體分析:對易格式可執行文件中包含的窗體數據分析。以樹型結構清晰的顯示窗體單元的從屬結構。詳細的控制項屬性顯示、准確的事件處理函數定位、與反匯編模式便捷的切換,讓使用者可以立即進入要調試的事件函數領空,避免在runtime的空間里四處打轉浪費時間。這一點對於調試非線性事件驅動類型的程序是必須的。4。符號修飾:可以調用易語言支持庫作為符號表,對反匯編後的代碼進行修飾,可以直接分析出函數所調用的方法,操作的屬性,使用到的常量、基本數據類型、自定義數據類型和窗口單元。極大地提高了代碼的可讀性。5。內部數據分析:能夠分析出程序使用到的常量、API函數、服務,調用的支持庫。6。多種載入方式:支持從文件載入和從某一進程的內存中直接載入反匯編。直接從進程列表附加,可以避免一部分AntiDebug造成的調試困難。7。支持多種格式:支持標准PE可執行文件,易格式原體文件,其他類型的易格式文件。均可正確分析。8。易格式捕捉者:對於不明外殼的易格式可執行文件(如:加殼後的,通過其它手段封裝的),能夠方便快速的進行分析。9。提供十六進制文件查看功能。10。提供多種輔助工具,完成從內存mp易格式原體、修復重定位信息、易格式原體生成EXE文件等功能。11。分析結果和反匯編結果均可直接導出生成報告文件。12。支持自定義反匯編,HEX查看的環境顏色,你可以選擇自己喜歡的顏色來閱讀代碼。13。詳細的分析設置,可以自己設置最合適的調試環境。14。提供文件拖放功能,直接進行分析或調試。15。支持從命令行獲取要分析的文件。其他更多的功能等待您在使用中發現…………

熱點內容
為什麼開鎖人不建議安裝密碼鎖 發布:2025-07-20 22:41:56 瀏覽:253
phpsocketlisten 發布:2025-07-20 22:39:07 瀏覽:428
絕地求生未來之役要下什麼伺服器 發布:2025-07-20 22:34:26 瀏覽:66
linux對比工具 發布:2025-07-20 22:31:45 瀏覽:750
音樂緩存在什麼文件夾 發布:2025-07-20 22:31:40 瀏覽:817
ftp伺服器怎麼清理 發布:2025-07-20 22:08:26 瀏覽:3
點膠緩存機 發布:2025-07-20 22:06:45 瀏覽:737
手機存儲已損壞 發布:2025-07-20 21:51:00 瀏覽:54
安卓手機存儲卡格式化 發布:2025-07-20 21:18:57 瀏覽:249
小廠編程 發布:2025-07-20 21:17:24 瀏覽:798